var filterValues = {}; /** * Listen filter change. * * @param string field * @param string dateSelect * @param string $filterValue * @access public * @return void */ function filterChange(field, dateSelect, $filterValue) { var parse = field.split('.'); field = parse[0]; var type = ''; if(parse.length == 2) type = parse[1]; var id = type.length == 0 ? field : field + '\\[' + type + '\\]'; var value = $('#' + id).val(); if(type.length == 0) { filterValues[field] = value; ajaxGetChart(); } else { var check = checkDate(dateSelect, $filterValue); if(!check) return; if(!filterValues[field]) filterValues[field] = {begin: '', end: ''}; filterValues[field][type] = value; var begin = filterValues[field].begin; var end = filterValues[field].end; if((begin.length > 0 && end.length > 0) || (begin.length == 0 && end.length == 0)) ajaxGetChart(); } } /** * Ajax get pivot data. * * @access public * @return bool */ function ajaxGetChart() { /* If the same value is detected for the x and y axes, throw error and clear the echart, then return.*/ /* 如果x轴和y轴重复了,那么抛出错误并返回。*/ if(!checkFormSetting()) return; var chartParams = JSON.parse(JSON.stringify(DataStorage.pivot)); chartParams.filterValues = filterValues; /* Redraw echart. */ /* 拿数据并重绘图表。*/ $.post(createLink('pivot', 'ajaxGetChart'), chartParams, function(resp) { var data = JSON.parse(resp); echart.clear(); echart.setOption(data, true); }); } function getQueryFilters(pivot) { var filters = ''; filters = pivot.filters; filters.forEach(function(filter, index) { if(filter.from == 'query') { var find = $('#queryFilters').find('.filter-item-' + index + ' .form-' + filter.type); if(find.length != 0) filter.default = find.val(); } }); return filters; } /** * If the same value is detected for the x and y axias, throw error and clear the echart, then return. * * @access public * @return bool ture|false */ function checkFormSetting() { var pivot = DataStorage.pivot; var type = pivot.settings[0].type; var result = 'success'; var errorMsg = ''; if(checkForm[type]) { for(var key in checkForm[type]) { var fields = checkForm[type][key].split(','); var former = fields[0]; var latter = fields[1]; if(key == 'cantequal') { if(pivot.settings[0][latter].includes(pivot.settings[0][former])) { result = 'fail'; errorMsg = pivotLang['errorList']['cantequal']; errorMsg = errorMsg.replace(/%s/, pivotLang[type][latter]); errorMsg = errorMsg.replace(/%s/, pivotLang[type][former]); } } } } if(result == 'fail') { var message = new $.zui.Messager(errorMsg, { html: true, icon: 'exclamation-sign', type: 'danger', close: true, }); message.show(); echart.clear(); return false; } return true; } /** * Validate form required. * * @access public * @return void */ function validate(showError = false) { var pivot = DataStorage.pivot; var formSettings = pivot.settings; var isReady = true; var firstErrDom = null; if("summary" in formSettings && formSettings.summary == 'notuse') { if(isReady) $('#datagrid-tip').addClass('hidden'); return true; } /* check group settings. */ var exist = false; for(var key in formSettings) { if(key.indexOf('group') != '-1' && formSettings[key].length > 0) exist = true; } var tr = $('#step2Content form#groupForm table tbody tr:nth-child(1)'); tr.find('#groupLabel').remove(); tr.find('#group1').removeClass('has-error'); if(!exist) { isReady = false; if(showError) { var error = '
' + moreThanOneLang + '
'; tr.find('#group1').addClass('has-error'); tr.find('#group1').next().after(error); firstErrDom = tr.find('#group1').parents('tr'); } } /* check columns settings. */ formSettings.columns.forEach(function(value, index) { var $column = $('#step2Content form#columnForm .column-' + index); $column.find('#column' + index + 'Label').remove(); $column.find('#stat' + index + 'Label').remove(); $column.find('#column').removeClass('has-error'); $column.find('#stat').removeClass('has-error'); if(!value.field || value.field.length == 0) { isReady = false; if(showError) { var error = '
' + notemptyLang.replace('%s', pivotLang.step2.columnField) + '
'; $column.find('#column').addClass('has-error'); $column.find('#column').parent().after(error); if(!firstErrDom) firstErrDom = $column.find('#column').parents('.column'); } } if(value.showOrigin != '1' && (!value.stat || value.stat.length == 0 || value.stat === '')) { isReady = false; if(showError) { var error = '
' + notemptyLang.replace('%s', pivotLang.step2.calcMode) + '
'; $column.find('#stat').addClass('has-error'); $column.find('#stat').next().after(error); if(!firstErrDom) firstErrDom = $column.find('#stat').parents('.column'); } } }); if(isReady) $('#datagrid-tip').addClass('hidden'); if(!isReady && firstErrDom) firstErrDom[0].scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'start' }) return isReady; } /** * Multi Validate. * * @param setting $setting * @param showError $showError * @access public * @return void */ function multiValidate(setting, showError) { var pivot = DataStorage.pivot; var type = pivot.settings[0].type; var isReady = true; var field = setting.field; var error = '
' + notemptyLang.replace('%s', pivotLang[type][field]) + '
'; $('#pivotForm .table-form').find('.multi-' + field).each(function() { $(this).parent('td').find('#' + field + 'Label').remove(); $(this).parent('td').find('#' + field + '_chosen a').removeClass('has-error'); if(setting.required && $(this).val().length == 0) { isReady = false; if(showError) { $(this).parent('td').find('#' + field + '_chosen a').addClass('has-error'); $(this).parent('td').find('#' + field + '_chosen').after(error); } } }); return isReady; } /** * Check date. * * @param string dateSelect * @param object $filterValue * @access public * @return void */ function checkDate(dateSelect, $filterValue) { var begin = new Date($(dateSelect).parent().find('.default-begin').val().replace(/-/g, "\/")).getTime(); var end = new Date($(dateSelect).parent().find('.default-end').val().replace(/-/g, "\/")).getTime(); if(begin > end) { $(dateSelect).val(''); if(typeof $filterValue == 'object') $filterValue.val(''); bootbox.alert(pivotLang.beginGtEnd); return false; } return true; } function waitForRepaint(callback) { window.requestAnimationFrame(function() { window.requestAnimationFrame(callback); }); } /** * Init picker. * * @access public * @return void */ function initPicker($row, pickerName = 'picker-select', onready = false) { $row.find('.' + pickerName).picker( { maxDropHeight: pickerHeight, onReady: function() { if(!onready) return; if(!$row.find('.picker')) return; if(window.getComputedStyle($row.find('.picker').find('.picker-selections')[0]).getPropertyValue('width') !== 'auto') { var pickerWidth = $row.find('.picker')[0].getBoundingClientRect().width; $row.find('.picker').find('.picker-selections').css('width', pickerWidth); } } }); $row.find("." + pickerName).each(function(index) { if($(this).hasClass('required')) $(this).siblings("div .picker").addClass('required'); }); } /** * Init datapicker. * * @param object $obj * @param function callback * @access public * @return void */ function initDatepicker($obj, callback) { $obj.find('.form-date').datepicker(); $obj.find('.form-datetime').datetimepicker(); if(typeof callback == 'function') callback($obj); } /** * Attr date check. * * @param object $obj * @access public * @return void */ function attrDateCheck($obj) { $obj.find('.form-date').attr('onchange', 'checkDate(this, this.value)'); $obj.find('.form-datetime').attr('onchange', 'checkDate(this, this.value)'); } /** * Export file. * * @param object $domObj * @access public * @return void */ function exportFile($domObj) { if(typeof $domObj == 'undefined') return; var fileName = $('#fileName').val().trim() ? $('#fileName').val().trim() : untitled; var fileType = $('#fileType').val(); var tableName = fileName + '.' + fileType; if(fileType == 'xlsx' || fileType == 'xls') { const new_sheet = XLSX.utils.table_to_book($domObj, {raw: true}); XLSX.writeFile(new_sheet, tableName); } else if(fileType == 'html' || fileType == 'mht') { const htmlContent = $domObj.outerHTML; const $temp = $('
').html(htmlContent); $temp.find('*').removeAttr('style'); $temp.find('*').removeAttr('class'); $temp.find('*').removeAttr('data-flex'); $temp.find('*').removeAttr('data-width'); $temp.find('*').removeAttr('data-type'); $temp.find('*').removeAttr('data-fixed-left-width'); const cleanTableHTML = $temp.html(); var head = ''; var style = ''; var title = '' + fileName + ''; var body = '' + cleanTableHTML + ''; const finalHTML = head + style + title + body; if(fileType == 'html') { const blob = new Blob([finalHTML], { type: 'text/html;charset=utf-8' }); saveAs(blob, tableName); } else if(fileType == 'mht') { const data = {html: finalHTML, fileName: fileName}; $.post(createLink('file', 'ajaxExport2mht'), data, function(resp) { const blob = new Blob([resp], { type: "application/x-mimearchive" }); saveAs(blob, tableName); }); } } $('#export').modal('hide'); } /** * Zui messager alert. * * @param string result success|fail * @param string mes * @access public * @return void */ function zuiMessage(result, mes) { var icon = result == 'success' ? 'check-circle' : 'exclamation-sign'; var type = result == 'success' ? 'success' : 'danger'; var message = new $.zui.Messager(mes, { html: true, icon: icon, type: type, close: true, }); message.show(); } function select(name, options, selected, attrib, callback) { var type = 'option'; if(!Array.isArray(options)) { type = options; options = []; } $.post(createLink('pivot', 'ajaxGetSelect'), { name: name, type: type, selectedItems: selected, attrib: attrib, options: options }, function(resp) { if(typeof callback == 'function') callback(resp); }); } function setDateField(control) { var $period = $('#selectPeriod'); if(!$period.length) { $period = $("").appendTo('body'); $period.find('li > a').click(function(event) { var target = control.parents('table, #queryFilters, #filterItems,#filterForm').find('[data-index="' + $period.attr('data-index') + '"]').find('#default:visible'); if(target.length) { target.val($(this).attr('href').replace('#', '$')).trigger('change'); $period.hide(); } event.stopPropagation(); return false; }); } if(control.hasClass('form-date')) control.datepicker(); if(control.hasClass('form-datetime')) control.datetimepicker(); var dateVal = control.val(); control.val('').datetimepicker('update').trigger('mousedown'); control.val(dateVal); control.on('show', function(e) { var $e = $(e.target); var ePos = $e.offset(); $period.css({'left': ePos.left + 210, 'top': ePos.top + 29, 'min-height': $('.datetimepicker').outerHeight(), 'z-index': 1110}).show().attr('data-index', $e.parents('.filter-item, .filter').data('index')).find('li.active').removeClass('active'); $period.find("li > a[href='" + $e.val().replace('$', '#') + "']").closest('li').addClass('active'); }).on('changeDate', function() { $period.hide(); }).on('hide', function(){setTimeout(function(){$period.hide();}, 200);}); }