chrisbryan17's picture
Upload folder using huggingface_hub
d2897cd verified
//CampaignBundle
/**
* Setup the campaign view
*
* @param container
*/
Mautic.campaignOnLoad = function (container, response) {
Mautic.lazyLoadContactListOnCampaignDetail();
if (mQuery(container + ' #list-search').length) {
Mautic.activateSearchAutocomplete('list-search', 'campaign');
}
if (mQuery('#CampaignEventPanel').length) {
var tooltipTimeout = null;
// setup button clicks
mQuery('#CampaignEventPanelGroups button').on('click', function() {
var eventType = mQuery(this).data('type');
Mautic.campaignBuilderUpdateEventList([eventType], false, 'lists', true);
});
mQuery('#CampaignEventPanelLists button').on('click', function() {
Mautic.campaignBuilderUpdateEventList(Mautic.campaignBuilderAnchorClickedAllowedEvents, true, 'groups', true);
});
// set hover and double click functions for the event buttons
if (!(mQuery('.preview').length)) {
mQuery('#CampaignCanvas .list-campaign-event, #CampaignCanvas .list-campaign-source').off('.eventbuttons')
.on('mouseover.eventbuttons', function() {
mQuery(this).find('.campaign-event-buttons').removeClass('hide');
})
.on('mouseout.eventbuttons', function() {
mQuery(this).find('.campaign-event-buttons').addClass('hide');
})
.on('dblclick.eventbuttons', function(event) {
event.preventDefault();
mQuery(this).find('.btn-edit').first().click();
});
} else {
mQuery("#CampaignCanvas div.list-campaign-event").each(function () {
var thisId = mQuery(this).attr('id');
var option = mQuery('#'+thisId+' option[value="' + mQuery(this).val() + '"]');
});
}
// setup chosen
mQuery('.campaign-event-selector').on('chosen:showing_dropdown', function (event) {
// Disable canvas scrolling
mQuery('.builder-content').css('overflow', 'hidden');
var thisSelect = mQuery(event.target).attr('id');
Mautic.campaignBuilderUpdateEventListTooltips(thisSelect, false);
mQuery('#'+thisSelect+'_chosen .chosen-search input').on('keydown.tooltip', function () {
// Destroy tooltips that are filtered out
Mautic.campaignBuilderUpdateEventListTooltips(thisSelect, true);
}).on('keyup.tooltip', function() {
// Recreate tooltips for those left
if (tooltipTimeout) {
clearTimeout(tooltipTimeout);
}
// wrap into setTimeout for fast typing users.
tooltipTimeout = setTimeout(function () {
Mautic.campaignBuilderUpdateEventListTooltips(thisSelect, false);
}, 200);
});
});
mQuery('.campaign-event-selector').on('chosen:hiding_dropdown', function (event) {
// Re-enable canvas scrolling
mQuery('.builder-content').css('overflow', 'auto');
var thisSelect = mQuery(event.target).attr('id');
Mautic.campaignBuilderUpdateEventListTooltips(thisSelect, true);
mQuery('#'+thisSelect+'_chosen .chosen-search input').off('keyup.tooltip')
.off('keydown.tooltip');
});
mQuery('.campaign-event-selector').on('change', function() {
// Hide events list
if (!mQuery('#CampaignEvent_newsource').length) {
Mautic.hideCampaignEventPanel();
}
// Get the option clicked
var thisId = mQuery(this).attr('id');
var option = mQuery('#'+thisId+' option[value="' + mQuery(this).val() + '"]');
if (option.attr('data-href') && Mautic.campaignBuilderAnchorNameClicked) {
var updatedUrl = option.attr('data-href').replace(/anchor=(.*?)$/, "anchor=" + Mautic.campaignBuilderAnchorNameClicked + "&anchorEventType=" + Mautic.campaignBuilderAnchorEventTypeClicked);
// Replace the anchor in the URL with that clicked
option.attr('data-href', updatedUrl);
}
// Deactivate chosen to kill tooltips
mQuery('#'+thisId).trigger('chosen:close');
// Display the modal with form
Mautic.ajaxifyModal(option);
// Reset the dropdown
mQuery(this).val('');
mQuery(this).trigger('chosen:updated');
});
mQuery('#CampaignCanvas').on('click', function(event) {
if (!mQuery(event.target).parents('#CampaignCanvas').length && !mQuery('#CampaignEvent_newsource').length) {
Mautic.hideCampaignEventPanel();
}
});
const $flashes = mQuery('#flashes');
const $builder = mQuery('#campaign-builder');
$builder.on('campaign-builder:show', function () {
$builder.addClass('builder-active').removeClass('hide');
$flashes.addClass('alert-offset');
});
$builder.on('campaign-builder:hide', function () {
$builder.addClass('hide').removeClass('builder-active');
$flashes.removeClass('alert-offset');
});
Mautic.prepareCampaignCanvas();
// Open the builder directly when saved from the builder
if (response && response.inBuilder) {
Mautic.launchCampaignEditor();
Mautic.processBuilderErrors(response);
}
// update the cloned event info when storage is updated from different tab
window.addEventListener('storage', function(event) {
if (event.key === 'mautic_campaign_event_clone') {
Mautic.campaignBuilderUpdateEventCloneDescription();
}
});
mQuery(document).ajaxError(function(event, jqxhr, settings, thrownError) {
var path = settings.url.split('?')[0];
if (path === "/s/campaigns/events/insert") {
Mautic.campaignEventInsertOnError(event, jqxhr);
}
});
}
};
Mautic.lazyLoadContactListOnCampaignDetail = function() {
let containerId = '#leads-container';
let container = mQuery(containerId);
// Load the contacts only if the container exists.
if (!container.length) {
return;
}
let campaignContactUrl = container.data('target-url');
mQuery.get(campaignContactUrl, function(response) {
response.target = containerId;
Mautic.processPageContent(response);
});
};
/**
* Update chosen tooltips
*
* @param theSelect
* @param onlyDestroy
*/
Mautic.campaignBuilderUpdateEventListTooltips = function(theSelect, onlyDestroy) {
const $select = mQuery('#'+theSelect);
const dataAttribute = 'tooltips';
// create a stack
if (undefined === $select.data(dataAttribute)) {
$select.data(dataAttribute, []);
}
// remove existing tooltips before we create new ones.
const tooltips = $select.data(dataAttribute);
mQuery.each(tooltips, function (index, $tooltip) {
if (undefined === $tooltip) {
return;
}
$tooltip.tooltip('hide');
$tooltip.tooltip('destroy');
});
$select.data(dataAttribute, []);
if (true === onlyDestroy) {
return;
}
// create tooltips.
$select.find('option').each(function () {
if (mQuery(this).attr('id')) {
// Initiate a tooltip on each option since chosen doesn't copy over the data attributes
const chosenOption = '#' + theSelect + '_chosen .option_' + mQuery(this).attr('id');
const $tooltip = mQuery(chosenOption).tooltip({html: true, container: 'body', placement: 'left'});
$select.data(dataAttribute).push($tooltip);
}
});
}
/**
* Delete the builder instance so it's regenerated when reopening the campaign event builder
*/
Mautic.campaignOnUnload = function(container) {
delete Mautic.campaignBuilderInstance;
delete Mautic.campaignBuilderLabels;
}
Mautic.campaignEventCloneOnLoad = function(container, response) {
Mautic.setCampaignEventClone({
'sourceEventName': response['eventName'],
'sourceEventType': response['eventType'],
'sourceType': response['type'],
'sourceCampaignId': response['campaignId'],
'sourceCampaignName': response['campaignName'],
});
const flashMessage = Mautic.addInfoFlashMessage(Mautic.translate('mautic.campaign.event.clone.success'));
Mautic.setFlashes(flashMessage);
Mautic.campaignBuilderUpdateEventCloneDescription();
};
Mautic.campaignEventInsertOnError = function (event, jqxhr) {
Mautic.clearCampaignEventClone();
Mautic.hideCampaignEventPanel();
if (jqxhr.responseJSON.error) {
const flashMessage = Mautic.addErrorFlashMessage(jqxhr.responseJSON.error);
Mautic.setFlashes(flashMessage);
}
};
/**
* Setup the campaign event view
*
* @param container
* @param response
*/
Mautic.campaignEventOnLoad = function (container, response) {
if (mQuery('#campaignevent_triggerHour').length) {
Mautic.campaignEventUpdateIntervalHours();
mQuery('#campaignevent_triggerHour').on('change', Mautic.campaignEventUpdateIntervalHours);
mQuery('#campaignevent_triggerRestrictedStartHour').on('change', Mautic.campaignEventUpdateIntervalHours);
mQuery('#campaignevent_triggerRestrictedStopHour').on('change', Mautic.campaignEventUpdateIntervalHours);
mQuery('#campaignevent_triggerRestrictedDaysOfWeek_0').on('change', Mautic.campaignEventSelectDOW);
mQuery('#campaignevent_triggerRestrictedDaysOfWeek_1').on('change', Mautic.campaignEventSelectDOW);
mQuery('#campaignevent_triggerRestrictedDaysOfWeek_2').on('change', Mautic.campaignEventSelectDOW);
mQuery('#campaignevent_triggerRestrictedDaysOfWeek_3').on('change', Mautic.campaignEventSelectDOW);
mQuery('#campaignevent_triggerRestrictedDaysOfWeek_4').on('change', Mautic.campaignEventSelectDOW);
mQuery('#campaignevent_triggerRestrictedDaysOfWeek_7').on('change', Mautic.campaignEventSelectDOW);
}
if (!response.hasOwnProperty('eventId')) {
// There's nothing for us to do, so bail
return;
}
// New action created so append it to the form
var domEventId = 'CampaignEvent_' + response.eventId;
var eventId = '#' + domEventId;
Mautic.campaignBuilderLabels[domEventId] = (response.label) ? response.label : '';
if (!response.success && Mautic.campaignBuilderConnectionRequiresUpdate) {
// Modal exited - check to see if a connection needs to be removed
Mautic.campaignBuilderInstance.deleteConnection(Mautic.campaignBuilderLastConnection);
}
Mautic.campaignBuilderConnectionRequiresUpdate = false;
Mautic.campaignBuilderUpdateLabel(domEventId);
Mautic.campaignBuilderCanvasEvents[response.event.id] = response.event;
if (response.deleted) {
Mautic.campaignBuilderInstance.remove(document.getElementById(domEventId));
delete Mautic.campaignBuilderEventPositions[domEventId];
delete Mautic.campaignBuilderCanvasEvents[response.event.id];
} else if (response.updateHtml) {
mQuery(eventId + " .campaign-event-content").replaceWith(response.updateHtml);
} else if (response.eventHtml) {
var newHtml = response.eventHtml;
//append content
var x = parseInt(mQuery('#droppedX').val());
var y = parseInt(mQuery('#droppedY').val());
Mautic.campaignBuilderEventPositions[domEventId] = {
'left': x,
'top': y
};
mQuery(newHtml).appendTo('#CampaignCanvas');
mQuery(eventId).css({'left': x + 'px', 'top': y + 'px'});
Mautic.campaignBuilderRegisterAnchors(Mautic.getAnchorsForEvent(response.event), eventId);
Mautic.campaignBuilderInstance.draggable(domEventId, Mautic.campaignDragOptions);
//activate new stuff
mQuery(eventId + " a[data-toggle='ajax']").click(function (event) {
event.preventDefault();
return Mautic.ajaxifyLink(this, event);
});
//initialize ajax'd modals
mQuery(eventId + " a[data-toggle='ajaxmodal']").on('click.ajaxmodal', function (event) {
event.preventDefault();
Mautic.ajaxifyModal(this, event);
});
mQuery(eventId).off('.eventbuttons')
.on('mouseover.eventbuttons', function() {
mQuery(this).find('.campaign-event-buttons').removeClass('hide');
})
.on('mouseout.eventbuttons', function() {
mQuery(this).find('.campaign-event-buttons').addClass('hide');
})
.on('dblclick.eventbuttons', function(event) {
event.preventDefault();
mQuery(this).find('.btn-edit').first().click();
});
//initialize tooltips
mQuery(eventId + " *[data-toggle='tooltip']").tooltip({html: true});
// Connect into last anchor clicked
Mautic.campaignBuilderInstance.connect({
uuids: [
Mautic.campaignBuilderAnchorClicked,
domEventId+'_top'
]
});
}
if (response.hasOwnProperty('clearCloneStorage')) {
Mautic.hideCampaignEventPanel();
Mautic.clearCampaignEventClone();
}
Mautic.campaignBuilderInstance.repaintEverything();
};
/**
* Update the trigger hour based on the interval unit selected
*/
Mautic.campaignEventUpdateIntervalHours = function () {
var hour = mQuery('#campaignevent_triggerHour').val();
var start = mQuery('#campaignevent_triggerRestrictedStartHour').val();
var stop = mQuery('#campaignevent_triggerRestrictedStopHour').val();
if (hour) {
mQuery('#campaignevent_triggerRestrictedStartHour').val('');
mQuery('#campaignevent_triggerRestrictedStopHour').val('');
mQuery('#campaignevent_triggerRestrictedStartHour').prop('disabled', true);
mQuery('#campaignevent_triggerRestrictedStopHour').prop('disabled', true);
} else if (start || stop) {
mQuery('#campaignevent_triggerHour').val('');
mQuery('#campaignevent_triggerHour').prop('disabled', true);
} else {
mQuery('#campaignevent_triggerHour').val('');
mQuery('#campaignevent_triggerRestrictedStartHour').val('');
mQuery('#campaignevent_triggerRestrictedStopHour').val('');
mQuery('#campaignevent_triggerHour').prop('disabled', false);
mQuery('#campaignevent_triggerRestrictedStartHour').prop('disabled', false);
mQuery('#campaignevent_triggerRestrictedStopHour').prop('disabled', false);
}
};
/**
* Update DOW for weekday selection
*/
Mautic.campaignEventSelectDOW = function() {
if (mQuery('#campaignevent_triggerRestrictedDaysOfWeek_7').prop('checked')) {
mQuery('#campaignevent_triggerRestrictedDaysOfWeek_0').prop('checked', true);
mQuery('#campaignevent_triggerRestrictedDaysOfWeek_1').prop('checked', true);
mQuery('#campaignevent_triggerRestrictedDaysOfWeek_2').prop('checked', true);
mQuery('#campaignevent_triggerRestrictedDaysOfWeek_3').prop('checked', true);
mQuery('#campaignevent_triggerRestrictedDaysOfWeek_4').prop('checked', true);
}
mQuery('#campaignevent_triggerRestrictedDaysOfWeek_7').prop('checked', false);
};
/**
* Determine anchors to set up for the given event.
*
* This inspects the `connectionRestrictions` property
* within the event's settings that were passed when
* registering the event in your bundle's CampaignEventListener.
*
* @param event
*/
Mautic.getAnchorsForEvent = function (event) {
var restrictions = Mautic.campaignBuilderConnectionRestrictions[event.type].target;
// If all connections are restricted, only anchor the top
if (
restrictions.decision.length === 1 && restrictions.decision[0] === "none" &&
restrictions.action.length === 1 && restrictions.action[0] === "none" &&
restrictions.condition.length === 1 && restrictions.condition[0] === "none"
) {
return ['top'];
}
if (event.eventType === 'decision' || event.eventType === 'condition') {
return ['top', 'yes', 'no'];
}
return ['top', 'bottom'];
};
/**
* Setup the campaign source view
*
* @param container
* @param response
*/
Mautic.campaignSourceOnLoad = function (container, response) {
//new action created so append it to the form
var domEventId = 'CampaignEvent_' + response.sourceType;
var eventId = '#' + domEventId;
if (response.deleted) {
Mautic.campaignBuilderInstance.remove(document.getElementById(domEventId));
delete Mautic.campaignBuilderEventPositions[domEventId];
mQuery('#campaignLeadSource_' + response.sourceType).prop('disabled', false);
mQuery('#SourceList').trigger('chosen:updated');
// Check to see if all sources have been deleted
if (!mQuery('.list-campaign-source:not(#CampaignEvent_newsource_hide)').length) {
mQuery('#CampaignEvent_newsource_hide').attr('id', 'CampaignEvent_newsource');
Mautic.campaignBuilderPrepareNewSource();
}
} else if (response.updateHtml) {
mQuery(eventId + " .campaign-event-content").html(response.updateHtml);
} else if (response.sourceHtml) {
mQuery('#campaignLeadSource_' + response.sourceType).prop('disabled', true);
mQuery('#SourceList').trigger('chosen:updated');
var newHtml = response.sourceHtml;
if (mQuery('#CampaignEvent_newsource').length) {
var x = mQuery('#CampaignEvent_newsource').position().left;
var y = mQuery('#CampaignEvent_newsource').position().top;
mQuery('#CampaignEvent_newsource').attr('id', 'CampaignEvent_newsource_hide');
Mautic.hideCampaignEventPanel();
var autoConnect = false;
} else {
//append content
var x = parseInt(mQuery('#droppedX').val());
var y = parseInt(mQuery('#droppedY').val());
var autoConnect = true;
}
mQuery(newHtml).appendTo('#CampaignCanvas');
Mautic.campaignBuilderEventPositions[domEventId] = {
'left': x,
'top': y
};
mQuery(eventId).css({'left': x + 'px', 'top': y + 'px'});
Mautic.campaignBuilderRegisterAnchors(['leadSource', 'leadSourceLeft', 'leadSourceRight'], eventId);
Mautic.campaignBuilderInstance.draggable(domEventId, Mautic.campaignDragOptions);
//activate new stuff
mQuery(eventId + " a[data-toggle='ajax']").click(function (event) {
event.preventDefault();
return Mautic.ajaxifyLink(this, event);
});
//initialize ajax'd modals
mQuery(eventId + " a[data-toggle='ajaxmodal']").on('click.ajaxmodal', function (event) {
event.preventDefault();
Mautic.ajaxifyModal(this, event);
});
mQuery(eventId).off('.eventbuttons')
.on('mouseover.eventbuttons', function() {
mQuery(this).find('.campaign-event-buttons').removeClass('hide');
})
.on('mouseout.eventbuttons', function() {
mQuery(this).find('.campaign-event-buttons').addClass('hide');
})
.on('dblclick.eventbuttons', function(event) {
event.preventDefault();
mQuery(this).find('.btn-edit').first().click();
});
//initialize tooltipslist-campaign-event
mQuery(eventId + " *[data-toggle='tooltip']").tooltip({html: true});
if (autoConnect) {
// Connect into last anchor clicked
if (Mautic.campaignBuilderAnchorClicked.search('left') !== -1) {
var source = domEventId + '_leadsourceright';
var target = Mautic.campaignBuilderAnchorClicked;
} else {
var source = Mautic.campaignBuilderAnchorClicked;
var target = domEventId + '_leadsourceleft';
}
Mautic.campaignBuilderInstance.connect({
uuids: [
source,
target
]
});
}
// If there are no other events, auto click add action
if (!mQuery('.list-campaign-event').length) {
mQuery('.jtk-endpoint_anchor_leadsource.'+domEventId).trigger('click');
}
}
Mautic.campaignBuilderInstance.repaintEverything();
};
/**
* Update a connectors label
*
* @param domEventId
*/
Mautic.campaignBuilderUpdateLabel = function (domEventId) {
var theLabel = typeof Mautic.campaignBuilderLabels[domEventId] == 'undefined' ? '' : Mautic.campaignBuilderLabels[domEventId];
var currentConnections = Mautic.campaignBuilderInstance.select({
target: domEventId
});
if (currentConnections.length > 0) {
currentConnections.each(function(conn) {
//remove current label
var overlays = conn.getOverlays();
if (overlays.length > 0) {
for (var i = 0; i <= overlays.length; i++ ) {
if ( typeof overlays[i] != 'undefined' && overlays[i].type == 'Label') {
conn.removeOverlay(overlays[i].id);
}
}
}
if (theLabel) {
conn.addOverlay(["Label", {
label: theLabel,
location: 0.65,
cssClass: "jtk-label",
id: conn.sourceId + "_" + conn.targetId + "_connectionLabel"
}]);
}
});
}
};
/**
* Launch campaign builder modal
*/
Mautic.launchCampaignEditor = function() {
Mautic.stopIconSpinPostEvent();
mQuery('body').css('overflow-y', 'hidden');
mQuery('#campaign-builder').trigger('campaign-builder:show');
// Center new source
if (mQuery('#CampaignEvent_newsource').length) {
Mautic.campaignBuilderPrepareNewSource();
}
if (Mautic.campaignBuilderCanvasSettings) {
Mautic.campaignBuilderInstance.setSuspendDrawing(true);
Mautic.campaignBuilderReconnectEndpoints();
Mautic.campaignBuilderInstance.setSuspendDrawing(false, true);
}
Mautic.campaignBuilderInstance.repaintEverything();
};
/**
* Launch campaign preview view
*/
Mautic.launchCampaignPreview = function() {
Mautic.stopIconSpinPostEvent();
if (Mautic.campaignBuilderCanvasSettings) {
Mautic.campaignBuilderInstance.setSuspendDrawing(true);
Mautic.campaignBuilderReconnectEndpoints();
Mautic.campaignBuilderInstance.setSuspendDrawing(false, true);
}
Mautic.campaignBuilderInstance.repaintEverything();
};
/**
*
* @type {{source: {leadsource: {source: Array, action: [*], condition: [*], decision: [*]}, leadsourceleft: {source: [*], action: Array, condition: Array, decision: Array}, leadsourceright: {source: [*], action: Array, condition: Array, decision: Array}}, action: {top: {source: [*], action: Array, condition: [*], decision: [*]}, bottom: {source: Array, action: Array, condition: [*], decision: [*]}}, condition: {top: {source: [*], action: [*], condition: [*], decision: [*]}, yes: {source: Array, action: [*], condition: [*], decision: [*]}, no: {source: Array, action: [*], condition: [*], decision: [*]}}, decision: {top: {action: [*], source: [*], condition: [*], decision: Array}, yes: {source: Array, action: [*], condition: [*], decision: Array}, no: {source: Array, action: [*], condition: [*], decision: Array}}}}
*/
Mautic.campaignBuilderConnectionsMap = {
// source
'source': {
// source anchors
'leadsource': {
// target
'source': [],
'action': ['top'], // target anchors
'condition': ['top'],
'decision': ['top'],
},
'leadsourceleft': {
'source': ['leadsourceright'],
'action': [],
'condition': [],
'decision': []
},
'leadsourceright': {
'source': ['leadsourceleft'],
'action': [],
'condition': [],
'decision': []
}
},
'action': {
'top': {
'source': ['leadsource'],
'action': ['bottom'],
'condition': ['yes', 'no'],
'decision': ['yes', 'no']
},
'bottom': {
'source': [],
'action': ['top'],
'condition': ['top'],
'decision': ['top']
}
},
'condition': {
'top': {
'source': ['leadsource'],
'action': ['bottom'],
'condition': ['yes', 'no'],
'decision': ['yes', 'no']
},
'yes': {
'source': [],
'action': ['top'],
'condition': ['top'],
'decision': ['top']
},
'no': {
'source': [],
'action': ['top'],
'condition': ['top'],
'decision': ['top']
}
},
'decision': {
'top': {
'action': ['bottom'],
'source': ['leadsource'],
'condition': ['yes', 'no'],
'decision': [],
},
'yes': {
'source': [],
'action': ['top'],
'condition': ['top'],
'decision': [],
},
'no': {
'source': [],
'action': ['top'],
'condition': ['top'],
'decision': [],
}
}
};
Mautic.campaignBuilderAnchorDefaultColor = '#d5d4d4';
Mautic.campaignEndpointDefinitions = {
'top': {
anchors: [0.5, 0, 0, -1, 0, 0],
isTarget: true
},
'bottom': {
anchors: [0.5, 1, 0, 1, 0, 0],
isTarget: false
},
'yes': {
anchors: [0, 1, 0, 1, 30, 0],
connectorColor: '#00b49c',
isTarget: false
},
'no': {
anchors: [1, 1, 0, 1, -30, 0],
connectorColor: '#f86b4f',
isTarget: false
},
'leadSource': {
anchors: [0.5, 1, 0, 1, 0, 0],
isTarget: false
},
'leadSourceLeft': {
anchors: [0, 0.5, -1, 0, -1, 0],
connectorColor: '#fdb933',
isTarget: true,
connectorStyle: 'Straight'
},
'leadSourceRight': {
anchors: [1, 0.5, 1, 0, 1, 0],
connectorColor: '#fdb933',
isTarget: false,
connectorStyle: 'Straight'
}
};
/**
* Push callbacks to these events
*
* @type {{connection: Array, connectionDetached: Array, connectionMoved: Array, beforeDrop: Array}}
*/
Mautic.campaignConnectionCallbacks = {
// sourceEndpoint, targetEndpoint, connection
'beforeDetach': [],
// sourceEndpoint, targetEndpoint, endpoint, source, sourceId
'beforeDrag': [],
// sourceEndpoint, targetEndpoint, endpoint, source, sourceId
'beforeStartDetach': [],
// sourceEndpoint, targetEndpoint, endpoint, source, sourceId, connection
'beforeDrop': [],
//sourceEndpoint, endpoint, event
'onHover': [],
// no arguments
'beforeAnchorsRegistered': [],
'afterAnchorsRegistered': [],
'beforeEndpointsRegistered': [],
'beforeEndpointsReconnected': [],
'afterEndpointsReconnected': []
};
Mautic.campaignBuilderAnchorClicked = false;
Mautic.campaignBuilderEventPositions = {};
Mautic.prepareCampaignCanvas = function() {
if (typeof Mautic.campaignBuilderInstance == 'undefined') {
Mautic.campaignBuilderInstance = jsPlumb.getInstance({
Container: document.querySelector("#CampaignCanvas")
});
Mautic.campaignEndpoints = {};
var startingPosition;
Mautic.campaignDragOptions = {
start: function (params) {
//double clicking activates the stop function so add a catch to prevent unnecessary ajax calls
startingPosition =
{
top: params.el.offsetTop,
left: params.el.offsetLeft,
};
},
stop: function (params) {
var endingPosition =
{
top: params.finalPos[0],
left: params.finalPos[1]
};
if (startingPosition.left !== endingPosition.left || startingPosition.top !== endingPosition.top) {
//update coordinates
Mautic.campaignBuilderEventPositions[mQuery(params.el).attr('id')] = {
'left': parseInt(endingPosition.left),
'top': parseInt(endingPosition.top)
};
var campaignId = mQuery('#campaignId').val();
var query = "action=campaign:updateCoordinates&campaignId=" + campaignId + "&droppedX=" + endingPosition.top + "&droppedY=" + endingPosition.left + "&eventId=" + mQuery(params.el).attr('id');
mQuery.ajax({
url: mauticAjaxUrl,
type: "POST",
data: query,
dataType: "json",
error: function (request, textStatus, errorThrown) {
Mautic.processAjaxError(request, textStatus, errorThrown);
}
});
}
},
containment:true
};
Mautic.campaignBuilderEventDimensions = {
'width': 200,
'height': 45,
'anchor': 10,
'wiggleWidth': 30,
'wiggleHeight': 50
};
// Store labels
Mautic.campaignBuilderLabels = {};
// Update the labels on connection/disconnection
Mautic.campaignBuilderInstance.bind("connection", function (info, originalEvent) {
// Mark the connection so it can be removed if the form is cancelled
Mautic.campaignBuilderConnectionRequiresUpdate = false;
Mautic.campaignBuilderLastConnection = info.connection;
// If there is a switch between active/inactive anchors, reload the form
var epDetails = Mautic.campaignBuilderGetEndpointDetails(info.sourceEndpoint);
var targetElementId = info.targetEndpoint.elementId;
var previousConnection = mQuery('#'+targetElementId).attr('data-connected');
var editButton = mQuery('#'+targetElementId).find('a.btn-edit');
var editUrl = editButton.attr('href');
if (editUrl) {
var anchorQueryParams = 'anchor=' + epDetails.anchorName + "&anchorEventType=" + epDetails.eventType;
if (editUrl.search('anchor=') !== -1) {
editUrl.replace(/anchor=(.*?)$/, anchorQueryParams);
} else {
var delimiter = (editUrl.indexOf('?') === -1) ? '?' : '&';
editUrl = editUrl + delimiter + anchorQueryParams;
}
editButton.attr('data-href', editUrl);
if (previousConnection && previousConnection != epDetails.anchorName && (previousConnection == 'no' || epDetails.anchorName == 'no')) {
editButton.attr('data-prevent-dismiss', true);
Mautic.campaignBuilderConnectionRequiresUpdate = true;
editButton.trigger('click');
}
}
mQuery('#'+targetElementId).attr('data-connected', epDetails.anchorName);
Mautic.campaignBuilderUpdateLabel(info.connection.targetId);
info.targetEndpoint.setPaintStyle(
{
fill: info.connection.getPaintStyle().stroke
}
);
info.sourceEndpoint.setPaintStyle(
{
fill: info.connection.getPaintStyle().stroke
}
);
});
Mautic.campaignBuilderInstance.bind("connectionDetached", function (info, originalEvent) {
Mautic.campaignBuilderUpdateLabel(info.connection.targetId);
info.targetEndpoint.setPaintStyle(
{
fill: "#d5d4d4"
}
);
var currentConnections = info.sourceEndpoint.connections.length;
// JavaScript counts index which still accounts for old connection
currentConnections -= 1;
if (!currentConnections) {
info.sourceEndpoint.setPaintStyle(
{
fill: "#d5d4d4"
}
);
}
});
Mautic.campaignBuilderInstance.bind("connectionMoved", function (info, originalEvent) {
Mautic.campaignBuilderUpdateLabel(info.connection.originalTargetId);
info.originalTargetEndpoint.setPaintStyle(
{
fill: "#d5d4d4"
}
);
Mautic.campaignBuilderUpdateLabel(info.connection.newTargetId);
info.newTargetEndpoint.setPaintStyle(
{
fill: info.newSourceEndpoint.getPaintStyle().fill
}
);
});
mQuery('.builder-content').scroll(function () {
Mautic.campaignBuilderInstance.repaintEverything();
});
mQuery.each(Mautic.campaignConnectionCallbacks.beforeEndpointsRegistered, function (index, callback) {
callback();
});
mQuery.each(Mautic.campaignEndpointDefinitions, function (ep, definition) {
Mautic.campaignBuilderRegisterEndpoint(ep, definition);
});
//manually loop through each so a UUID can be set for reconnecting connections
mQuery.each(Mautic.campaignConnectionCallbacks.beforeAnchorsRegistered, function (index, callback) {
callback();
});
mQuery("#CampaignCanvas div[data-event-id]").each(function () {
var event = Mautic.campaignBuilderCanvasEvents[mQuery(this).data('eventId')];
Mautic.campaignBuilderRegisterAnchors(Mautic.getAnchorsForEvent(event), this);
});
mQuery("#CampaignCanvas div.list-campaign-event.list-campaign-source").not('#CampaignEvent_newsource').not('#CampaignEvent_newsource_hide').each(function () {
Mautic.campaignBuilderRegisterAnchors(['bottom'], this);
});
mQuery("#CampaignCanvas div.list-campaign-leadsource").not('#CampaignEvent_newsource').not('#CampaignEvent_newsource_hide').each(function () {
Mautic.campaignBuilderRegisterAnchors(['leadSource', 'leadSourceLeft', 'leadSourceRight'], this);
});
mQuery.each(Mautic.campaignConnectionCallbacks.afterAnchorsRegistered, function (index, callback) {
callback();
});
if (mQuery('.preview').length) {
Mautic.launchCampaignPreview();
} else {
//enable drag and drop
Mautic.campaignBuilderInstance.draggable(
document.querySelectorAll("#CampaignCanvas .draggable"),
Mautic.campaignDragOptions
);
}
}
};
/**
* Validate a connection before it can be made
*
* @param params
* @returns {boolean}
*/
Mautic.campaignBeforeDropCallback = function(params) {
var sourceEndpoint = Mautic.campaignBuilderGetEndpointDetails(params.connection.endpoints[0]);
var targetEndpoint = Mautic.campaignBuilderGetEndpointDetails(params.dropEndpoint);
var callbackAllowed = null;
mQuery.each(Mautic.campaignConnectionCallbacks.beforeDrop, function(index, callback) {
var result = callback(sourceEndpoint, targetEndpoint, params);
if (null !== result) {
callbackAllowed = result;
return false;
}
});
if (null !== callbackAllowed) {
return callbackAllowed;
}
if (!Mautic.campaignBuilderValidateConnection(sourceEndpoint, targetEndpoint.eventType, targetEndpoint.event)){
return false;
}
if (mQuery.inArray(targetEndpoint.anchorName, ['top', 'leadsourceleft', 'leadsourceright'])) {
//ensure two events aren't looping
var sourceConnections = Mautic.campaignBuilderInstance.select({
source: params.targetId
});
var loopDetected = false;
sourceConnections.each(function (conn) {
if (conn.sourceId == targetEndpoint.elementId && conn.targetId == sourceEndpoint.elementId) {
loopDetected = true;
return false;
}
});
}
//ensure that the connections are not looping back into the same event
if (params.sourceId == params.targetId) {
return false;
}
// ensure the map allows this connection
var allowedConnections = Mautic.campaignBuilderConnectionsMap[sourceEndpoint.eventType][sourceEndpoint.anchorName][targetEndpoint.eventType];
var allowed = mQuery.inArray(targetEndpoint.anchorName, allowedConnections) !== -1;
if (allowed) {
//ensure that a top only has one connection at a time unless connected from a source
if (params.dropEndpoint.connections.length > 0) {
// Replace the connection
mQuery.each(params.dropEndpoint.connections, function(key, conn) {
Mautic.campaignBuilderInstance.deleteConnection(conn);
});
}
}
return allowed;
};
/**
* Process beforeDetach event callbacks
*
* @param connection
* @returns {*}
*/
Mautic.campaignBeforeDetachCallback = function(connection) {
var sourceEndpoint = Mautic.campaignBuilderGetEndpointDetails(connection.sourceId);
var targetEndpoint = Mautic.campaignBuilderGetEndpointDetails(connection.targetId);
var callbackAllowed = null;
mQuery.each(Mautic.campaignConnectionCallbacks.beforeDetach, function (index, callback) {
var result = callback(sourceEndpoint, targetEndpoint, connection);
if (null !== result) {
callbackAllowed = result;
return false;
}
});
if (null !== callbackAllowed) {
return callbackAllowed;
}
return true;
};
/**
* Process beforeDetach event callbacks
*
* @param connection
*/
Mautic.campaignBeforeDragCallback = function(endpoint, source, sourceId) {
var sourceEndpoint = Mautic.campaignBuilderGetEndpointDetails(sourceId);
var targetEndpoint = Mautic.campaignBuilderGetEndpointDetails(endpoint);
var callbackAllowed = null;
mQuery.each(Mautic.campaignConnectionCallbacks.beforeDrag, function (index, callback) {
var result = callback(sourceEndpoint, targetEndpoint, endpoint, source, sourceId);
if (null !== result) {
callbackAllowed = result;
return false;
}
});
if (null !== callbackAllowed) {
return callbackAllowed;
}
return true;
};
/**
* Process beforeDetach event callbacks
*
* @param endpoint
* @param source
* @param sourceId
* @param connection
* @returns {*}
*/
Mautic.campaignBeforeStartDetachCallback = function(endpoint, source, sourceId, connection) {
var sourceEndpoint = Mautic.campaignBuilderGetEndpointDetails(sourceId);
var targetEndpoint = Mautic.campaignBuilderGetEndpointDetails(endpoint);
var callbackAllowed = null;
mQuery.each(Mautic.campaignConnectionCallbacks.beforeStartDetach, function (index, callback) {
var result = callback(sourceEndpoint, targetEndpoint, endpoint, source, sourceId, connection);
if (null !== result) {
callbackAllowed = result;
return false;
}
});
if (null !== callbackAllowed) {
return callbackAllowed;
}
return true;
};
/**
* Process beforeDetach event callbacks
*
* @param connection
*/
Mautic.campaignHoverCallback = function(sourceEndpoint, endpoint, event) {
var callbackAllowed = null;
mQuery.each(Mautic.campaignConnectionCallbacks.onHover, function (index, callback) {
var result = callback(sourceEndpoint, endpoint, event);
if (null !== result) {
callbackAllowed = result;
return false;
}
});
if (null !== callbackAllowed) {
return callbackAllowed;
}
return true;
};
/**
* Enable/Disable timeframe settings if the toggle for immediate trigger is changed
*/
Mautic.campaignToggleTimeframes = function() {
if (mQuery('#campaignevent_triggerMode_2').length) {
var immediateChecked = mQuery('#campaignevent_triggerMode_0').prop('checked');
var intervalChecked = mQuery('#campaignevent_triggerMode_1').prop('checked');
var dateChecked = mQuery('#campaignevent_triggerMode_2').prop('checked');
} else {
var immediateChecked = false;
var intervalChecked = mQuery('#campaignevent_triggerMode_0').prop('checked');
var dateChecked = mQuery('#campaignevent_triggerMode_1').prop('checked');
}
if (mQuery('#campaignevent_triggerInterval').length) {
if (immediateChecked) {
mQuery('#triggerInterval').addClass('hide');
mQuery('#triggerDate').addClass('hide');
} else if (intervalChecked) {
mQuery('#triggerInterval').removeClass('hide');
mQuery('#triggerDate').addClass('hide');
} else if (dateChecked) {
mQuery('#triggerInterval').addClass('hide');
mQuery('#triggerDate').removeClass('hide');
}
}
};
/**
* Close campaign builder
*/
Mautic.closeCampaignBuilder = function() {
// Disable buttons
mQuery('.btns-builder').find('button').prop('disabled', true);
var builderCss = {
margin: "0",
padding: "0",
border: "none",
width: "100%",
height: "100%"
};
var panelHeight = (mQuery('.builder-content').css('right') == '0px') ? mQuery('.builder-panel').height() : 0,
panelWidth = (mQuery('.builder-content').css('right') == '0px') ? 0 : mQuery('.builder-panel').width(),
spinnerLeft = (mQuery(window).width() - panelWidth - 60) / 2,
spinnerTop = (mQuery(window).height() - panelHeight - 60) / 2;
var overlay = mQuery('<div id="builder-overlay" class="modal-backdrop fade in"><div style="position: absolute; top:' + spinnerTop + 'px; left:' + spinnerLeft + 'px" class=".builder-spinner"><i class="fa fa-spinner fa-spin fa-5x"></i></div></div>').css(builderCss).appendTo('.builder-content');
mQuery('#builder-errors').hide('fast').text('');
Mautic.updateConnections(function(err, response) {
mQuery('body').css('overflow-y', '');
if (!err) {
mQuery('#builder-overlay').remove();
mQuery('body').css('overflow-y', '');
if (response.success) {
mQuery('#campaign-builder').trigger('campaign-builder:hide');
// Enable buttons
mQuery('.btns-builder').find('button').prop('disabled', false);
}
}
});
};
Mautic.saveCampaignFromBuilder = function() {
// Disable buttons
mQuery('.btns-builder').find('button').prop('disabled', true);
Mautic.activateButtonLoadingIndicator(mQuery('.btn-apply-builder'));
Mautic.updateConnections(function(err) {
if (!err) {
var applyBtn = mQuery('.btn-apply');
Mautic.inBuilderSubmissionOn(applyBtn.closest('form'));
applyBtn.trigger('click');
Mautic.inBuilderSubmissionOff();
}
});
};
Mautic.updateConnections = function(callback) {
var nodes = [];
mQuery("#CampaignCanvas .list-campaign-event").each(function (idx, elem) {
nodes.push({
id: mQuery(elem).attr('id').replace('CampaignEvent_', ''),
positionX: parseInt(mQuery(elem).css('left'), 10),
positionY: parseInt(mQuery(elem).css('top'), 10)
});
});
mQuery("#CampaignCanvas .list-campaign-source").not('#CampaignEvent_newsource').not('#CampaignEvent_newsource_hide').each(function (idx, elem) {
nodes.push({
id: mQuery(elem).attr('id').replace('CampaignEvent_', ''),
positionX: parseInt(mQuery(elem).css('left'), 10),
positionY: parseInt(mQuery(elem).css('top'), 10)
});
});
var connections = [];
mQuery.each(Mautic.campaignBuilderInstance.getConnections(), function (idx, connection) {
connections.push({
sourceId: connection.sourceId.replace('CampaignEvent_', ''),
targetId: connection.targetId.replace('CampaignEvent_', ''),
anchors: mQuery.map(connection.endpoints, function (endpoint) {
var anchor = Mautic.campaignBuilderGetEndpointDetails(endpoint);
return {
'endpoint': anchor.anchorName,
'eventId': anchor.eventId
};
})
});
});
var chart = {};
chart.nodes = nodes;
chart.connections = connections;
var canvasSettings = {canvasSettings: chart};
var campaignId = mQuery('#campaignId').val();
var query = "action=campaign:updateConnections&campaignId=" + campaignId;
mQuery.ajax({
url: mauticAjaxUrl + '?' + query,
type: "POST",
data: canvasSettings,
dataType: "json",
success: function (response) {
if (typeof callback === 'function') callback(false, response);
},
error: function (response, textStatus, errorThrown) {
Mautic.processAjaxError(response, textStatus, errorThrown);
if (typeof callback === 'function') callback(true, response);
}
});
};
/**
* Submit the campaign event form
* @param e
*/
Mautic.submitCampaignEvent = function(e) {
e.preventDefault();
mQuery('#campaignevent_canvasSettings_droppedX').val(mQuery('#droppedX').val());
mQuery('#campaignevent_canvasSettings_droppedY').val(mQuery('#droppedY').val());
// Disable save and apply buttton
mQuery('.btns-builder').find('button').prop('disabled', true);
// Get number of running ajax
const runningAjax = mQuery.active;
mQuery('form[name="campaignevent"]').submit();
const waitForElement = function (){
if(mQuery.active <= runningAjax){
mQuery('.btns-builder').find('button').prop('disabled', false);
}
else{
setTimeout(waitForElement, 100);
}
}
// When Ajax finish enable buttons
waitForElement();
};
/**
* Submit source form
* @param e
*/
Mautic.submitCampaignSource = function(e) {
e.preventDefault();
mQuery('#campaign_leadsource_droppedX').val(mQuery('#droppedX').val());
mQuery('#campaign_leadsource_droppedY').val(mQuery('#droppedY').val());
mQuery('form[name="campaign_leadsource"]').submit();
};
/**
* Reconnect jsplumb connections
*/
Mautic.campaignBuilderReconnectEndpoints = function () {
mQuery.each(Mautic.campaignConnectionCallbacks.beforeEndpointsReconnected, function (index, callback) {
callback();
});
if (typeof Mautic.campaignBuilderCanvasSettings == 'undefined') {
return;
}
if (typeof Mautic.campaignBuilderCanvasSettings.nodes !== 'undefined') {
// Reposition events
var sourceFound = false;
mQuery.each(Mautic.campaignBuilderCanvasSettings.nodes, function (key, node) {
if (typeof Mautic.campaignBuilderCanvasSources[node.id] !== 'undefined') {
sourceFound = true;
}
mQuery('#CampaignEvent_' + node.id).css({
position: 'absolute',
left: node.positionX + 'px',
top: node.positionY + 'px'
});
Mautic.campaignBuilderEventPositions['CampaignEvent_' + node.id] = {
left: parseInt(node.positionX),
top: parseInt(node.positionY)
};
});
}
if (typeof Mautic.campaignBuilderCanvasSettings.connections !== 'undefined') {
// Recreate jsPlumb connections and labels
mQuery.each(Mautic.campaignBuilderCanvasSettings.connections, function (key, connection) {
if (typeof Mautic.campaignBuilderCanvasEvents[connection.targetId] !== 'undefined') {
var targetEvent = Mautic.campaignBuilderCanvasEvents[connection.targetId];
} else if (typeof Mautic.campaignBuilderCanvasSources[connection.targetId] !== 'undefined') {
var targetEvent = Mautic.campaignBuilderCanvasSources[connection.targetId];
}
if (targetEvent && targetEvent.label) {
Mautic.campaignBuilderLabels["CampaignEvent_" + connection.targetId] = targetEvent.label;
}
Mautic.campaignBuilderInstance.connect({
uuids: [
"CampaignEvent_" + connection.sourceId + '_' + connection.anchors.source,
"CampaignEvent_" + connection.targetId + '_' + connection.anchors.target
]
});
});
}
if (!sourceFound) {
var topOffset = 25;
mQuery.each(Mautic.campaignBuilderCanvasSources, function (type, source) {
mQuery('#CampaignEvent_' + type).css({
position: 'absolute',
left: '20px',
top: topOffset + 'px'
});
});
topOffset += 45;
}
mQuery.each(Mautic.campaignConnectionCallbacks.afterEndpointsReconnected, function (index, callback) {
callback();
});
delete Mautic.campaignBuilderCanvasSettings;
};
/**
* Register an endpoint with JsPlumb
*
* @param name
* @param params
*/
Mautic.campaignBuilderRegisterEndpoint = function (name, params) {
var isTarget, isSource, color, connectorColor, connectorStyle;
if (params.color) {
color = params.color;
} else {
color = Mautic.campaignBuilderAnchorDefaultColor;
}
if (params.connectorColor) {
connectorColor = params.connectorColor;
} else {
connectorColor = color;
}
if (params.connectorStyle) {
connectorStyle = params.connectorStyle;
} else {
connectorStyle = ["Bezier", {curviness: 25}];
}
isTarget = params.isTarget;
isSource = true;
if (isTarget === null) {
// Both are allowed
isTarget = true;
} else {
if (typeof isTarget == 'undefined') {
isTarget = false;
}
if (isTarget) {
isSource = false;
}
}
Mautic.campaignEndpoints[name] = {
endpoint: ["Dot", { radius: 10 }],
paintStyle: {
fill: color
},
endpointStyle: {
fill: color
},
connectorStyle: {
stroke: connectorColor,
strokeWidth: 1
},
connector: connectorStyle,
connectorOverlays: [["Arrow", {width: 8, length: 8, location: 0.5}]],
maxConnections: -1,
isTarget: isTarget,
isSource: isSource,
beforeDrop: Mautic.campaignBeforeDropCallback,
beforeDetach: Mautic.campaignBeforeDetachCallback,
beforeStartDetach: Mautic.campaignBeforeStartDetachCallback,
beforeDrag: Mautic.campaignBeforeDragCallback
}
};
/**
* Register an anchor with JsPlumb
*
* @param names
* @param el
*/
Mautic.campaignBuilderRegisterAnchors = function(names, el) {
var id = mQuery(el).attr('id');
mQuery(names).each(function(key, anchorName) {
var theAnchor = Mautic.campaignEndpointDefinitions[anchorName]['anchors'];
theAnchor[6] = anchorName.toLowerCase() + ' ' + id;
var ep = Mautic.campaignBuilderInstance.addEndpoint(
id,
{
anchor: theAnchor,
uuid: id + "_" + anchorName.toLowerCase()
},
Mautic.campaignEndpoints[anchorName]
);
ep.bind("mouseover", function (endpoint, event) {
var epDetails = Mautic.campaignBuilderGetEndpointDetails(endpoint);
if (!Mautic.campaignHoverCallback(epDetails, endpoint, event)) {
return;
}
if (epDetails.anchorName == 'top') {
// Don't add a plus sign to a top anchor
return;
}
// If this is a leadsourceleft or leadsourceright anchor - ensure there are source options available before allowing to add a new
if (epDetails.anchorName == 'leadsourceleft' || epDetails.anchorName == 'leadsourceright') {
if (mQuery('#SourceList option:enabled').length === 1) {
// Accounts for empty option
return;
}
}
// Set color style
endpoint.setPaintStyle(
{
fill: endpoint.connectorStyle.stroke
}
);
var dot = mQuery(endpoint.canvas);
dot.addClass('jtk-clickable_anchor');
if (!dot.find('svg text').length) {
// Add a plus sign to SVG
var svg = dot.find('svg')[0];
var textElement = document.createElementNS("http://www.w3.org/2000/svg", 'text');
textElement.setAttributeNS(null, 'x', '50%');
textElement.setAttributeNS(null, 'y', '50%');
textElement.setAttributeNS(null, 'text-anchor', 'middle');
textElement.setAttributeNS(null, 'stroke-width', '2px');
textElement.setAttributeNS(null, 'stroke', '#ffffff');
textElement.setAttributeNS(null, 'dy', '.3em');
var textNode = document.createTextNode('+');
textElement.appendChild(textNode);
svg.appendChild(textElement);
}
});
ep.bind("mouseout", function (endpoint) {
var dot = mQuery(endpoint.canvas);
dot.removeClass('jtk-clickable_anchor');
if (!endpoint.connections.length) {
// Set color style
endpoint.setPaintStyle(
{
fill: Mautic.campaignBuilderAnchorDefaultColor
}
);
}
});
ep.bind("click", function (endpoint, event) {
if (mQuery('#CampaignEvent_newsource').length) {
// Can't do anything until a new source is added
return;
}
var epDetails = Mautic.campaignBuilderGetEndpointDetails(endpoint);
if (epDetails.anchorName == 'top') {
// Don't do anything for top anchors
return;
}
// If this is a leadsourceleft or leadsourceright anchor - ensure there are source options available before allowing to add a new
if (epDetails.anchorName == 'leadsourceleft' || epDetails.anchorName == 'leadsourceright') {
if (mQuery('#SourceList option:enabled').length === 1) {
// Accounts for empty option
return;
}
}
// Note the anchor so it can be auto attached after the event is created
var epDetails = Mautic.campaignBuilderGetEndpointDetails(endpoint);
var clickedAnchorName = epDetails.anchorName;
Mautic.campaignBuilderAnchorClicked = endpoint.elementId+'_'+clickedAnchorName;
Mautic.campaignBuilderAnchorNameClicked = clickedAnchorName;
Mautic.campaignBuilderAnchorEventTypeClicked = epDetails.eventType;
// Get the position of the event
var elPos = Mautic.campaignBuilderGetEventPosition(endpoint.element);
var spotFound = false,
putLeft = elPos.left,
putTop = elPos.top,
direction = '', // xl, xr, yu, yd
fullWidth = Mautic.campaignBuilderEventDimensions.width + Mautic.campaignBuilderEventDimensions.anchor,
wiggleWidth = fullWidth + Mautic.campaignBuilderEventDimensions.wiggleWidth,
fullHeight = Mautic.campaignBuilderEventDimensions.height + Mautic.campaignBuilderEventDimensions.anchor,
wiggleHeight = fullHeight + Mautic.campaignBuilderEventDimensions.wiggleHeight,
debug = false;
if (debug) {
console.log(Mautic.campaignBuilderEventPositions);
console.log(clickedAnchorName+' - starting with: x = '+ putLeft+', y = '+putTop);
}
switch (clickedAnchorName) {
case 'leadsourceleft':
direction = 'xl';
putLeft -= wiggleWidth;
break;
case 'leadsourceright':
direction = 'xr';
putLeft += wiggleWidth;
break;
case 'bottom':
direction = 'yd';
putTop += wiggleHeight;
break;
case 'yes':
case 'leadsource':
// Place slightly to the left of the anchor
putLeft -= Mautic.campaignBuilderEventDimensions.width/2;
putTop += wiggleHeight;
direction = 'xl';
break;
case 'no':
// Place slightly to the left of the anchor
putLeft += Mautic.campaignBuilderEventDimensions.width/2;
putTop += wiggleHeight;
direction = 'xr';
break;
case 'top':
directon = 'yu';
putTop -= wiggleHeight;
break;
}
if (debug) {
console.log('Going direction: '+direction);
console.log('Start test with: x = '+ putLeft+', y = '+putTop);
}
var counter = 0;
var windowWidth = mQuery(window).width();
while (!spotFound) {
// Find out if spot is taken
var isOccupied = false;
mQuery.each(Mautic.campaignBuilderEventPositions, function (id, pos) {
var l = Math.max(putLeft, pos.left);
var r = Math.min(putLeft + fullWidth, pos.left + fullWidth);
var b = Math.max(putTop, pos.top);
var t = Math.min(putTop + fullHeight, pos.top + fullHeight);
var h = t-b;
var w = r-l;
if (debug) {
console.log('Checking ' + id);
console.log(putLeft, putTop, l,r,b,t,h,w);
}
if (h > 0 && w > 0) {
if (debug) {
console.log('Slot occupied by '+id);
}
isOccupied = true;
// xl, xr, yu, yd
switch (direction) {
case 'xl':
putLeft -= (w + Mautic.campaignBuilderEventDimensions.wiggleWidth);
if (putLeft <= 0) {
putLeft = 0;
// Ran out of room so go down
direction = 'yd';
putTop += fullHeight + Mautic.campaignBuilderEventDimensions.wiggleHeight;
}
break;
case 'xr':
if (putLeft + w + Mautic.campaignBuilderEventDimensions.wiggleWidth > windowWidth) {
// Hit right canvas so start going down by default
direction = 'yd';
putLeft -= Mautic.campaignBuilderEventDimensions.wiggleWidth;
putTop += fullHeight + Mautic.campaignBuilderEventDimensions.wiggleHeight;
} else {
putLeft += (w + Mautic.campaignBuilderEventDimensions.wiggleWidth);
}
break;
case 'yu':
putTop -= (h - Mautic.campaignBuilderEventDimensions.wiggleHeight);
if (putTop <= 0) {
putTop = 0;
// Ran out of room going up so try the right
direction = 'xr';
}
break;
case 'yd':
putTop += (h + Mautic.campaignBuilderEventDimensions.wiggleHeight);
break;
}
return false
}
});
if (!isOccupied) {
if (debug) {
console.log('It fits!');
}
spotFound = true;
}
counter++;
if (counter >= 100) {
putTop = 10;
putLeft = 10;
if (debug) {
console.log('Too many loops');
}
spotFound = true;
}
}
if (debug) {
console.log('To be placed at: x = '+ putLeft+', y = '+putTop);
}
if (putLeft <= 0) {
putLeft = 10;
}
if (putTop <= 0) {
putTop = 10;
}
// Mark the spot
mQuery('#droppedX').val(putLeft);
mQuery('#droppedY').val(putTop);
// Update the event selector
var allowedEvents = [];
mQuery.each(Mautic.campaignBuilderConnectionsMap[epDetails.eventType][epDetails.anchorName], function (group, eventTypes) {
if (eventTypes.length) {
allowedEvents[allowedEvents.length] = group.charAt(0).toUpperCase() + group.substr(1);
}
});
Mautic.campaignBuilderAnchorClickedAllowedEvents = allowedEvents;
Mautic.campaignBuilderIsEventCloneAllowed = Mautic.isCampaignCloneEventAllowedForEndpoint(epDetails);
if (!(mQuery('.preview').length)) {
var el = (mQuery(event.target).hasClass('jtk-endpoint')) ? event.target : mQuery(event.target).parents('.jtk-endpoint')[0];
Mautic.campaignBuilderAnchorClickedPosition = Mautic.campaignBuilderGetEventPosition(el);
Mautic.campaignBuilderUpdateEventList(allowedEvents, false, 'groups');
Mautic.campaignBuilderUpdateEventCloneButton(allowedEvents, epDetails.eventType, epDetails.anchorName);
Mautic.campaignBuilderUpdateEventCloneDescription();
}
// Disable the list items not allowed
mQuery('.campaign-event-selector:not(#SourceList) option').prop('disabled', false);
if ('source' == epDetails.eventType) {
var checkSelects = ['action', 'decision', 'condition'];
} else {
var primaryType = (epDetails.eventType === 'decision') ? 'action': 'decision';
var checkSelects = [primaryType, 'condition'];
}
mQuery.each(checkSelects, function(key, targetType) {
var selectId = '#' + targetType.charAt(0).toUpperCase() + targetType.slice(1) + 'List';
mQuery(selectId + ' option').each(function () {
var optionVal = mQuery(this).val();
if (optionVal) {
if (!Mautic.campaignBuilderValidateConnection(epDetails, targetType, optionVal)) {
mQuery(this).prop('disabled', true);
}
}
});
mQuery(selectId).trigger('chosen:updated');
});
});
});
};
/**
* Extract information about an event/endpoint from element
*
* @param el
* @returns {{left: Number, top: Number}}
*/
Mautic.campaignBuilderGetEventPosition = function(el) {
return {
'left': parseInt(mQuery(el).css('left')),
'top': parseInt(mQuery(el).css('top'))
}
};
/**
* Update the event select list
*
* @param groups
* @param hidden
* @param view
* @param active
* @param forcePosition
*/
Mautic.campaignBuilderUpdateEventList = function (groups, hidden, view, active, forcePosition) {
var groupsEnabled = 0;
var inGroupsView = ('groups' == view);
if (groups.length === 1 && mQuery.inArray('Source', groups) !== -1 && !hidden) {
// Force groups mode
inGroupsView = false;
}
mQuery.each(['Source', 'Action', 'Decision', 'Condition'], function (key, theGroup) {
if (mQuery.inArray(theGroup, groups) !== -1) {
if (inGroupsView) {
mQuery('#' + theGroup + 'GroupSelector').removeClass('hide');
if ('source' != theGroup) {
groupsEnabled++;
}
} else {
mQuery('#' + theGroup + 'GroupList').removeClass('hide');
}
} else {
if (inGroupsView) {
mQuery('#' + theGroup + 'GroupSelector').addClass('hide');
} else {
mQuery('#' + theGroup + 'GroupList').addClass('hide');
}
}
});
mQuery('#CampaignEventPanelGroups').removeClass('groups-enabled-1 groups-enabled-2 groups-enabled-3')
mQuery('#CampaignEventPanelGroups').addClass('groups-enabled-' + groups.length)
if (inGroupsView) {
mQuery.each(groups, function (key, theGroup) {
mQuery('#'+theGroup+'GroupSelector').removeClass(
function (index, css) {
return (css.match(/col-(\S+)/g) || []).join(' ');
}
).addClass('col-md-' + (12 / groupsEnabled));
});
var newWidth = (500 / 3) * groupsEnabled;
if (newWidth >= mQuery(window).width()) {
newWidth = mQuery(window).width() - 10;
}
var leftPos = (forcePosition) ? forcePosition.left : Mautic.campaignBuilderAnchorClickedPosition.left - (newWidth / 2 - 10);
var topPos = (forcePosition) ? forcePosition.top : Mautic.campaignBuilderAnchorClickedPosition.top + 25;
mQuery('#CampaignEventPanel').css({
left: (leftPos >=0 ) ? leftPos : 10,
top: topPos,
width: newWidth,
height: Mautic.campaignBuilderIsEventCloneAllowed ? 372 : 280
});
mQuery('#CampaignEventPanel').removeClass('hide');
mQuery('#CampaignEventPanelGroups').removeClass('hide');
mQuery('#CampaignEventPanelLists').addClass('hide');
if (Mautic.campaignBuilderIsEventCloneAllowed) {
mQuery('#CampaignPasteContainer').removeClass('hide');
} else {
mQuery('#CampaignPasteContainer').addClass('hide');
}
} else {
var leftPos = (forcePosition) ? forcePosition.left : Mautic.campaignBuilderAnchorClickedPosition.left - 125;
var topPos = (forcePosition) ? forcePosition.top : Mautic.campaignBuilderAnchorClickedPosition.top + 25;
mQuery('#CampaignEventPanel').css({
left: (leftPos >= 0) ? leftPos : 10,
top: topPos,
width: 300,
height: 80,
});
mQuery('#CampaignEventPanelGroups').addClass('hide');
mQuery('#CampaignEventPanelLists').removeClass('hide');
mQuery('#CampaignEventPanel').removeClass('hide');
if (groups.length === 1) {
setTimeout(function () {
// Activate chosen
mQuery('#CampaignEventPanelLists #' + groups[0] + 'List').trigger('chosen:open');
}, 10);
}
}
};
Mautic.campaignBuilderUpdateEventCloneButton = function (groups, eventType, anchorName) {
var $insertButton = mQuery('#EventInsertButton');
var updatedUrl = $insertButton.attr('href').replace(/anchor=(.*?)$/, "anchor=" + anchorName + "&anchorEventType=" + eventType);
$insertButton.attr('href', updatedUrl);
};
Mautic.campaignBuilderUpdateEventCloneDescription = function () {
var cloneDetails = Mautic.getCampaignEventClone();
if (cloneDetails) {
mQuery('[data-campaign-event-clone="sourceEventName"]').html(cloneDetails['sourceEventName']);
mQuery('[data-campaign-event-clone="sourceCampaignName"]').html(cloneDetails['sourceCampaignName']);
}
};
/**
*
* @param endpoint
* @param nameOnly
* @returns {{endpointName: *, elementId: *}}
*/
Mautic.campaignBuilderGetEndpointDetails = function(endpoint) {
var anchorName, eventId;
if (typeof endpoint === 'string') {
eventId = endpoint;
} else {
var parts = endpoint.anchor.cssClass.split(' ');
if (parts.length > 1) {
anchorName = parts[0];
eventId = parts[1];
} else {
anchorName = parts[0];
eventId = endpoint.elementId
}
}
return {
'anchorName': anchorName,
'eventId': eventId.replace('CampaignEvent_', ''),
'elementId' : eventId,
'eventType': mQuery('#'+eventId).data('type'),
'event': mQuery('#'+eventId).data('event')
};
};
/**
* Display new source when required
*/
Mautic.campaignBuilderPrepareNewSource = function () {
var newSourcePos = {
left: mQuery(window).width()/2 - 100,
top: 50
};
mQuery('#CampaignEvent_newsource').css(newSourcePos);
Mautic.campaignBuilderUpdateEventList(['Source'], false, 'list', false, {
left: newSourcePos.left - 50,
top: newSourcePos.top + 35
});
mQuery('#SourceList').trigger('chosen:open');
};
/**
*
* @param epDetails
* @param targetType action|decision|condition
* @param targetEvent
* @returns {boolean}
*/
Mautic.campaignBuilderValidateConnection = function (epDetails, targetType, targetEvent) {
var valid = true;
var sourceType = epDetails.eventType;
var sourceEvent = 'source' === sourceType ? sourceType : epDetails.event;
if (typeof Mautic.campaignBuilderConnectionRestrictions[targetEvent] !== 'undefined') {
if ('source' === sourceEvent) {
// If there are any restrictions, then don't allow it to be the target of the campaign source
mQuery.each(Mautic.campaignBuilderConnectionRestrictions[targetEvent]['source'], function(eventType, events) {
if (events.length) {
valid = false;
// break the loop
return false;
}
});
return valid;
}
if (
typeof Mautic.campaignBuilderConnectionRestrictions[targetEvent]['source'][sourceType] !== 'undefined' &&
Mautic.campaignBuilderConnectionRestrictions[targetEvent]['source'][sourceType].length &&
mQuery.inArray(sourceEvent, Mautic.campaignBuilderConnectionRestrictions[targetEvent]['source'][sourceType]) === -1
) {
// If the source event is not included in the source list of the target event, then don't allow it
valid = false;
}
}
if (
typeof Mautic.campaignBuilderConnectionRestrictions[sourceEvent] !== 'undefined' &&
typeof Mautic.campaignBuilderConnectionRestrictions[sourceEvent]['target'][targetType] !== 'undefined' &&
Mautic.campaignBuilderConnectionRestrictions[sourceEvent]['target'][targetType].length
) {
// If the target event is defined in the target list of the source event, then allow it; otherwise don't allow it
valid = (mQuery.inArray(targetEvent, Mautic.campaignBuilderConnectionRestrictions[sourceEvent]['target'][targetType]) !== -1);
}
if (
typeof Mautic.campaignBuilderConnectionRestrictions['anchor'][sourceType] !== 'undefined' &&
typeof Mautic.campaignBuilderConnectionRestrictions['anchor'][sourceType][targetEvent] !== 'undefined'
) {
mQuery(Mautic.campaignBuilderConnectionRestrictions['anchor'][sourceType][targetEvent]).each(
function(key, anchor) {
switch (anchor) {
case 'inaction':
anchor = 'no';
break;
case 'action':
anchor = 'yes';
break;
}
if (anchor == epDetails.anchorName) {
valid = false;
// Break form the loop
return false;
}
}
);
}
return valid;
};
/**
*
* @param eventId
* @param contactId
*/
Mautic.updateScheduledCampaignEvent = function(eventId, contactId) {
// Convert scheduled date/time to an input
mQuery('#timeline-campaign-event-'+eventId+' .btn-reschedule').addClass('disabled');
var converting = false;
var eventWrapper = '#timeline-campaign-event-'+eventId;
var eventSpan = '.timeline-campaign-event-date-'+eventId;
var eventText = '#timeline-campaign-event-text-'+eventId;
var saveButton = '#timeline-campaign-event-save-' + eventId;
var originalDate = mQuery(eventWrapper+' '+eventSpan).first().text();
var revertInput = function(input) {
converting = true;
mQuery(input).datetimepicker('destroy');
mQuery(eventSpan).text(originalDate);
mQuery(eventWrapper+' .btn-reschedule').removeClass('disabled');
};
var date = mQuery(eventSpan).attr('data-date');
mQuery(saveButton).show();
var input = mQuery('<input type="text" id="timeline-reschedule"/>')
.css('height', '20px')
.css('color', '#000000')
.val(date)
.on('keyup', function(e) {
var code = e.keyCode || e.which;
if (code == 13) {
e.preventDefault();
converting = true
mQuery(input).prop('readonly', true);
mQuery(input).datetimepicker('destroy');
Mautic.ajaxActionRequest('campaign:updateScheduledCampaignEvent',
{
eventId: eventId,
contactId: contactId,
date: mQuery(this).val(),
originalDate: date
}, function (response) {
mQuery(eventSpan).text(response.formattedDate);
mQuery(eventSpan).attr('data-date', response.date);
mQuery(eventWrapper+' .btn-reschedule').removeClass('disabled');
if (response.success) {
mQuery(eventText).removeClass('text-warning').addClass('text-info');
mQuery(eventSpan).css('textDecoration', 'inherit');
mQuery('.fa.timeline-campaign-event-cancelled-'+eventId).remove();
mQuery('.timeline-campaign-event-scheduled-'+eventId).removeClass('hide');
mQuery('.timeline-campaign-event-cancelled-'+eventId).addClass('hide');
mQuery(saveButton).hide();
}
}, false
);
} else if (code == 27) {
e.preventDefault();
revertInput(input);
mQuery(saveButton).hide();
}
})
.on('blur', function (e) {
if (!converting) {
revertInput(input);
}
mQuery(saveButton).hide();
});
mQuery('#timeline-campaign-event-'+eventId+' '+eventSpan).html(input);
Mautic.activateDateTimeInputs('#timeline-reschedule');
mQuery('#timeline-reschedule').focus();
};
/**
*
* @param eventId
* @param contactId
*/
Mautic.saveScheduledCampaignEvent = function (eventId, contactId) {
var saveButton = '#timeline-campaign-event-save-' + eventId;
mQuery(saveButton).addClass('disabled');
// Convert scheduled date/time to an input
var eventWrapper = '#timeline-campaign-event-' + eventId;
var eventSpan = '.timeline-campaign-event-date-' + eventId;
var eventText = '#timeline-campaign-event-text-' + eventId;
var date = mQuery(eventSpan).attr('data-date');
Mautic.ajaxActionRequest('campaign:updateScheduledCampaignEvent',
{
eventId: eventId,
contactId: contactId,
date: mQuery('#timeline-reschedule').val(),
originalDate: date
}, function (response) {
mQuery(eventSpan).text(response.formattedDate);
mQuery(eventSpan).attr('data-date', response.date);
if (response.success) {
mQuery(eventText).removeClass('text-warning').addClass('text-info');
mQuery(eventSpan).css('textDecoration', 'inherit');
mQuery('.fa.timeline-campaign-event-cancelled-' + eventId).remove();
mQuery('.timeline-campaign-event-scheduled-' + eventId).removeClass('hide');
mQuery('.timeline-campaign-event-cancelled-' + eventId).addClass('hide');
}
mQuery(saveButton).removeClass('disabled').hide();
mQuery(eventWrapper + ' .btn-reschedule').removeClass('disabled');
}, false);
};
/**
*
* @param eventId
* @param contactId
*/
Mautic.cancelScheduledCampaignEvent = function(eventId, contactId) {
mQuery('#timeline-campaign-event-'+eventId+' .btn').prop('disabled', true).addClass('disabled');
var eventWrapper = '#timeline-campaign-event-'+eventId;
var eventSpan = '.timeline-campaign-event-date-' + eventId;
var eventText = '#timeline-campaign-event-text-' + eventId;
Mautic.ajaxActionRequest('campaign:cancelScheduledCampaignEvent',
{
eventId: eventId,
contactId: contactId,
}, function (response) {
if (response.success) {
mQuery(eventText).removeClass('text-info').addClass('text-warning');
mQuery(eventWrapper+' .btn-edit').prop('disabled', false).removeClass('disabled');
mQuery('.timeline-campaign-event-scheduled-'+eventId).addClass('hide');
mQuery('.timeline-campaign-event-cancelled-'+eventId).removeClass('hide');
} else {
mQuery(eventWrapper+' .btn').prop('disabled', false).removeClass('disabled');
}
}, false
);
};
/**
* Update the "Jump to Event" select list to be available events.
*/
Mautic.updateJumpToEventOptions = function() {
var jumpToEventSelectNode = mQuery("#campaignevent_properties_jumpToEvent");
jumpToEventSelectNode.children().remove();
for (var eventId in Mautic.campaignBuilderCanvasEvents) {
var event = Mautic.campaignBuilderCanvasEvents[eventId];
if (event.type !== 'campaign.jump_to_event' && event.eventType !== 'decision') {
var opt = mQuery("<option />")
.attr("value", event.id)
.text(event.name)
if (event.id == jumpToEventSelectNode.data("selected")) {
opt.attr("selected", "selected");
}
jumpToEventSelectNode.append(opt);
}
}
jumpToEventSelectNode.trigger("chosen:updated");
};
Mautic.highlightJumpTarget = function(event, el) {
var element = mQuery(el);
var parentEventElement = element.parent().parent();
var highlightedAlready = parentEventElement.data('highlighted');
var jumpTargetID = '#CampaignEvent_' + element.data('jumpTarget');
var jumpTarget = mQuery(jumpTargetID);
var overlay = mQuery('#EventJumpOverlay');
if (highlightedAlready) {
parentEventElement.data('highlighted', false);
overlay.hide();
parentEventElement.css("z-index", 1010);
jumpTarget.css("z-index", 1010);
} else {
parentEventElement.data('highlighted', true);
overlay.show();
parentEventElement.css("z-index", 2010);
jumpTarget.css("z-index", 2010);
}
};
/**
* Display confirmation modal if user wishes to unpublish the campaign.
*/
Mautic.showCampaignConfirmation = function (el) {
let element = mQuery(el);
if (element.prop('checked') && element.val() !== "1") {
Mautic.showConfirmation(element);
}
};
/**
* Cancel Callback to trigger the yes button and dismiss the confirmation modal.
*/
Mautic.setPublishedButtonToYes = function (el) {
// Dismiss the confirmation
Mautic.dismissConfirmation();
// Find the yes button id and trigger click event
var yesButton = mQuery(el).parent('.btn-no').siblings('.btn-yes').children('input');
var yesButtonId = mQuery(yesButton).attr('id');
if (yesButtonId !== undefined) {
mQuery('#' + yesButtonId).trigger('click');
mQuery(el).parent('.btn-no').removeClass('active');
mQuery(el).parent('.btn-no').siblings('.btn-yes').addClass('active');
}
};
/**
* Onclick Callback to show the confirmation modal during toggling campaign status.
*/
Mautic.confirmationCampaignPublishStatus = function (el) {
let element = mQuery(el);
// Add the confirmation modal, if current status is published
if (element.data('status') === 'published') {
Mautic.showConfirmation(element);
}
else {
// Otherwise just change the status.
Mautic.confirmCallbackCampaignPublishStatus('', el);
}
}
/**
* Confirm Callback to toggling campaign status if user chooses Yes.
*/
Mautic.confirmCallbackCampaignPublishStatus = function (action, el) {
let element = mQuery(el);
let idClass = element.data('id-class');
let model = element.data('model');
let itemId = element.data('item-id');
let query = element.data('query');
let backdrop = element.data('backdrop');
// Toggles published status of an campaign
Mautic.togglePublishStatus(event, idClass, model, itemId, query, backdrop);
// Dismiss the confirmation
Mautic.dismissConfirmation();
}
Mautic.isCampaignCloneEventAllowedForEndpoint = function(endpointDetails) {
const eventClone = Mautic.getCampaignEventClone();
if (!eventClone) {
return false;
}
// uppercase first letter for string comparison
const eventType = eventClone['sourceEventType'].charAt(0).toUpperCase() + eventClone['sourceEventType'].slice(1);
const allowedEvents = Mautic.campaignBuilderAnchorClickedAllowedEvents || [];
const isValidConnection = Mautic.campaignBuilderValidateConnection(endpointDetails, eventClone['sourceEventType'], eventClone['sourceType']);
return allowedEvents.includes(eventType) && isValidConnection;
}
Mautic.getCampaignEventClone = function() {
const eventClone = localStorage.getItem("mautic_campaign_event_clone");
return eventClone === null ? null : JSON.parse(eventClone);
}
Mautic.setCampaignEventClone = function(data) {
localStorage.setItem("mautic_campaign_event_clone", JSON.stringify(data));
}
Mautic.clearCampaignEventClone = function() {
localStorage.removeItem("mautic_campaign_event_clone");
}
Mautic.hideCampaignEventPanel = function() {
mQuery('#CampaignEventPanel').addClass('hide');
}