/************************************* * SPDX-FileCopyrightText: 2009-2020 Vtenext S.r.l. * SPDX-License-Identifier: AGPL-3.0-only ************************************/ /* crmv@100905 */ /* crmv@98866 */ var EditReport = { mode: '', busy: false, modulesCache: {}, fieldsCache: {}, totalsFieldsCache: {}, addedFirstAdvGroup: false, blockFrame: function() { VteJS_DialogBox.block(undefined, 0.2); }, unblockFrame: function() { VteJS_DialogBox.unblock(); }, showBusy: function() { var me = this; me.busy = true; jQuery('#editreport_busy').show(); me.blockFrame(); }, hideBusy: function() { var me = this; me.busy = false; jQuery('#editreport_busy').hide(); me.unblockFrame(); }, ajaxCall: function(action, params, options, callback) { var me = this; // return if busy if (me.busy) return; options = jQuery.extend({}, { jsonData: true, includeForm: false, }, options || {}); params = params || {}; var url = "index.php?module=Reports&action=ReportsAjax&file=EditReportAjax&subaction="+action; if (options.includeForm) { var form = jQuery('#NewReport').serialize(); params = jQuery.param(params) + '&' + form; } me.showBusy(); jQuery.ajax({ url: url, type: 'POST', async: true, data: params, success: function(data) { me.hideBusy(); if (options.hidePopupMessage) me.hidePopupMessage(); if (options.jsonData) { // data should be json with a success property try { data = JSON.parse(data); } catch (e) { data = null; } if (data && data.success) { if (typeof callback == 'function') callback(data); } else if (data && data.error) { alert(data.error); } else { console.log('Unknown error'); console.log(data); } } else { if (typeof callback == 'function') callback(data); } }, error: function() { me.hideBusy(); if (options.hidePopupMessage) me.hidePopupMessage(); if (options.callbackOnError) { if (typeof callback == 'function') callback(); } } }); }, // crmv@128369 prepareAdvFilters: function(containerid) { var me = this; var advfilters = []; jQuery('#'+containerid+' div.advFilterGroup').each(function() { var groupfields = []; jQuery('select.filterFields', this).each(function() { var row = jQuery(this).closest('tr'); var name = JSON.parse(this.value); var comparator = jQuery('select[name=advFilterComparator]', row).val(); var refid = null; var refchain = null; var reference = jQuery('input[name=advFilterReferenceValue]', row).val(); if (reference) { reference = JSON.parse(reference); refid = reference.fieldid; refchain = reference.chain; } var cond = { fieldid: name.fieldid, chain: name.chain, comparator: comparator, value: jQuery('input[name=advFilterValue]', row).val(), value2: (comparator == 'bw' ? jQuery('input[name=advFilterValue2]', row).val() : null), glue: jQuery('select[name=advFilterGlue]', row).val(), reference: !!reference, reffieldid: refid, refchain: refchain }; groupfields.push(cond); }); advfilters.push({ conditions: groupfields, glue: jQuery('div.advFilterGroupGlue select', this).val(), }); }); return advfilters; }, // crmv@128369e saveReport: function() { var me = this, reptype = jQuery('input[name=reportType]:checked').val(), step = me.getCurrentStep(); // validate this step if (!me.validateStep(step)) return; // prepare the fields var selfields = []; jQuery('#selectedfields .selectedField').each(function() { var value = jQuery('input[name=fldvalue]', this).val(); selfields.push(JSON.parse(value)); }); // stdfilters var stdfilters = []; jQuery('#stdFiltersTable select.filterFields').each(function() { var row = jQuery(this).closest('tr'), rowid = row.attr('id'); if (rowid && rowid.match('Master')) return; if (!this.value) return; var name = JSON.parse(this.value); var cond = { fieldid: name.fieldid, chain: name.chain, value: jQuery('select[name=stdDateFilter]', row).val(), startdate: jQuery('input[name=startdate]', row).val(), enddate: jQuery('input[name=enddate]', row).val(), }; stdfilters.push(cond); }); // crmv@128369 var advfilters = me.prepareAdvFilters('advFiltersContainer'); var clusters = jQuery('#clusters').val(); // already json // crmv@128369e // totals and summary var totals = []; var summary = []; jQuery('#totalsTable select.summaryFields').each(function(idx) { if (idx == 0) return; // skip the first var val = jQuery(this).val(); var cont = jQuery(this).closest('tr'); var allformulas = cont.find('input[name^=aggregator]'); var aggregators = []; // check if at least one formula is checked if (val && allformulas.is(':checked')) { val = JSON.parse(val); allformulas.each(function() { if (jQuery(this).is(':checked')) { var aggr = this.name.replace('aggregator', ''); aggregators.push(aggr); var tot = jQuery.extend({}, val, {aggregator: aggr}); totals.push(tot); } }); if (cont.find('input.summaryTotal').is(':checked')) { var summ = jQuery.extend({}, val, {aggregators: aggregators}); summary.push(summ); } } }); var sharinginfo = []; jQuery('#sharedmembers option').each(function() { sharinginfo.push(this.value); }); var chartinfo = {}; if (reptype == 'summary' && jQuery('#chartCheckbox').is(':checked')) { jQuery('#chartEditor :input').each(function() { if (this.name) { chartinfo[this.name] = jQuery(this).val(); } }); } // crmv@139057 var scheduling = {}; if (jQuery("#isReportScheduled").is(':checked') && jQuery('#scheduledReportFormat').length > 0) { var selectedUsers = [], selectedGroups = [], selectedRoles = [], selectedRolesAndSub = []; scheduling.format = jQuery('#scheduledReportFormat').val(); var recipOpts = jQuery('#selectedRecipients option'); recipOpts.each(function(idx, opt) { var selectedColArr = opt.value.split("::"); if(selectedColArr[0] == "users") selectedUsers.push(selectedColArr[1]); else if(selectedColArr[0] == "groups") selectedGroups.push(selectedColArr[1]); else if(selectedColArr[0] == "roles") selectedRoles.push(selectedColArr[1]); else if(selectedColArr[0] == "rs") selectedRolesAndSub.push(selectedColArr[1]); }); var selectedRecipients = { users: selectedUsers, groups: selectedGroups, roles: selectedRoles, rs: selectedRolesAndSub }; scheduling.recipients = selectedRecipients; var scheduledInterval = { scheduletype: document.NewReport.scheduledType.value, month: document.NewReport.scheduledMonth.value, date: document.NewReport.scheduledDOM.value, day: document.NewReport.scheduledDOW.value, time: document.NewReport.scheduledTime.value }; scheduling.schedule = scheduledInterval; } // crmv@139057e var params = { selectedfields: JSON.stringify(selfields), stdfilters: JSON.stringify(stdfilters), advfilters: JSON.stringify(advfilters), clusters: clusters, // crmv@128369 totals: JSON.stringify(totals), summary: JSON.stringify(summary), sharinginfo: JSON.stringify(sharinginfo), chartinfo: JSON.stringify(chartinfo), scheduling: JSON.stringify(scheduling), // crmv@139057 }; // crmv@172355 - validate global save var charts_count = jQuery('#existing_charts').val(); if (charts_count > 0) { // check if there is summary var hasSummary = false; if (reptype == 'summary') { for (var i=0; i lastStep) return false; // check if cluster step is present and fix the step var hasCluster = (jQuery('#reportStep5').length > 0); if (!hasCluster && step == 5) { if (step < currStep) { --step; } else { ++step; } } // crmv@139057 // check if report has charts var hasCharts = (jQuery('#reportStep9').length > 0); if (!hasCharts && step == 9) { if (step < currStep) { --step; } else { ++step; } } // crmv@139057e if (step != currStep) { var valid = (step < currStep || me.validateStep(currStep)); if (valid) { jQuery('#reportStep'+currStep).hide(); jQuery('#reportStep'+step).show(); jQuery('#step'+(currStep)+'label').removeClass('reportStepCellSelected'); jQuery('#step'+(step)+'label').addClass('reportStepCellSelected'); jQuery('#nextButton')[step == lastStep ? 'hide' : 'show'](); jQuery('#saveButton')[step == lastStep ? 'show' : 'hide'](); jQuery('#backButton')[step == 1 ? 'hide' : 'show'](); return me.initializeStep(step); } } return false; }, // crmv@128369e gotoNextStep: function() { var me = this, step = me.getCurrentStep(); me.gotoStep(step+1); }, gotoPrevStep: function() { var me = this, step = me.getCurrentStep(); me.gotoStep(step-1); }, initializeStep: function(step) { var me = this, fname = 'initializeStep'+step; if (typeof me[fname] == 'function') { return me[fname](); } return true; }, validateStep: function(step) { var me = this, fname = 'validateStep'+step; if (typeof me[fname] == 'function') { return me[fname](); } return true; }, initializeStep1: function() { var me = this, reportid = me.getReportId(); if (reportid > 0) me.mode = 'edit'; else me.mode = 'create'; }, validateStep1: function() { var me = this; if (!jQuery('#reportname').val()) { var label = jQuery('#reportname').closest('tr').find('td span').text(); alert(label+" "+alert_arr.IS_MANDATORY_FIELD); return false; } if (jQuery('#createNewFolderRow').is(':visible') && !jQuery('#reportnewfolder').val()) { var label = jQuery('#reportnewfolder').closest('tr').find('td span').text(); alert(label+" "+alert_arr.IS_MANDATORY_FIELD); return false; } return true; }, initializeStep3: function() { var me = this, modlabel = me.getMainModuleLabel(), stdcont = jQuery('#stdFiltersTable'); stdcont.find('.chainMainModule').text(modlabel); // now populate the standard filters var chain = me.getModulesChain(jQuery('#stdFilterMasterRow0')); me.fetchModulesList(chain, true, 'stdfilter', function(data) { if (data && data.modules) { me.populateModulesPicklist(jQuery('#stdFilterMasterRow0 select.chainModule'), data.modules); if (data.fields) me.populateFieldsPicklist(jQuery('#stdFilterMasterRow2 select.filterFields'), data.fields, false); // add the filter if not already there! var nrows = stdcont.get(0).rows.length; if (nrows <= 3) { me.addStdFilter(); } } }); }, // crmv@161265 validateStep3: function() { var me = this; var filtertype = jQuery('#stdFiltersTable').find('select[name=stdDateFilter]').last().val(); var value1 = jQuery('#stdFiltersTable').find('input[name=startdate]').last().val(); var value2 = jQuery('#stdFiltersTable').find('input[name=enddate]').last().val(); // if custom is chosen and the start date is set, the end date must be set if (filtertype == 'custom' && value1 != '') { if (value2 == '') { alert(alert_arr.ENTER_VALID+' '+alert_arr.ENDDATE); return false; } } return true; }, // crmv@161265e initializeStep4: function() { var me = this, modlabel = me.getMainModuleLabel(), mastercont = jQuery('#advFiltersMaster'), cont = jQuery('#advFiltersContainer'); mastercont.find('.chainMainModule').text(modlabel); cont.find('.chainMainModule').text(modlabel); var chain = me.getModulesChain(jQuery('#advFilterMasterRow0')); me.fetchModulesList(chain, true, 'advfilter', function(data) { if (data && data.modules) { me.populateModulesPicklist(jQuery('#advFilterMasterRow0 select.chainModule'), data.modules); if (data.fields) me.populateFieldsPicklist(jQuery('#advFilterMasterRow1 select.filterFields'), data.fields); var nrows = cont.find('.advFilterGroup').length; if (me.mode == 'create' && nrows == 0 && !me.addedFirstAdvGroup) { // prepare an empty group the first time me.addFilterGroup(); me.addedFirstAdvGroup = true; } } }); }, validateStep4: function() { var me = this, valid = true, cont = jQuery('#advFiltersContainer'); cont.find('select[name=advFilterComparator]').each(function() { var cond = jQuery(this).closest('tr'), opt = cond.find('select.filterFields option:selected'), label = opt.text(), finfo = (opt ? opt.data() : {}), comparator = jQuery(this).val(), value = cond.find('input[name=advFilterValue]').val(), value2 = cond.find('input[name=advFilterValue2]').val(), refvalue = cond.find('input[name=advFilterReferenceValue]').val(); // check for empty comparators if (!comparator) { alert(alert_arr.MISSING_COMPARATOR); valid = false; return false; } // now check the single fields if (!me.validateField(label, finfo, comparator, value, value2, refvalue)) { valid = false; return false; } }); return valid; }, // crmv@128369 initializeStep5: function() { var me = this; var text = ''; var indent = ''; // show the chosen advanced filters var ngroups = jQuery('#advFiltersContainer .advFilterGroup').length; jQuery('#advFiltersContainer .advFilterGroup').each(function(idx, item) { var groupglue = jQuery(item).find('div.advFilterGroupGlue').find('select option:selected').text(); if (ngroups > 1) { text += "(\n"; indent = "\t"; } var nconds = jQuery(item).find('.filterFields').length; jQuery(item).find('.filterFields').each(function(idx2, item2) { var row = jQuery(item2).closest('tr'); var fieldlabel = jQuery(item2).find('option:selected').text(); var comparator = row.find('select[name=advFilterComparator]').val(); var complabel = row.find('select[name=advFilterComparator] option:selected').text(); var value = row.find('input[name=advFilterValue]').val(); var value2 = row.find('input[name=advFilterValue2]').val(); var valueref = row.find('input[name=advFilterReferenceLabel]').val(); var glue = row.find('select[name=advFilterGlue] option:selected').text(); var condtext = indent + fieldlabel + ' ' + complabel + ' '; if (comparator == 'bw') { condtext += '"' + value + '" ' + alert_arr.LBL_AND + ' "' + value2 + '"'; } else { if (valueref) { condtext += valueref; } else { condtext += '"' + value + '"'; } } if (idx2 < nconds-1) { condtext += ' ' + glue; } text += condtext + "\n"; }); if (ngroups > 1) text += ')'; if (idx < ngroups-1) { text += ' ' + groupglue + "\n"; } }); // now translate to html text = text.replace(/\n/g, "
\n").replace(/\t/g, "    "); jQuery('#filterListReviewContent').html(text); if (text == '') { jQuery('#filterListReview').hide(); } else { jQuery('#filterListReview').show(); } }, // crmv@128369e validateField: function(label, fieldinfo, comparator, value, value2, refvalue) { var me = this, uitype = fieldinfo.uitype, wstype = fieldinfo.wstype; // if it's empty or a reference, don't check the field value if (refvalue) return true; // allow empty comparison when checking equal or different if (!value && (comparator == 'e' || comparator == 'n')) return true; if (wstype == 'integer') { return intValidate(fieldinfo.fieldname,label, uitype, value); } else if (wstype == 'double' || wstype == 'currency') { return numValidate(fieldinfo.fieldname,label,"any",true, uitype, value); } else if (wstype == 'boolean') { if (value != '0' && value != '1' && value != 'yes' && value != 'no') { alert(alert_arr.ENTER_VALID+label); return false; } } else if (wstype == 'date') { if (!re_dateValidate(value,label, "OTH")) return false; if (comparator == 'bw') { if (!re_dateValidate(value2,label,"OTH")) return false } } else if (wstype == 'datetime') { var dtime = value.split(" "); if (!re_dateValidate(dtime[0],label, "OTH")) return false; if (dtime.length > 1) { if (!re_patternValidate(dtime[1],label,"TIMESECONDS")) return false; } if (comparator == 'bw') { var dtime2 = value2.split(" "); if (!re_dateValidate(dtime2[0],label,"OTH")) return false if (dtime2.length > 1) { if (!re_patternValidate(dtime2[1],label,"TIMESECONDS")) return false; } } } return true; }, initializeStep6: function() { // crmv@128369 var me = this; reptype = jQuery('input[name=reportType]:checked').val(); var modlabel = me.getMainModuleLabel(); var cont = jQuery('#selectedfields'); // fix dimensions var w = cont.parent().width() - 10; var h = jQuery(document).height() - cont.offset().top - 10; cont.css({ width: w, height: h, }); // make it sortable cont.sortable({ axis: 'x', containment: 'parent', distance: 10, opacity: 0.8, update: function(event, ui) { // reposition to fix grouped fields me.repositionField(jQuery('input[name=fieldGroupCheck]', ui.item)); } }); jQuery('#fieldsMainModule').text(modlabel); jQuery('#fieldsModuleChain1').nextAll('select').remove(); jQuery('#fieldsModuleChain1').nextAll('span.chainArrow').remove(); var chain = me.getModulesChain(jQuery('#fieldsChainModules')); me.fetchModulesList(chain, true, false, function(data) { if (data && data.modules) { me.populateModulesPicklist(jQuery('#fieldsModuleChain1'), data.modules); if (data.fields) me.populateFieldsPicklist(jQuery('#availfields'), data.fields); } }); // check the formulas and grouping for existing fields jQuery('#selectedfields .selectedField').each(function() { var data = jQuery('input[name=flddata]', this).data(); if (me.hasFieldFormula(data)) { me.filterFieldFormula(this); jQuery('tr[name=fieldPropFormula]', this).show(); } if (reptype == 'tabular') { jQuery('tr[name=fieldPropGrouping]', this).hide(); jQuery('input[name=fieldGroupCheck]', this).prop('checked', false); jQuery('tr[name=fieldPropSummary]', this).hide(); jQuery('input[name=fieldSummary]', this).prop('checked', false); jQuery('tr[name=fieldPropSortorder]', this).hide(); } else if (reptype == 'summary') { jQuery('tr[name=fieldPropGrouping]', this).show(); jQuery('tr[name=fieldPropSortorder]', this).show(); } }); }, validateStep6: function() { // crmv@128369 var me = this; if (jQuery('#selectedfields .selectedField').length == 0) { alert(alert_arr.LBL_SELECT_AT_LEAST_ONE_FIELD); return false; } return true; }, initializeStep7: function() { // crmv@128369 var me = this, cont = jQuery('#totalsTable'); var modlabel = me.getMainModuleLabel(); cont.find('.chainMainModule').text(modlabel); var chain = me.getModulesChain(jQuery('#totalsMasterRow0')); me.fetchModulesList(chain, true, 'total', function(data) { if (data && data.modules) { me.populateModulesPicklist(jQuery('#totalsMasterRow0 select.chainModule'), data.modules); if (data.fields) me.populateFieldsPicklist(jQuery('#totalsMasterRow2 select.summaryFields'), data.fields, false); } }); }, initializeStep8: function() { // crmv@128369 var me = this; me.changeSharing(); }, validateStep8: function() { // crmv@128369 var me = this, type = jQuery('#sharingtype').val(); if (type == 'Shared') { if (jQuery('#sharedmembers option').length == 0) { // TODO: alert return false; } } return true; }, initializeStep9: function() { // crmv@128369 var me = this, visible = true; reptype = jQuery('input[name=reportType]:checked').val(); if (reptype != 'summary') { //chart not possible visible = false; } if (visible) { jQuery('#chartNotAvailable').hide(); jQuery('#chartEditor').show(); // automatically set the name if empty if (!jQuery('#chartname').val()) { jQuery('#chartname').val(jQuery('#reportname').val()); } } else { jQuery('#chartNotAvailable').show(); jQuery('#chartEditor').hide(); } }, validateStep9: function() { // crmv@128369 var me = this, checked = jQuery('#chartCheckbox').is(':checked'); if (!checked) return true; // check chart type and name var chtype = jQuery('#chart_type').val(); var chname = jQuery('#chartname').val(); if (!chtype) { var label = jQuery('#chartTypeLabel').text(); alert(alert_arr.ENTER_VALID+' '+label); return false; } else if (!chname) { var label = jQuery('#chartname').closest('td').find('.dvtCellLabel').text(); alert(alert_arr.ENTER_VALID+' '+label); return false; } return true; }, // crmv@139057 initializeStep10: function() { this.setScheduleOptions(); this.generateRecipientOption(); }, validateStep10: function() { var isScheduled = jQuery("#isReportScheduled").is(':checked'); if (isScheduled && jQuery('#scheduledReportFormat').length > 0) { if (jQuery('#selectedRecipients option').length == 0) { alert(alert_arr.LBL_SELECT_RECIPIENTS); return false; } } return true; }, // crmv@139057e getReportId: function() { return parseInt(jQuery('#reportid').val()) || 0; }, getMainModuleLabel: function() { if (jQuery('#primarymodule_display').length > 0) { var modlabel = jQuery('#primarymodule_display').val(); } else { var modlabel = jQuery('#primarymodule option:selected').text(); } return modlabel; }, changePrimaryModule: function() { var me = this; // remove everything me.removeAllStdFilters(); me.removeAllFilterGroups(); me.removeAllFields(); me.removeAllTotalFields(); // remove chart jQuery('#chartCheckbox').prop('checked', false); }, toggleCreateFolder: function() { var me = this; if (jQuery('#selectFolderRow').is(':visible')) { // show create jQuery('#selectFolderRow').hide(); jQuery('#reportnewfolder').val(''); jQuery('#createNewFolderRow').show(); } else { // show choose jQuery('#createNewFolderRow').hide(); jQuery('#reportnewfolder').val(''); jQuery('#selectFolderRow').show(); } }, changeReportType: function() { var me = this, reptype = jQuery('input[name=reportType]:checked').val(); // nothing at the moment }, // crmv@100585 addStdFilter: function() { var me = this, src = [jQuery('#stdFilterMasterRow0'), jQuery('#stdFilterMasterRow1'), jQuery('#stdFilterMasterRow2')], target = jQuery('#stdFiltersTable'); for (var i=0; i= 0) { jQuery(this).show(); } else { jQuery(this).hide(); } }); if (!keepvalues) { optselect.val(''); condvalue.val('').prop('disabled', false); condvalue2.hide().val(''); //condref.val('0'); me.changeFilterComparator(optselect); } }, alignFilterFields: function() { var me = this, cont = jQuery('#advFiltersContainer'); cont.find('select.filterFields').each(function() { me.alignFilterField(this, true); }); }, setReferenceFilter: function(self) { var me = this, cont = jQuery('#CompareField'); var modlabel = me.getMainModuleLabel(); var selectid = jQuery(self).closest('tr').find('select.filterFields').attr('id'); jQuery('#compareFieldRef').val(selectid); cont.find('.chainMainModule').text(modlabel); jQuery('#chainModuleComp1').nextAll('select').remove(); jQuery('#chainModuleComp1').nextAll('span.chainArrow').remove(); var chain = me.getModulesChain(cont.find('.rptChainContainer')); me.fetchModulesList(chain, true, 'advfilter', function(data) { if (data && data.modules) { me.populateModulesPicklist(jQuery('#chainModuleComp1'), data.modules); if (data.fields) me.populateFieldsPicklist(jQuery('#selectCompareField'), data.fields); } showFloatingDiv('CompareField'); }); }, clearReferenceFilter: function(self) { var me = this, cont = jQuery(self).closest('tr'); cont.find('input[name=advFilterReferenceValue]').val('').hide(); cont.find('input[name=advFilterReferenceLabel]').val('').hide(); cont.find('input[name=advFilterValue]').val('').show(); cont.find('input[name=advFilterValue2]').val('').hide(); cont.find('i[name=setReferenceIcon]').show(); cont.find('i[name=clearReferenceIcon]').hide(); }, applyReferenceFilter: function() { var me = this, opt = jQuery('#selectCompareField option:selected'), selectid = jQuery('#compareFieldRef').val(), cont = jQuery('#'+selectid).closest('tr'); cont.find('input[name=advFilterReferenceValue]').val(opt.val()); cont.find('input[name=advFilterReferenceLabel]').val(opt.text()).show(); cont.find('input[name=advFilterValue]').val('').hide(); cont.find('input[name=advFilterValue2]').val('').hide(); cont.find('i[name=setReferenceIcon]').hide(); cont.find('i[name=clearReferenceIcon]').show(); hideFloatingDiv('CompareField'); }, // crmv@128369 createCluster: function(reportid) { var module = jQuery('#primarymodule').val(); openPopup('index.php?module=Reports&action=ReportsAjax&file=EditCluster&reportid='+reportid+'&primodule='+module); }, editCluster: function(reportid, self) { var module = jQuery('#primarymodule').val(); var row = jQuery(self).closest('tr'); var index = row.index()-1; // remove header row openPopup('index.php?module=Reports&action=ReportsAjax&file=EditCluster&reportid='+reportid+'&clusteridx='+index+'&primodule='+module); }, validateCluster: function(newcluster, clusters, clusteridx) { var me = this; // validation if (!newcluster.name) { var label = jQuery('#clustername').closest('tr').find('td span').text(); alert(label+" "+alert_arr.IS_MANDATORY_FIELD); return false; } // check if existing (only when creating) if (clusteridx === undefined || clusteridx === null || clusteridx === '') { for (var i=0; i