Spaces:
No application file
No application file
| //ReportBundle | |
| Mautic.reportOnLoad = function (container) { | |
| // Activate search if the container exists | |
| if (mQuery(container + ' #list-search').length) { | |
| Mautic.activateSearchAutocomplete('list-search', 'report'); | |
| } | |
| // Append an index of the number of filters on the edit form | |
| if (mQuery('div[id=report_filters]').length) { | |
| mQuery('div[id=report_filters]').attr('data-index', Mautic.getHighestIndex('report_filters')); | |
| mQuery('div[id=report_tableOrder]').attr('data-index', Mautic.getHighestIndex('report_tableOrder')); | |
| mQuery('div[id=report_aggregators]').attr('data-index', Mautic.getHighestIndex('report_aggregators')); | |
| if (mQuery('.filter-columns').length) { | |
| mQuery('.filter-columns').each(function () { | |
| Mautic.updateReportFilterValueInput(this, true); | |
| mQuery(this).on('change', function () { | |
| Mautic.updateReportFilterValueInput(this); | |
| }); | |
| }); | |
| } | |
| } else { | |
| mQuery('#report-shelves .collapse').on('show.bs.collapse', function (e) { | |
| var actives = mQuery('#report-shelves').find('.in, .collapsing'); | |
| actives.each(function (index, element) { | |
| mQuery(element).collapse('hide'); | |
| var id = mQuery(element).attr('id'); | |
| mQuery('a[aria-controls="' + id + '"]').addClass('collapsed'); | |
| }) | |
| }) | |
| } | |
| Mautic.updateReportGlueTriggers(); | |
| Mautic.checkSelectedGroupBy(); | |
| Mautic.initDateRangePicker(); | |
| var $isScheduled = mQuery('[data-report-schedule="isScheduled"]'); | |
| var $unitTypeId = mQuery('[data-report-schedule="scheduleUnit"]'); | |
| var $scheduleDay = mQuery('[data-report-schedule="scheduleDay"]'); | |
| var $scheduleMonthFrequency = mQuery('[data-report-schedule="scheduleMonthFrequency"]'); | |
| mQuery($isScheduled).change(function () { | |
| Mautic.scheduleDisplay($isScheduled, $unitTypeId, $scheduleDay, $scheduleMonthFrequency); | |
| }); | |
| mQuery($unitTypeId).change(function () { | |
| Mautic.scheduleDisplay($isScheduled, $unitTypeId, $scheduleDay, $scheduleMonthFrequency); | |
| }); | |
| mQuery($scheduleDay).change(function () { | |
| Mautic.schedulePreview($isScheduled, $unitTypeId, $scheduleDay, $scheduleMonthFrequency); | |
| }); | |
| mQuery($scheduleMonthFrequency).change(function () { | |
| Mautic.schedulePreview($isScheduled, $unitTypeId, $scheduleDay, $scheduleMonthFrequency); | |
| }); | |
| Mautic.scheduleDisplay($isScheduled, $unitTypeId, $scheduleDay, $scheduleMonthFrequency); | |
| jQuery(document).ajaxComplete(function(){ | |
| Mautic.ajaxifyForm('daterange'); | |
| }); | |
| }; | |
| Mautic.scheduleDisplay = function ($isScheduled, $unitTypeId, $scheduleDay, $scheduleMonthFrequency) { | |
| Mautic.checkIsScheduled($isScheduled); | |
| var unitVal = mQuery($unitTypeId).val(); | |
| mQuery('#scheduleDay, #scheduleDay label, #scheduleMonthFrequency').hide(); | |
| if (unitVal === 'WEEKLY' || unitVal === 'MONTHLY') { | |
| mQuery('#scheduleDay').show(); | |
| } | |
| if (unitVal === 'MONTHLY') { | |
| mQuery('#scheduleMonthFrequency').show(); | |
| mQuery('#scheduleDay label').hide(); | |
| } else { | |
| mQuery('#scheduleDay label').show(); | |
| } | |
| if($isScheduled.length) { | |
| Mautic.schedulePreview($isScheduled, $unitTypeId, $scheduleDay, $scheduleMonthFrequency); | |
| } | |
| }; | |
| Mautic.schedulePreview = function ($isScheduled, $unitTypeId, $scheduleDay, $scheduleMonthFrequency) { | |
| var previewUrl = mQuery('#schedule_preview_url').data('url'); | |
| var $schedulePreviewData = mQuery('#schedule_preview_data'); | |
| var isScheduledVal = 0; | |
| if (!mQuery($isScheduled).prop("checked")) { //$isScheduled.val() does not work | |
| isScheduledVal = 1; | |
| } | |
| if (!isScheduledVal) { | |
| $schedulePreviewData.hide(); | |
| return; | |
| } | |
| var unitVal = mQuery($unitTypeId).val(); | |
| var scheduleDayVal = mQuery($scheduleDay).val(); | |
| var scheduleMonthFrequencyVal = mQuery($scheduleMonthFrequency).val(); | |
| mQuery.get( | |
| previewUrl + '/' + isScheduledVal + '/' + unitVal + '/' + scheduleDayVal + '/' + scheduleMonthFrequencyVal, | |
| function( data ) { | |
| if (!data.html) { | |
| return; | |
| } | |
| mQuery("#schedule_preview_data_content").html(data.html); | |
| $schedulePreviewData.show(); | |
| } | |
| ); | |
| }; | |
| Mautic.checkIsScheduled = function ($isScheduled) { | |
| var $scheduleForm = mQuery('#schedule-container .schedule_form'); | |
| if (!mQuery($isScheduled).prop("checked")) { | |
| $scheduleForm.show(); | |
| return; | |
| } | |
| $scheduleForm.hide(); | |
| }; | |
| /** | |
| * Written with inspiration from http://symfony.com/doc/current/cookbook/form/form_collections.html#allowing-new-tags-with-the-prototype | |
| */ | |
| Mautic.addReportRow = function (elId) { | |
| // Container with the prototype markup | |
| var prototypeHolder = mQuery('div[id="' + elId + '"]'); | |
| // Fetch the index | |
| var index = parseInt(prototypeHolder.attr('data-index')); | |
| if (!index) { | |
| index = 0; | |
| } | |
| index++; | |
| // Fetch the prototype markup | |
| var prototype = prototypeHolder.data('prototype'); | |
| // Replace the placeholder with our index | |
| var output = prototype.replace(/__name__/g, index); | |
| // Increase the index for the next row | |
| prototypeHolder.attr('data-index', index); | |
| // Render the new row | |
| prototypeHolder.append(output); | |
| var newColumnId = '#' + elId + '_' + index + '_column'; | |
| if (elId == 'report_filters') { | |
| if (typeof Mautic.reportPrototypeFilterOptions != 'undefined') { | |
| // Update the column options if applicable | |
| mQuery(newColumnId).html(Mautic.reportPrototypeFilterOptions); | |
| } | |
| // Add `in-group` class by default | |
| mQuery('#report_filters_' + index + '_container').addClass('in-group'); | |
| mQuery(newColumnId).on('change', function () { | |
| Mautic.updateReportFilterValueInput(this); | |
| }); | |
| Mautic.updateReportFilterValueInput(newColumnId); | |
| Mautic.updateReportGlueTriggers(); | |
| } else if (typeof Mautic.reportPrototypeColumnOptions != 'undefined') { | |
| // Update the column options if applicable | |
| mQuery(newColumnId).html(Mautic.reportPrototypeColumnOptions.clone()); | |
| } | |
| Mautic.activateChosenSelect(mQuery('#' + elId + '_' + index + '_column')); | |
| mQuery("#" + elId + " *[data-toggle='tooltip']").tooltip({html: true, container: 'body'}); | |
| }; | |
| Mautic.updateReportGlueTriggers = function () { | |
| var filterContainer = mQuery('#report_filters'); | |
| var glueEl = filterContainer.find('.filter-glue'); | |
| glueEl.off('change'); | |
| glueEl.on('change', function () { | |
| var $this = mQuery(this); | |
| if ($this.val() === 'and') { | |
| $this.parents('.panel').addClass('in-group'); | |
| } else { | |
| $this.parents('.panel').removeClass('in-group'); | |
| } | |
| }); | |
| }; | |
| Mautic.updateReportFilterValueInput = function (filterColumn, setup) { | |
| var definitions = (typeof Mautic.reportPrototypeFilterDefinitions != 'undefined') ? Mautic.reportPrototypeFilterDefinitions : mQuery('#report_filters').data('filter-definitions'); | |
| var operators = (typeof Mautic.reportPrototypeFilterOperators != 'undefined') ? Mautic.reportPrototypeFilterOperators : mQuery('#report_filters').data('filter-operators'); | |
| var newValue = mQuery(filterColumn).val(); | |
| if (!newValue) { | |
| return; | |
| } | |
| var filterId = mQuery(filterColumn).attr('id'); | |
| var filterType = definitions[newValue].type; | |
| // Get the value element | |
| var valueEl = mQuery(filterColumn).parent().parent().find('.filter-value'); | |
| var valueVal = valueEl.val(); | |
| var idParts = filterId.split("_"); | |
| var valueId = 'report_filters_' + idParts[2] + '_value'; | |
| var valueName = 'report[filters][' + idParts[2] + '][value]'; | |
| // Replace the condition list with operators | |
| var currentOperator = mQuery('#report_filters_' + idParts[2] + '_condition').val(); | |
| mQuery('#report_filters_' + idParts[2] + '_condition').html(operators[newValue]); | |
| if (mQuery('#report_filters_' + idParts[2] + '_condition option[value="' + currentOperator + '"]').length > 0) { | |
| mQuery('#report_filters_' + idParts[2] + '_condition').val(currentOperator); | |
| } | |
| // Replace the value field appropriately | |
| Mautic.destroyChosen(mQuery('#' + valueId)); | |
| if (filterType == 'bool' || filterType == 'boolean') { | |
| if (mQuery(valueEl).attr('type') != 'radio') { | |
| var template = mQuery('#filterValueYesNoTemplate .btn-group').clone(true); | |
| mQuery(template).find('input[type="radio"]').each(function () { | |
| mQuery(this).attr('name', valueName); | |
| var radioVal = mQuery(this).val(); | |
| mQuery(this).attr('id', valueId + '_' + radioVal); | |
| }); | |
| mQuery(valueEl).replaceWith(template); | |
| } | |
| if (setup) { | |
| mQuery('#' + valueId + '_' + valueVal).click(); | |
| } | |
| } else if (mQuery(valueEl).attr('type') != 'text') { | |
| var newValueEl = mQuery('<input type="text" />').attr({ | |
| id: valueId, | |
| name: valueName, | |
| 'class': "form-control filter-value" | |
| }); | |
| var replaceMe = (mQuery(valueEl).attr('type') == 'radio') ? mQuery(valueEl).parent().parent() : mQuery(valueEl); | |
| replaceMe.replaceWith(newValueEl); | |
| } | |
| if ((filterType == 'multiselect' || filterType == 'select') && typeof definitions[newValue].list != 'undefined') { | |
| // Activate a chosen | |
| var currentValue = mQuery(valueEl).val(); | |
| var attr = { | |
| id: valueId, | |
| name: valueName, | |
| "class": 'form-control filter-value', | |
| }; | |
| if (filterType == 'multiselect') { | |
| attr.name += '[]'; | |
| attr.multiple = true; | |
| currentValue = (typeof currentValue !== 'undefined') ? currentValue.split(",") : null; | |
| } | |
| var newSelect = mQuery('<select />', attr); | |
| mQuery.each(definitions[newValue].list, function (value, label) { | |
| var newOption = mQuery('<option />') | |
| .val(value) | |
| .html(label); | |
| if (value == currentValue && filterType != 'multiselect') { | |
| newOption.prop('selected', true); | |
| } | |
| newOption.appendTo(newSelect); | |
| }); | |
| if (filterType == 'multiselect') { | |
| newSelect.val(currentValue); | |
| } | |
| mQuery(valueEl).replaceWith(newSelect); | |
| Mautic.activateChosenSelect(newSelect); | |
| } | |
| // Activate datetime | |
| if (filterType == 'datetime' || filterType == 'date' || filterType == 'time') { | |
| Mautic.activateDateTimeInputs('#' + valueId, filterType); | |
| } else if (mQuery('#' + valueId).hasClass('calendar-activated')) { | |
| mQuery('#' + valueId).datetimepicker('destroy'); | |
| } | |
| }; | |
| Mautic.removeReportRow = function (container) { | |
| mQuery("#" + container + " *[data-toggle='tooltip']").tooltip('destroy'); | |
| mQuery('#' + container).remove(); | |
| }; | |
| Mautic.updateReportSourceData = function (context) { | |
| Mautic.activateLabelLoadingIndicator('report_source'); | |
| mQuery.ajax({ | |
| url: mauticAjaxUrl, | |
| type: 'post', | |
| data: "action=report:getSourceData&context=" + context, | |
| success: function (response) { | |
| mQuery('#report_columns').html(response.columns); | |
| mQuery('#report_columns').multiSelect('refresh'); | |
| mQuery('#report_groupBy').html(response.columns); | |
| mQuery('#report_groupBy').multiSelect('refresh'); | |
| // Remove any filters, they're no longer valid with different column lists | |
| mQuery('#report_filters').find('div').remove().end(); | |
| // Reset index | |
| mQuery('#report_filters').data('index', 0); | |
| // Update columns | |
| Mautic.reportPrototypeColumnOptions = mQuery(response.columns); | |
| // Remove order | |
| mQuery('#report_tableOrder').find('div').remove().end(); | |
| // Reset index | |
| mQuery('#report_tableOrder').data('index', 0); | |
| mQuery('#report_aggregators').find('div').remove().end(); | |
| // Reset index | |
| mQuery('#report_aggregators').data('index', 0); | |
| // Update filter list | |
| Mautic.reportPrototypeFilterDefinitions = response.filterDefinitions; | |
| Mautic.reportPrototypeFilterOptions = response.filters; | |
| Mautic.reportPrototypeFilterOperators = response.filterOperators; | |
| mQuery('#report_graphs').html(response.graphs); | |
| mQuery('#report_graphs').multiSelect('refresh'); | |
| if (!response.graphs) { | |
| mQuery('#graphs-container').addClass('hide'); | |
| mQuery('#graphs-tab').addClass('hide'); | |
| } else { | |
| mQuery('#graphs-container').removeClass('hide'); | |
| mQuery('#graphs-tab').removeClass('hide'); | |
| } | |
| }, | |
| error: function (request, textStatus, errorThrown) { | |
| Mautic.processAjaxError(request, textStatus, errorThrown); | |
| }, | |
| complete: function () { | |
| Mautic.removeLabelLoadingIndicator(); | |
| } | |
| }); | |
| }; | |
| Mautic.checkReportCondition = function (selector) { | |
| var option = mQuery('#' + selector + ' option:selected').val(); | |
| var valueInput = selector.replace('condition', 'value'); | |
| // Disable the value input if the condition is empty or notEmpty | |
| if (option == 'empty' || option == 'notEmpty') { | |
| mQuery('#' + valueInput).prop('disabled', true).trigger('chosen:updated'); | |
| } else { | |
| mQuery('#' + valueInput).prop('disabled', false).trigger('chosen:updated'); | |
| } | |
| }; | |
| Mautic.checkSelectedGroupBy = function () { | |
| var selectedOption = mQuery("select[name='report[groupBy][]'] option:selected").length; | |
| var existingAggregators = mQuery("select[name*='report[aggregators]']"); | |
| if (selectedOption > 0) { | |
| mQuery('#aggregators-button').prop('disabled', false); | |
| } else { | |
| existingAggregators.each(function() { | |
| var containerId = mQuery(this).attr('id').replace('_column', ''); | |
| Mautic.removeReportRow(containerId + '_container'); | |
| }); | |
| mQuery('#aggregators-button').prop('disabled', true); | |
| } | |
| }; | |
| Mautic.getHighestIndex = function (selector) { | |
| var highestIndex = 1; | |
| var selectorChildren = mQuery('#' + selector + ' > div'); | |
| selectorChildren.each(function() { | |
| var index = parseInt(mQuery(this).attr('id').split('_')[2]); | |
| highestIndex = (index > highestIndex) ? index : highestIndex; | |
| }); | |
| return parseInt(highestIndex); | |
| }; | |