Spaces:
No application file
No application file
| /** DynamicContentBundle **/ | |
| Mautic.toggleDwcFilters = function () { | |
| mQuery("#dwcFiltersTab, #slotNameDiv").toggleClass("hide"); | |
| if (mQuery("#dwcFiltersTab").hasClass('hide')) { | |
| mQuery('.nav-tabs a[href="#details"]').click(); | |
| } else { | |
| Mautic.dynamicContentOnLoad(); | |
| } | |
| }; | |
| Mautic.dynamicContentOnLoad = function (container, response) { | |
| if (typeof container !== 'object') { | |
| if (mQuery(container + ' #list-search').length) { | |
| Mautic.activateSearchAutocomplete('list-search', 'dynamicContent'); | |
| } | |
| } | |
| var availableFilters = mQuery('div.dwc-filter').find('select[data-mautic="available_filters"]'); | |
| Mautic.activateChosenSelect(availableFilters, false); | |
| Mautic.dynamicFiltersOnLoad('div.dwc-filter'); | |
| }; | |
| Mautic.dynamicFiltersOnLoad = function(container, response) { | |
| mQuery('#campaign-share-tab').hover(function () { | |
| if (Mautic.shareTableLoaded != true) { | |
| Mautic.loadAjaxColumn('campaign-share-stat', 'lead:getCampaignShareStats', 'afterStatsLoad'); | |
| Mautic.shareTableLoaded = true; | |
| } | |
| }) | |
| Mautic.afterStatsLoad = function () { | |
| Mautic.sortTableByColumn('#campaign-share-table', '.campaign-share-stat', true) | |
| } | |
| if (mQuery(container + ' #list-search').length) { | |
| Mautic.activateSearchAutocomplete('list-search', 'lead.list'); | |
| } | |
| var prefix = 'leadlist'; | |
| var parent = mQuery('.dynamic-content-filter, .dwc-filter'); | |
| if (parent.length) { | |
| prefix = parent.attr('id'); | |
| } | |
| if (mQuery('#' + prefix + '_filters').length) { | |
| mQuery('#available_filters').on('change', function() { | |
| if (mQuery(this).val()) { | |
| Mautic.addDwcFilter(mQuery(this).val(),mQuery('option:selected',this).data('field-object')); | |
| mQuery(this).val(''); | |
| mQuery(this).trigger('chosen:updated'); | |
| } | |
| }); | |
| mQuery('#' + prefix + '_filters .remove-selected').each( function (index, el) { | |
| mQuery(el).on('click', function () { | |
| mQuery(this).closest('.panel').animate( | |
| {'opacity': 0}, | |
| 'fast', | |
| function () { | |
| mQuery(this).remove(); | |
| Mautic.reorderSegmentFilters(); | |
| } | |
| ); | |
| if (!mQuery('#' + prefix + '_filters li:not(.placeholder)').length) { | |
| mQuery('#' + prefix + '_filters li.placeholder').removeClass('hide'); | |
| } else { | |
| mQuery('#' + prefix + '_filters li.placeholder').addClass('hide'); | |
| } | |
| }); | |
| }); | |
| var bodyOverflow = {}; | |
| mQuery('#' + prefix + '_filters').sortable({ | |
| items: '.panel', | |
| helper: function(e, ui) { | |
| ui.children().each(function() { | |
| if (mQuery(this).is(":visible")) { | |
| mQuery(this).width(mQuery(this).width()); | |
| } | |
| }); | |
| // Fix body overflow that messes sortable up | |
| bodyOverflow.overflowX = mQuery('body').css('overflow-x'); | |
| bodyOverflow.overflowY = mQuery('body').css('overflow-y'); | |
| mQuery('body').css({ | |
| overflowX: 'visible', | |
| overflowY: 'visible' | |
| }); | |
| return ui; | |
| }, | |
| scroll: true, | |
| axis: 'y', | |
| stop: function(e, ui) { | |
| // Restore original overflow | |
| mQuery('body').css(bodyOverflow); | |
| // First in the list should be an "and" | |
| ui.item.find('select.glue-select').first().val('and'); | |
| Mautic.reorderSegmentFilters(); | |
| } | |
| }); | |
| } | |
| // segment contact filters | |
| var segmentContactForm = mQuery('#segment-contact-filters'); | |
| if (segmentContactForm.length) { | |
| segmentContactForm.on('change', function() { | |
| segmentContactForm.submit(); | |
| }).on('keyup', function() { | |
| segmentContactForm.delay(200).submit(); | |
| }).on('submit', function(e) { | |
| e.preventDefault(); | |
| Mautic.refreshSegmentContacts(segmentContactForm); | |
| }); | |
| } | |
| }; | |
| Mautic.addDwcFilter = function (elId, elObj) { | |
| var filterId = '#available_' + elObj + '_' + elId; | |
| var filterOption = mQuery(filterId); | |
| var label = filterOption.text(); | |
| var alias = filterOption.val(); | |
| // Create a new filter | |
| var filterNum = parseInt(mQuery('.available-filters').data('index')); | |
| mQuery('.available-filters').data('index', filterNum + 1); | |
| var prototypeStr = mQuery('.available-filters').data('prototype'); | |
| var fieldType = filterOption.data('field-type'); | |
| var fieldObject = filterOption.data('field-object'); | |
| var isSpecial = (mQuery.inArray(fieldType, ['leadlist', 'campaign', 'device_type', 'device_brand', 'device_os', 'lead_email_received', 'lead_email_sent', 'tags', 'multiselect', 'boolean', 'select', 'country', 'timezone', 'region', 'stage', 'locale', 'globalcategory']) != -1); | |
| prototypeStr = prototypeStr.replace(/__name__/g, filterNum); | |
| prototypeStr = prototypeStr.replace(/__label__/g, label); | |
| // Convert to DOM | |
| prototype = mQuery(prototypeStr); | |
| var prefix = 'leadlist'; | |
| var parent = mQuery(filterId).parents('.dynamic-content-filter, .dwc-filter'); | |
| if (parent.length) { | |
| prefix = parent.attr('id'); | |
| } | |
| var filterBase = prefix + "[filters][" + filterNum + "]"; | |
| var filterIdBase = prefix + "_filters_" + filterNum + "_"; | |
| if (isSpecial) { | |
| var templateField = fieldType; | |
| if (fieldType == 'boolean' || fieldType == 'multiselect') { | |
| templateField = 'select'; | |
| } | |
| var template = mQuery('#templates .' + templateField + '-template').clone(); | |
| template.attr('name', mQuery(template).attr('name').replace(/__name__/g, filterNum)); | |
| template.attr('id', mQuery(template).attr('id').replace(/__name__/g, filterNum)); | |
| prototype.find('input[name="' + filterBase + '[filter]"]').replaceWith(template); | |
| } | |
| if (mQuery('#' + prefix + '_filters div.panel').length == 0) { | |
| // First filter so hide the glue footer | |
| prototype.find(".panel-heading").addClass('hide'); | |
| } | |
| if (fieldObject == 'company') { | |
| prototype.find(".object-icon").removeClass('ri-user-6-fill').addClass('ri-building-2-line'); | |
| } else { | |
| prototype.find(".object-icon").removeClass('ri-building-2-line').addClass('ri-user-6-fill'); | |
| } | |
| prototype.find(".inline-spacer").append(fieldObject); | |
| prototype.find("a.remove-selected").on('click', function() { | |
| mQuery(this).closest('.panel').animate( | |
| {'opacity': 0}, | |
| 'fast', | |
| function () { | |
| mQuery(this).remove(); | |
| Mautic.reorderSegmentFilters(); | |
| } | |
| ); | |
| }); | |
| prototype.find("input[name='" + filterBase + "[field]']").val(elId); | |
| prototype.find("input[name='" + filterBase + "[type]']").val(fieldType); | |
| prototype.find("input[name='" + filterBase + "[object]']").val(fieldObject); | |
| var filterEl = (isSpecial) ? "select[name='" + filterBase + "[filter]']" : "input[name='" + filterBase + "[filter]']"; | |
| prototype.appendTo('#' + prefix + '_filters'); | |
| var filter = mQuery('#' + filterIdBase + 'filter'); | |
| //activate fields | |
| if (isSpecial) { | |
| if (fieldType == 'select' || fieldType == 'multiselect' || fieldType == 'boolean' || fieldType == 'leadlist') { | |
| // Generate the options | |
| var fieldOptions = filterOption.data("field-list"); | |
| mQuery.each(fieldOptions, function(val, index) { | |
| if (mQuery.isPlainObject(index)) { | |
| var optGroup = index; | |
| mQuery.each(optGroup, function(value, index) { | |
| mQuery('<option class="' + optGroup + '">').val(index).text(value).appendTo(filterEl); | |
| }); | |
| mQuery('.' + index).wrapAll("<optgroup label='"+index+"' />"); | |
| } else { | |
| mQuery('<option>').val(index).text(val).appendTo(filterEl); | |
| } | |
| }); | |
| } | |
| } else if (fieldType == 'lookup') { | |
| var fieldCallback = filterOption.data("field-callback"); | |
| if (fieldCallback && typeof Mautic[fieldCallback] == 'function') { | |
| var fieldOptions = filterOption.data("field-list"); | |
| Mautic[fieldCallback](filterIdBase + 'filter', elId, fieldOptions); | |
| } else { | |
| filter.attr('data-target', alias); | |
| Mautic.activateLookupTypeahead(filter.parent()); | |
| } | |
| } else if (fieldType == 'datetime') { | |
| filter.datetimepicker({ | |
| format: 'Y-m-d H:i', | |
| lazyInit: true, | |
| validateOnBlur: false, | |
| allowBlank: true, | |
| scrollMonth: false, | |
| scrollInput: false | |
| }); | |
| } else if (fieldType == 'date') { | |
| filter.datetimepicker({ | |
| timepicker: false, | |
| format: 'Y-m-d', | |
| lazyInit: true, | |
| validateOnBlur: false, | |
| allowBlank: true, | |
| scrollMonth: false, | |
| scrollInput: false, | |
| closeOnDateSelect: true | |
| }); | |
| } else if (fieldType == 'time') { | |
| filter.datetimepicker({ | |
| datepicker: false, | |
| format: 'H:i', | |
| lazyInit: true, | |
| validateOnBlur: false, | |
| allowBlank: true, | |
| scrollMonth: false, | |
| scrollInput: false | |
| }); | |
| } else if (fieldType == 'lookup_id') { | |
| //switch the filter and display elements | |
| var oldFilter = mQuery(filterEl); | |
| var newDisplay = oldFilter.clone(); | |
| newDisplay.attr('name', filterBase + '[display]') | |
| .attr('id', filterIdBase + 'display'); | |
| var oldDisplay = prototype.find("input[name='" + filterBase + "[display]']"); | |
| var newFilter = mQuery(oldDisplay).clone(); | |
| newFilter.attr('name', filterBase + '[filter]'); | |
| newFilter.attr('id', filterIdBase + 'filter'); | |
| oldFilter.replaceWith(newFilter); | |
| oldDisplay.replaceWith(newDisplay); | |
| var fieldCallback = filterOption.data("field-callback"); | |
| if (fieldCallback && typeof Mautic[fieldCallback] == 'function') { | |
| var fieldOptions = filterOption.data("field-list"); | |
| Mautic[fieldCallback](filterIdBase + 'display', elId, fieldOptions); | |
| } | |
| } else { | |
| filter.attr('type', fieldType); | |
| } | |
| var operators = filterOption.data('field-operators'); | |
| mQuery('#' + filterIdBase + 'operator').html(''); | |
| mQuery.each(operators, function (label, value) { | |
| var newOption = mQuery('<option/>').val(value).text(label); | |
| newOption.appendTo(mQuery('#' + filterIdBase + 'operator')); | |
| }); | |
| // Convert based on first option in list | |
| Mautic.convertDwcFilterInput('#' + filterIdBase + 'operator'); | |
| // Reposition if applicable | |
| Mautic.updateFilterPositioning(mQuery('#' + filterIdBase + 'glue')); | |
| }; | |
| Mautic.convertDwcFilterInput = function(el) { | |
| var prefix = 'leadlist'; | |
| var parent = mQuery(el).parents('.dynamic-content-filter, .dwc-filter'); | |
| if (parent.length) { | |
| prefix = parent.attr('id'); | |
| } | |
| var operator = mQuery(el).val(); | |
| // Extract the filter number | |
| var regExp = /_filters_(\d+)_operator/; | |
| var matches = regExp.exec(mQuery(el).attr('id')); | |
| var filterNum = matches[1]; | |
| var filterId = '#' + prefix + '_filters_' + filterNum + '_filter'; | |
| // Reset has-error | |
| if (mQuery(filterId).parent().hasClass('has-error')) { | |
| mQuery(filterId).parent().find('div.help-block').hide(); | |
| mQuery(filterId).parent().removeClass('has-error'); | |
| } | |
| var disabled = (operator == 'empty' || operator == '!empty'); | |
| mQuery(filterId+', #' + prefix + '_filters_' + filterNum + '_display').prop('disabled', disabled); | |
| if (disabled) { | |
| mQuery(filterId).val(''); | |
| } | |
| var newName = ''; | |
| var lastPos; | |
| if (mQuery(filterId).is('select')) { | |
| var isMultiple = mQuery(filterId).attr('multiple'); | |
| var multiple = (operator == 'in' || operator == '!in'); | |
| var placeholder = mQuery(filterId).attr('data-placeholder'); | |
| if (multiple && !isMultiple) { | |
| mQuery(filterId).attr('multiple', 'multiple'); | |
| // Update the name | |
| newName = mQuery(filterId).attr('name') + '[]'; | |
| mQuery(filterId).attr('name', newName); | |
| placeholder = mauticLang['chosenChooseMore']; | |
| } else if (!multiple && isMultiple) { | |
| mQuery(filterId).removeAttr('multiple'); | |
| // Update the name | |
| newName = mQuery(filterId).attr('name'); | |
| lastPos = newName.lastIndexOf('[]'); | |
| newName = newName.substring(0, lastPos); | |
| mQuery(filterId).attr('name', newName); | |
| placeholder = mauticLang['chosenChooseOne']; | |
| } | |
| if (multiple) { | |
| // Remove empty option | |
| mQuery(filterId).find('option[value=""]').remove(); | |
| // Make sure none are selected | |
| mQuery(filterId + ' option:selected').removeAttr('selected'); | |
| } else { | |
| // Add empty option | |
| mQuery(filterId).prepend("<option value='' selected></option>"); | |
| } | |
| // Destroy the chosen and recreate | |
| Mautic.destroyChosen(mQuery(filterId)); | |
| mQuery(filterId).attr('data-placeholder', placeholder); | |
| Mautic.activateChosenSelect(mQuery(filterId)); | |
| } | |
| }; | |
| Mautic.standardDynamicContentUrl = function(options) { | |
| if (!options) { | |
| return; | |
| } | |
| var url = options.windowUrl; | |
| if (url) { | |
| var editDynamicContentKey = '/dwc/edit/dynamicContentId'; | |
| var previewDynamicContentKey = '/dwc/preview/dynamicContentId'; | |
| if (url.indexOf(editDynamicContentKey) > -1 || | |
| url.indexOf(previewDynamicContentKey) > -1) { | |
| options.windowUrl = url.replace('dynamicContentId', mQuery('#campaignevent_properties_dynamicContent').val()); | |
| } | |
| } | |
| return options; | |
| }; | |
| Mautic.disabledDynamicContentAction = function(opener) { | |
| if (typeof opener == 'undefined') { | |
| opener = window; | |
| } | |
| var dynamicContent = opener.mQuery('#campaignevent_properties_dynamicContent').val(); | |
| var disabled = dynamicContent === '' || dynamicContent === null; | |
| opener.mQuery('#campaignevent_properties_editDynamicContentButton').prop('disabled', disabled); | |
| }; | |
| if (typeof MauticIsDwcReady === 'undefined') { | |
| var MauticIsDwcReady = true; | |
| if ( | |
| document.readyState === "complete" || | |
| !(document.readyState === "loading" || document.documentElement.doScroll) | |
| ) { | |
| Mautic.dynamicContentOnLoad(); | |
| } else { | |
| document.addEventListener("DOMContentLoaded", Mautic.dynamicContentOnLoad); | |
| } | |
| } | |