diff --git a/module/metric/calc.class.php b/module/metric/calc.class.php index e63c898849..64f9a66940 100644 --- a/module/metric/calc.class.php +++ b/module/metric/calc.class.php @@ -202,6 +202,7 @@ class baseCalc */ public function printSQL($dao) { + a($dao); echo $this->getSQL($dao); } diff --git a/module/metric/css/preview.ui.css b/module/metric/css/preview.ui.css index d5d3114e7d..b86b1767e4 100644 --- a/module/metric/css/preview.ui.css +++ b/module/metric/css/preview.ui.css @@ -86,8 +86,9 @@ .filter-panel .filter-actions {display: flex; justify-content: center} .filter-panel .filter-actions .toolbar {gap: 15px;} -.cell-ellipsis {display: inherit; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;} +.cell-ellipsis {display: inline-block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;} .query-inline {padding-left: 80px !important;} .query-inline>label {justify-content: flex-start !important; width: 80px !important;} .query-btn {padding-left: 20px !important;} +.picker-nowrap .picker-multi-selections {flex-wrap: nowrap !important; overflow: hidden !important;} diff --git a/module/metric/js/preview.ui.js b/module/metric/js/preview.ui.js index 2f8bc11ab5..0c6124a3a4 100644 --- a/module/metric/js/preview.ui.js +++ b/module/metric/js/preview.ui.js @@ -6,11 +6,22 @@ window.renderHeight = function() window.parseSerialize = function(serialize) { var result = {}; + serialize = serialize.replaceAll('%5B%5D', ''); var items = serialize.split('&'); for(var i = 0; i < items.length; i++) { var item = items[i].split('='); - result[item[0]] = item[1]; + var key = item[0]; + var value = item[1]; + if(!result[key]) result[key] = []; + if(key.startsWith('scope')) + { + result[key].push(value); + } + else + { + result[key] = value; + } } return result; } @@ -118,11 +129,12 @@ window.handleNavMenuClick = function($el) }) } -window.handleQueryClick = function() +window.handleQueryClick = function(id) { - var check = window.checkForm($('#queryForm')); + var $form = id ? $('#queryForm' + id) : $('#queryForm'); + var check = window.checkForm($form); if(!check) return; - window.ajaxGetRecords(current.id); + window.ajaxGetRecords(id); } window.deactiveNavMenu = function() @@ -290,6 +302,77 @@ window.renderDTable = function(metricID = current.id, header = resultHeader, dat $currentBox.find('.table-side').append('
'); window.initDTable($currentBox.find('.dtable'), header, data); + if(viewType == 'multiple') window.initQueryForm(metricID, $currentBox.find('.metric-name'), header, data); +} + +window.getMetricRecordType = function(recordRow) +{ + if(!recordRow) return false; + var type = []; + if(recordRow.scope) type.push('scope'); + if(recordRow.date) type.push('date'); + if(type.length == 0) type.push('system'); + return type.join('-'); +} + +window.initQueryForm = function(id, $el, header = resultHeader, data = resultData) +{ + var $form = id ? $('#queryForm' + id) : $('#queryForm'); + var formData = window.getFormData($form); + + $el.siblings('form#queryForm' + id).remove(); + var $form = $('#queryFormTpl').clone(); + $form.attr('id', 'queryForm' + id); + $form.removeClass('hidden'); + $form.find('script').remove(); + + var recordType = window.getMetricRecordType(data.length ? data[0] : false); + + if(!recordType) return; + + $el.after($form); + + if(recordType == 'scope' || recordType == 'scope-date') + { + $form.find('.query-scope').removeClass('hidden'); + $form.find('.query-scope #scope').attr('id', 'scope' + id); + var scopeUnique = {}; + var scopeItems = []; + data.forEach(function(item) { + if(scopeUnique[item.scopeID]) return; + scopeUnique[item.scopeID] = item.scope; + scopeItems.push({text: item.scope, value: item.scopeID}); + }); + zui.create("picker","#scope" + id,{"multiple":10,"name":"scope","required":false,"items":scopeItems, "defaultValue": formData.get('scope'),"emptyValue":""}); + } + if(recordType == 'date' || recordType == 'scope-date') + { + $form.find('.query-date-range').removeClass('hidden'); + $form.find('.query-date-range #dateBegin').attr('id', 'dateBegin' + id); + $form.find('.query-date-range #dateEnd').attr('id', 'dateEnd' + id); + zui.create("datePicker","#dateBegin" + id,{"multiple":false,"icon":"calendar","name":"dateBegin", "defaultValue": formData.get('dateBegin')}) + zui.create("datePicker","#dateEnd" + id,{"multiple":false,"icon":"calendar","name":"dateEnd", "defaultValue": formData.get('dateEnd')}) + } + + if(recordType == 'system') + { + $form.find('.query-calc-time-range').removeClass('hidden'); + $form.find('.query-calc-time-range #calcBegin').attr('id', 'calcBegin' + id); + $form.find('.query-calc-time-range #calcEnd').attr('id', 'calcEnd' + id); + zui.create("datePicker","#calcBegin" + id,{"multiple":false,"icon":"calendar","name":"calcBegin", "defaultValue": formData.get('calcBegin')}) + zui.create("datePicker","#calcEnd" + id,{"multiple":false,"icon":"calendar","name":"calcEnd", "defaultValue": formData.get('calcEnd')}) + } + else + { + $form.find('.query-calc-time').removeClass('hidden'); + $form.find('.query-calc-time #calcTime').attr('id', 'calcTime' + id); + zui.create("datePicker","#calcTime" + id,{"multiple":false,"icon":"calendar","name":"calcTime", "defaultValue": formData.get('calcTime')}) + } + + $form.find('.query-btn button').attr('onclick', 'window.handleQueryClick(' + id + ')'); + + $form.find('.form-group.hidden').remove(); + } window.renderChart = function(metricID = current.id, header = resultHeader, data = resultData, chartType = 'line', initPicker = true) @@ -308,7 +391,7 @@ window.renderChart = function(metricID = current.id, header = resultHeader, data window.initDTable = function($obj, head, data) { - var height = 328; + var height = 310; if(viewType == 'single') height = $('.table-side').height(); if(!head || !data) return; @@ -321,6 +404,8 @@ window.initDTable = function($obj, head, data) height: height, cols: head, data: data, + // footPager: pager, + // footer: ['pager'], onRenderCell: function(result, {row, col}) { var colCount = Object.keys(row.data).length; @@ -432,10 +517,10 @@ window.initChart = function($obj, head, data, chartType) var myChart = echarts.init($obj); var option = { grid: { - left: '10%', // 左边距 - right: '10%', // 右边距 - bottom: '10%', // 下边距 - containLabel: true // 自动计算和预留坐标轴标签的空间 + left: '10%', + right: '10%', + bottom: '10%', + containLabel: true }, tooltip: { trigger: 'axis' @@ -465,6 +550,10 @@ window.initPieChart = function($obj, head, data) tooltip: { trigger: 'item' }, + legend: { + orient: 'vertical', + left: 'left' + }, series: [ { type: 'pie', @@ -599,7 +688,10 @@ window.updateMetricBoxs = function(id, isChecked) window.ajaxGetRecords = function(id) { - var formData = window.getFormData($('#queryForm')); + var $form = id ? $('#queryForm' + id) : $('#queryForm'); + var formData = window.getFormData($form); + + id = id ?? current.id; $.post($.createLink('metric', 'ajaxGetTableData', 'metricID=' + id),formData, function(resp) { @@ -608,7 +700,7 @@ window.ajaxGetRecords = function(id) { var chartType = viewType == 'multiple' ? $('#metricBox' + id).find('[name=chartType]').val() : $('[name=chartType]').val(); window.renderDTable(id, data.header, data.data); - window.renderChart(id, data.header, data.data, chartType); + window.renderChart(id, data.header, data.data, chartType, false); } }); } diff --git a/module/metric/lang/de.php b/module/metric/lang/de.php index 66ba746e0e..0a862f83aa 100644 --- a/module/metric/lang/de.php +++ b/module/metric/lang/de.php @@ -23,13 +23,12 @@ $lang->metric->system = "System"; $lang->metric->weekCell = "%s,Week %s"; $lang->metric->create = "Create " . $this->lang->metric->common; $lang->metric->edit = "Edit " . $this->lang->metric->common; -$lang->metric->view = 'View ' . $this->lang->metric->common; $lang->metric->afterCreate = "After Saving"; $lang->metric->definition = "Definition"; $lang->metric->declaration = "Definition"; $lang->metric->customUnit = "Custom Unit"; $lang->metric->delist = "Delist"; -$lang->metric->preview = "Preview Metric"; +$lang->metric->preview = "Preview"; $lang->metric->metricList = "Metric List"; $lang->metric->manage = "Manage"; $lang->metric->exitManage = "Exit manage"; @@ -82,8 +81,6 @@ $lang->metric->implementAction = 'Implement Metric'; $lang->metric->deleteAction = 'Delete Metric'; $lang->metric->implementAction = 'Implement Metric'; $lang->metric->deleteAction = 'Delete Metric'; -$lang->metric->delistAction = 'Delist Metric'; -$lang->metric->detailsAction = 'Metric Details'; $lang->metric->stageList = array(); $lang->metric->stageList['wait'] = "Not Released"; diff --git a/module/metric/lang/en.php b/module/metric/lang/en.php index 66ba746e0e..0a862f83aa 100644 --- a/module/metric/lang/en.php +++ b/module/metric/lang/en.php @@ -23,13 +23,12 @@ $lang->metric->system = "System"; $lang->metric->weekCell = "%s,Week %s"; $lang->metric->create = "Create " . $this->lang->metric->common; $lang->metric->edit = "Edit " . $this->lang->metric->common; -$lang->metric->view = 'View ' . $this->lang->metric->common; $lang->metric->afterCreate = "After Saving"; $lang->metric->definition = "Definition"; $lang->metric->declaration = "Definition"; $lang->metric->customUnit = "Custom Unit"; $lang->metric->delist = "Delist"; -$lang->metric->preview = "Preview Metric"; +$lang->metric->preview = "Preview"; $lang->metric->metricList = "Metric List"; $lang->metric->manage = "Manage"; $lang->metric->exitManage = "Exit manage"; @@ -82,8 +81,6 @@ $lang->metric->implementAction = 'Implement Metric'; $lang->metric->deleteAction = 'Delete Metric'; $lang->metric->implementAction = 'Implement Metric'; $lang->metric->deleteAction = 'Delete Metric'; -$lang->metric->delistAction = 'Delist Metric'; -$lang->metric->detailsAction = 'Metric Details'; $lang->metric->stageList = array(); $lang->metric->stageList['wait'] = "Not Released"; diff --git a/module/metric/lang/fr.php b/module/metric/lang/fr.php index 66ba746e0e..0a862f83aa 100644 --- a/module/metric/lang/fr.php +++ b/module/metric/lang/fr.php @@ -23,13 +23,12 @@ $lang->metric->system = "System"; $lang->metric->weekCell = "%s,Week %s"; $lang->metric->create = "Create " . $this->lang->metric->common; $lang->metric->edit = "Edit " . $this->lang->metric->common; -$lang->metric->view = 'View ' . $this->lang->metric->common; $lang->metric->afterCreate = "After Saving"; $lang->metric->definition = "Definition"; $lang->metric->declaration = "Definition"; $lang->metric->customUnit = "Custom Unit"; $lang->metric->delist = "Delist"; -$lang->metric->preview = "Preview Metric"; +$lang->metric->preview = "Preview"; $lang->metric->metricList = "Metric List"; $lang->metric->manage = "Manage"; $lang->metric->exitManage = "Exit manage"; @@ -82,8 +81,6 @@ $lang->metric->implementAction = 'Implement Metric'; $lang->metric->deleteAction = 'Delete Metric'; $lang->metric->implementAction = 'Implement Metric'; $lang->metric->deleteAction = 'Delete Metric'; -$lang->metric->delistAction = 'Delist Metric'; -$lang->metric->detailsAction = 'Metric Details'; $lang->metric->stageList = array(); $lang->metric->stageList['wait'] = "Not Released"; diff --git a/module/metric/lang/zh-cn.php b/module/metric/lang/zh-cn.php index 11a0e43959..963b54f7bd 100644 --- a/module/metric/lang/zh-cn.php +++ b/module/metric/lang/zh-cn.php @@ -29,7 +29,7 @@ $lang->metric->definition = "计算规则"; $lang->metric->declaration = "度量定义"; $lang->metric->customUnit = "自定义"; $lang->metric->delist = "下架"; -$lang->metric->preview = "查看度量项"; +$lang->metric->preview = "预览"; $lang->metric->metricList = "度量项列表"; $lang->metric->manage = "管理度量项"; $lang->metric->exitManage = "退出管理"; @@ -97,13 +97,13 @@ $lang->metric->featureBar['browse']['all'] = '全部'; $lang->metric->featureBar['browse']['wait'] = '未发布'; $lang->metric->featureBar['browse']['released'] = '已发布'; -$lang->metric->featureBar['preview']['system'] = '系统'; -$lang->metric->featureBar['preview']['program'] = '项目集'; -$lang->metric->featureBar['preview']['product'] = '产品'; $lang->metric->featureBar['preview']['project'] = '项目'; +$lang->metric->featureBar['preview']['product'] = '产品'; $lang->metric->featureBar['preview']['execution'] = '执行'; $lang->metric->featureBar['preview']['dept'] = '团队'; $lang->metric->featureBar['preview']['user'] = '个人'; +$lang->metric->featureBar['preview']['program'] = '项目集'; +$lang->metric->featureBar['preview']['system'] = '系统'; $lang->metric->featureBar['preview']['code'] = '代码库'; $lang->metric->featureBar['preview']['pipeline'] = '流水线'; diff --git a/module/metric/model.php b/module/metric/model.php index 614467dd82..6e51c5c9fa 100644 --- a/module/metric/model.php +++ b/module/metric/model.php @@ -512,7 +512,7 @@ class metricModel extends model */ public function getPairsByScope($scope) { - if($scope == 'global') return array(); + if(empty($scope) || $scope == 'system') return array(); $objectPairs = array(); switch($scope) @@ -523,6 +523,28 @@ class metricModel extends model case 'user': $objectPairs = $this->loadModel('user')->getPairs('noletter'); break; + case 'program': + $objectPairs = $this->dao->select('id, name')->from(TABLE_PROGRAM) + ->where('deleted')->eq(0) + ->andWhere('type')->eq('program') + ->fetchPairs(); + break; + case 'product': + $objectPairs = $this->dao->select('id, name')->from(TABLE_PRODUCT) + ->where('deleted')->eq(0)->fetchPairs(); + break; + case 'project': + $objectPairs = $this->dao->select('id, name')->from(TABLE_PROJECT) + ->where('deleted')->eq(0) + ->andWhere('type')->eq('project') + ->fetchPairs(); + break; + case 'execution': + $objectPairs = $this->dao->select('id, name')->from(TABLE_PROJECT) + ->where('deleted')->eq(0) + ->andWhere('type')->in('sprint,stage') + ->fetchPairs(); + break; default: $objectPairs = $this->loadModel($scope)->getPairs(); break; diff --git a/module/metric/tao.php b/module/metric/tao.php index d2a1916245..1cae02cd63 100644 --- a/module/metric/tao.php +++ b/module/metric/tao.php @@ -271,7 +271,7 @@ class metricTao extends metricModel $records = $this->dao->select("id, {$dataFieldStr} value, date") ->from(TABLE_METRICLIB) ->where('metricCode')->eq($code) - ->beginIF(!empty($scope))->andWhere($scopeKey)->eq($scopeValue)->fi() + ->beginIF(!empty($scope))->andWhere($scopeKey)->in($scopeValue)->fi() ->beginIF(!empty($dateBegin) and $dateType == 'year')->andWhere('`year`')->ge($yearBegin)->fi() ->beginIF(!empty($dateEnd) and $dateType == 'year')->andWhere('`year`')->le($yearEnd)->fi() ->beginIF(!empty($dateBegin) and $dateType == 'month')->andWhere('CONCAT(`year`, `month`)')->ge($monthBegin)->fi() diff --git a/module/metric/ui/preview.html.php b/module/metric/ui/preview.html.php index 2e629d4d8d..2589aad5e2 100644 --- a/module/metric/ui/preview.html.php +++ b/module/metric/ui/preview.html.php @@ -25,6 +25,7 @@ jsVar('metricListLang', $metricList); jsVar('chartTypeList', $lang->metric->chartTypeList); jsVar('errorDateRange', $lang->metric->errorDateRange); jsVar('errorCalcTimeRange', $lang->metric->errorCalcTimeRange); +// jsVar('pager', usePager()); if($scope == 'collect' and empty($current)) { diff --git a/module/metric/ui/previewmultiple.html.php b/module/metric/ui/previewmultiple.html.php index 212a0eee0d..604c480e11 100644 --- a/module/metric/ui/previewmultiple.html.php +++ b/module/metric/ui/previewmultiple.html.php @@ -215,13 +215,13 @@ toolbar $lang->metric->viewType->single, ), /* - common::hasPriv('metric', 'browse') ? btn + common::hasPriv('metric', 'preview') ? btn ( setClass('btn primary'), set::url(helper::createLink('metric', 'browse')), $lang->metric->manage ) : null, - */ + */ ); $metricCheckItems = array(); @@ -391,4 +391,89 @@ div ), ), ); + +form +( + set::id('queryFormTpl'), + setClass('hidden'), + formRow + ( + set::width('full'), + formGroup + ( + setClass('query-inline query-scope hidden picker-nowrap'), + set::width('248px'), + set::label($this->lang->metric->scope), + set::name('scope'), + set::items(array()), + ), + formGroup + ( + setClass('query-inline query-date-range hidden'), + set::width('360px'), + set::label($this->lang->metric->date), + inputGroup + ( + datePicker + ( + set::name('dateBegin'), + set('id', 'dateBegin'), + ), + $this->lang->metric->to, + datePicker + ( + set::name('dateEnd'), + set('id', 'dateEnd'), + ), + ), + ), + formGroup + ( + setClass('query-inline query-calc-time-range hidden'), + set::width('360px'), + set::label($this->lang->metric->calcTime), + inputGroup + ( + datePicker + ( + set::name('calcBegin'), + set('id', 'calcBegin'), + ), + $this->lang->metric->to, + datePicker + ( + set::name('calcEnd'), + set('id', 'calcEnd'), + ), + ), + ), + formGroup + ( + setClass('query-inline query-calc-time hidden'), + set::width('200px'), + set::label($this->lang->metric->calcTime), + inputGroup + ( + datePicker + ( + set::name('calcTime'), + set('id', 'calcTime'), + set::required(true), + set::value(helper::today()), + ), + ), + ), + formGroup + ( + setClass('query-btn'), + btn + ( + setClass('btn secondary'), + set::text($this->lang->metric->query), + ), + ) + ), + set::actions(array()), +); + render(); diff --git a/module/metric/ui/previewsingle.html.php b/module/metric/ui/previewsingle.html.php index 144c58d10c..abfff06ea0 100644 --- a/module/metric/ui/previewsingle.html.php +++ b/module/metric/ui/previewsingle.html.php @@ -117,13 +117,13 @@ toolbar $lang->metric->viewType->multiple, ), /* - common::hasPriv('metric', 'browse') ? btn + common::hasPriv('metric', 'preview') ? btn ( setClass('btn primary'), set::url(helper::createLink('metric', 'browse')), $lang->metric->manage ) : null, - */ + */ ); $metricRecordType = $this->metric->getMetricRecordType(current($resultData)); @@ -138,10 +138,11 @@ $fnGenerateQueryForm = function() use($metricRecordType, $current) { $formGroups[] = formGroup ( - setClass('query-inline'), + setClass('query-inline picker-nowrap'), set::width('248px'), set::label($this->lang->metric->scope), set::name('scope'), + set::control(array('type' => 'picker', 'multiple' => true)), set::items($objectPairs), ); } @@ -227,8 +228,8 @@ $fnGenerateQueryForm = function() use($metricRecordType, $current) ( setClass('btn secondary'), set::text($this->lang->metric->query), + set::onclick('window.handleQueryClick()'), ), - on::click('.query-btn button', 'window.handleQueryClick'), ) ), set::actions(array()), @@ -261,6 +262,7 @@ div div ( setClass('main'), + empty($current) ? div(setClass('canvas')) : div ( setClass('canvas'), diff --git a/module/metric/zen.php b/module/metric/zen.php index c97097f855..5c753b12f6 100644 --- a/module/metric/zen.php +++ b/module/metric/zen.php @@ -392,7 +392,11 @@ class metricZen extends metric $row = new stdclass(); if(!empty($dateList)) $row->date = $this->metric->buildDateCell($record); - if($scope != 'system') $row->scope = isset($objectPairs[$record[$scope]]) ? $objectPairs[$record[$scope]] : $record[$scope]; + if($scope != 'system') + { + $row->scope = isset($objectPairs[$record[$scope]]) ? $objectPairs[$record[$scope]] : $record[$scope]; + $row->scopeID = $record[$scope]; + } $row->value = is_numeric($record['value']) ? round((float)$record['value'], 2) : $record['value']; if(isset($record['date'])) $row->calcTime = $record['date'];