From 6b82e15b13b0b2154d6369a7d359d7dbba5a149c Mon Sep 17 00:00:00 2001 From: liumengyi Date: Wed, 26 Jul 2023 16:37:29 +0800 Subject: [PATCH] * Refactor ui of testtask::results and testtask::runCase. --- module/testcase/model.php | 10 +- module/testtask/css/common.ui.css | 10 + module/testtask/css/results.ui.css | 1 + module/testtask/js/common.ui.js | 34 ++- module/testtask/js/runcase.ui.js | 8 +- module/testtask/model.php | 34 ++- module/testtask/ui/results.html.php | 334 ++++++++++++---------------- module/testtask/ui/runcase.html.php | 3 +- 8 files changed, 212 insertions(+), 222 deletions(-) create mode 100644 module/testtask/css/common.ui.css create mode 100644 module/testtask/css/results.ui.css diff --git a/module/testcase/model.php b/module/testcase/model.php index 83881895d2..e54d6a13dd 100644 --- a/module/testcase/model.php +++ b/module/testcase/model.php @@ -86,13 +86,13 @@ class testcaseModel extends model $step->case = $caseID; $step->version = 1; $step->desc = rtrim(htmlSpecialString($stepDesc)); - $step->expect = $stepType == 'item' ? '' : rtrim(htmlSpecialString(zget($case->expects, $stepKey, ''))); + $step->expect = $stepType == 'group' ? '' : rtrim(htmlSpecialString(zget($case->expects, $stepKey, ''))); $this->dao->insert(TABLE_CASESTEP)->data($step) ->autoCheck() ->exec(); - if($step->type == 'item') + if($step->type == 'group') { $grandPaStepID = $parentStepID; $parentStepID = $this->dao->lastInsertID(); @@ -502,6 +502,7 @@ class testcaseModel extends model $data = new stdclass(); $data->name = str_replace('.0', '', $name); + $data->id = $step->id; $data->step = $step->desc; $data->desc = $step->desc; $data->expect = $step->expect; @@ -516,6 +517,7 @@ class testcaseModel extends model if(empty($steps)) { $data = new stdclass(); + $data->id = 0; $data->name = '1'; $data->step = ''; $data->desc = ''; @@ -945,13 +947,13 @@ class testcaseModel extends model $step->case = $caseID; $step->version = $version; $step->desc = rtrim(htmlSpecialString($stepDesc)); - $step->expect = $stepType == 'item' ? '' : rtrim(htmlSpecialString(zget($data->expects, $stepKey, ''))); + $step->expect = $stepType == 'group' ? '' : rtrim(htmlSpecialString(zget($data->expects, $stepKey, ''))); $this->dao->insert(TABLE_CASESTEP)->data($step) ->autoCheck() ->exec(); - if($step->type == 'item') + if($step->type == 'group') { $grandPaStepID = $parentStepID; $parentStepID = $this->dao->lastInsertID(); diff --git a/module/testtask/css/common.ui.css b/module/testtask/css/common.ui.css new file mode 100644 index 0000000000..424e0b9b7b --- /dev/null +++ b/module/testtask/css/common.ui.css @@ -0,0 +1,10 @@ +.form-row.form-row-group {border-bottom: unset;} +#casesResults .result-detail .steps-header > div {font-size: 13px; color: var(--color-slate-700); padding: 8px;} +#casesResults .result-detail .steps-header > div.desc {padding-left: 32px;} +#casesResults .result-detail .fail .steps-header > div.desc {padding-left: 52px;} +#casesResults .result-detail .steps-body > .step:last-child {border-bottom: 0;} +#casesResults .result-detail .steps-body > .step > div {padding: 8px;} +#casesResults .result-item {background-color: var(--color-slate-50); border-color: rgba(var(--color-gray-300-rgb), 0.7);} +#casesResults .result-detail > td {padding: 0;} +#casesResults .step-item-id {color: var(--color-slate-500);} + diff --git a/module/testtask/css/results.ui.css b/module/testtask/css/results.ui.css new file mode 100644 index 0000000000..5a1d6424ab --- /dev/null +++ b/module/testtask/css/results.ui.css @@ -0,0 +1 @@ +.modal-body > span {display: none;} diff --git a/module/testtask/js/common.ui.js b/module/testtask/js/common.ui.js index af10646ce9..a0b2254cad 100644 --- a/module/testtask/js/common.ui.js +++ b/module/testtask/js/common.ui.js @@ -132,11 +132,10 @@ function toggleShowResults(event) */ function toggleCheckAll(event) { - var $checkAll = $(event.target).closest('td').find("input[type='checkbox']"); - var isChecked = !$checkAll.prop('checked'); - $checkAll.prop('checked', isChecked); + var $checkAll = $(event.target).closest('.check-all').find("input[type='checkbox']"); + var isChecked = $checkAll.prop('checked'); - $checkAll.closest('tbody').children('tr').find('input[type=checkbox]').prop('checked', isChecked); + $checkAll.closest('.resultSteps').find('.step').find('input[type=checkbox]').prop('checked', isChecked); } /** @@ -148,27 +147,26 @@ function toggleCheckAll(event) */ function toggleCheckChildItem(event) { - var $target = $(event.target).closest('td').find("input[type='checkbox']"); - var isChecked = !$target.prop('checked'); - $target.prop('checked', isChecked); + var $target = $(event.target).closest('.step-id').find("input[type='checkbox']"); + var $step = $target.closest('.step'); + var isChecked = $target.prop('checked'); - var $next = $target.closest('tr').next(); - - while($target.closest('tr').hasClass('step-group') && $next.length && $next.hasClass('step-item')) + var stepID = $step.data('id'); + var $next = $target.closest('.step').next(); + while(stepID == $next.data('parent')) { $next.find("input[type='checkbox']").prop('checked', isChecked); $next = $next.next(); } - if($target.closest('tr').hasClass('step-item')) + if(stepID != 0) { - var parentStepKey = $target.closest('tr').data('parent'); - var allSiblings = $target.closest('tbody').find('.step-item.group-' + parentStepKey).length - var checkedSiblings = $target.closest('tbody').find('.step-item.group-' + parentStepKey + ' input[type=checkbox]:checked').length - - $target.closest('tr').prevAll('.step-group').first().find('input[type=checkbox]').prop('checked', allSiblings == checkedSiblings); + var parentStepID = $step.data('parent'); + var allSiblings = $target.closest('.steps-body').find('[data-parent="' + parentStepID + '"]').length + var checkedSiblings = $target.closest('.steps-body').find('[data-parent="' + parentStepID + '"]' + ' input[type=checkbox]:checked').length + $target.closest('.step').prevAll('[data-id="' + parentStepID + '"]').find('input[type=checkbox]').prop('checked', allSiblings == checkedSiblings); } - var $tbody = $target.closest('tbody'); - $tbody.find('.check-all input[type=checkbox]').prop('checked', $tbody.find('.check-item input[type=checkbox]').length == $tbody.find('.check-item input[type=checkbox]:checked').length); + var $stepsBody = $target.closest('.steps-body'); + $stepsBody.find('.check-all input[type=checkbox]').prop('checked', $stepsBody.find('.check-item input[type=checkbox]').length == $stepsBody.find('.check-item input[type=checkbox]:checked').length); } diff --git a/module/testtask/js/runcase.ui.js b/module/testtask/js/runcase.ui.js index 42fa4bf6c6..5bc9137133 100644 --- a/module/testtask/js/runcase.ui.js +++ b/module/testtask/js/runcase.ui.js @@ -25,17 +25,17 @@ function loadResult() function realChange(event) { var $target = $(event.target); - var $preSelect = $(event.target).closest('table').closest('tr').find('select'); + var $preSelect = $(event.target).closest('table').closest('tr').find('[name^="steps"]'); if($target.val() == '' && $preSelect.val() == 'fail' && !custom) { - $preSelect.val('pass'); + $preSelect.zui('picker').$.changeState({value: 'pass'}); } else if($target.val() != '' && $preSelect.val() == 'pass' && !custom) { - $preSelect.val('fail').parent().addClass('has-error'); + $preSelect.zui('picker').$.changeState({value: 'fail'}); + $preSelect.parent().addClass('has-error'); setTimeout(function(){$preSelect.parent().removeClass('has-error');},'1000'); } - } /** diff --git a/module/testtask/model.php b/module/testtask/model.php index dcfd1c937d..9607eb41ec 100755 --- a/module/testtask/model.php +++ b/module/testtask/model.php @@ -1265,10 +1265,10 @@ class testtaskModel extends model } /* Create result of every step. */ - foreach($postData->steps as $stepID =>$stepResult) + foreach($postData->steps as $stepID => $stepResult) { $step['result'] = $stepResult; - $step['real'] = $postData->reals[$stepID]; + $step['real'] = zget($postData->reals, $stepID, ''); $stepResults[$stepID] = $step; } @@ -1502,10 +1502,38 @@ class testtaskModel extends model $result->files = zget($resultFiles, $resultID, array()); //Get files of case result. if(isset($relatedSteps[$result->version])) { + $preGrade = 1; + $parentSteps = array(); + $key = array(0, 0, 0); $relatedStep = $relatedSteps[$result->version]; foreach($relatedStep as $stepID => $step) { + $parentSteps[$step->id] = $step->parent; + $grade = 1; + if(isset($parentSteps[$step->parent])) + { + $grade = isset($parentSteps[$parentSteps[$step->parent]]) ? 3 : 2; + } + + if($grade > $preGrade) + { + $key[$grade - 1] = 1; + } + else + { + if($grade < $preGrade) + { + if($grade < 2) $key[1] = 0; + if($grade < 3) $key[2] = 0; + } + $key[$grade - 1] ++; + } + $name = implode('.', $key); + $name = str_replace('.0', '', $name); + $relatedStep[$stepID] = (array)$step; + $relatedStep[$stepID]['name'] = $name; + $relatedStep[$stepID]['grade'] = $grade; $relatedStep[$stepID]['desc'] = html_entity_decode($relatedStep[$stepID]['desc']); $relatedStep[$stepID]['expect'] = html_entity_decode($relatedStep[$stepID]['expect']); if(isset($result->stepResults[$stepID])) @@ -1513,6 +1541,8 @@ class testtaskModel extends model $relatedStep[$stepID]['result'] = $result->stepResults[$stepID]['result']; $relatedStep[$stepID]['real'] = $result->stepResults[$stepID]['real']; } + + $preGrade = $grade; } $result->stepResults = $relatedStep; } diff --git a/module/testtask/ui/results.html.php b/module/testtask/ui/results.html.php index 432d4879df..a730b64d20 100644 --- a/module/testtask/ui/results.html.php +++ b/module/testtask/ui/results.html.php @@ -41,7 +41,7 @@ $failCount = 0; foreach($results as $i => $result) { $class = ($result->caseResult == 'pass' ? 'success' : ($result->caseResult == 'fail' ? 'danger' : ($result->caseResult == 'blocked' ? 'warning' : ''))); - $fileCount = '(' . count($result->files) . ')'; + $fileCount = count($result->files); if($class != 'success') $failCount ++; $trs[] = h::tr ( @@ -51,16 +51,10 @@ foreach($results as $i => $result) set('data-status', $result->node > 0 && empty($result->ZTFResult) ? 'running': 'ready'), h::td ( - set('colspan', '6'), span(setClass('toggle-icon circle inline-block align-middle mr-2')), width('120px'), $result->date, $result->node > 0 ? sprintf($lang->testtask->runNode, zget($users, $result->lastRunner), $result->nodeName, $lang->testtask->runCase) : '', - $result->node > 0 ? span - ( - setClass('label'), - $lang->testtask->auto - ) : null, $result->node == 0 && $result->task > 0 ? html(sprintf($lang->testtask->runInTask, zget($testtasks, $result->task, ''))) : '', $result->node == 0 || !empty($result->ZTFResult) ? html ( @@ -70,165 +64,99 @@ foreach($results as $i => $result) setClass('text-waring'), $lang->testtask->running, ), - ), - h::td - ( - width('60px'), - !empty($result->files) ? h::a + $result->node > 0 ? span ( - set::href("#caseResult{$result->id}"), - set('data-toggle', 'modal'), - $lang->files . $fileCount, - ) : '', - ), - h::td - ( - setClass('text-center'), - width('50px'), - icon - ( - setClass('collapse-handle'), - 'angle-down' - ), + setClass('label'), + $lang->testtask->auto + ) : null, ), ); - $fileModals[] = modal - ( - set::id("caseResult{$result->id}"), - !empty($result->files) ? fileList(set::files($result->files)) : '', - ); - - $stepID = $childID = 0; $stepResultTrs = array(); foreach($result->stepResults as $key => $stepResult) { if(empty($stepResult['type'])) $stepResult['type'] = 'step'; if(empty($stepResult['parent'])) $stepResult['parent'] = 0; - if($stepResult['type'] == 'group' || $stepResult['type'] == 'step') - { - $stepID ++; - $childID = 0; - } - $stepClass = $stepResult['type'] == 'item' ? "step-item group-{$stepResult['parent']}" : "step-group"; - $inputName = $stepResult['type'] != 'group' ? 'stepIdList[]' : ''; - - $itemTds = array(); - if($stepResult['type'] != 'group') - { - $modalID = $result->id . '-' . $key; - $fileCount = '(' . count($stepResult['files']) . ')'; - - $itemTds[] = h::td - ( - setClass('text-left'), - isset($stepResult['expect']) ? html(nl2br($stepResult['expect'])) : '', - ); - $itemTds[] = h::td(isset($result->version) ? html($result->version) : ''); - $itemTds[] = !empty($stepResult['result']) ? h::td - ( - setClass("status-{$stepResult['result']} text-center"), - $lang->testcase->resultList[$stepResult['result']], - ) : h::td(); - $itemTds[] = !empty($stepResult['result']) ? h::td - ( - nl2br($stepResult['real']), - ) : h::td(); - $itemTds[] = !empty($stepResult['result']) ? h::td - ( - setClass('text-center'), - !empty($stepResult['files']) ? h::a - ( - set::href("#stepResult{$modalID}"), - set('data-toggle', 'modal'), - $lang->files . $fileCount, - ) : '', - ) : h::td(); - $fileModals[] = modal - ( - set::id("stepResult{$modalID}"), - !empty($stepResult['files']) ? fileList(set::files($stepResult['files'])) : '', - ); - } - - $stepResultTrs[] = h::tr + $itemTds = array(); + $modalID = $result->id . '-' . $key; + $fileCount = count($stepResult['files']); + $itemTds[] = div ( - setClass("step {$stepClass}"), + setClass('text-left flex border-r'), + width('calc(25% + 2px)'), + isset($stepResult['expect']) ? html(nl2br($stepResult['expect'])) : '', + ); + $itemTds[] = !empty($stepResult['result']) ? div + ( + setClass("status-{$stepResult['result']} text-center flex border-r"), + width('80px'), + $lang->testcase->resultList[$stepResult['result']], + ) : div + ( + setClass('border-r'), + width('80px'), + ); + $itemTds[] = !empty($stepResult['result']) ? div + ( + setClass('text-left flex border-r'), + width('240px'), + nl2br($stepResult['real']), + ) : div + ( + setClass('border-r'), + width('240px'), + ); + $itemTds[] = !empty($stepResult['result']) ? div + ( + setClass('text-center flex'), + width('56px'), + !empty($stepResult['files']) ? a + ( + set::href("#stepResult{$modalID}"), + set('data-toggle', 'modal'), + icon('paper-clip'), + $fileCount, + ) : '', + ) : div(width('56px')); + $fileModals[] = modal + ( + set::id("stepResult{$modalID}"), + !empty($stepResult['files']) ? fileList(set::files($stepResult['files'])) : '', + ); + + $stepResultTrs[] = div + ( + setClass("step flex border-b step-item "), set('data-parent', $stepResult['parent']), set('data-id', $key), - h::td + div ( - setClass('step-id'), - $result->caseResult == 'fail' ? div + setClass('step-id flex border-r'), + width('calc(75% - 378px)'), + $result->caseResult == 'fail' ? checkbox ( - setClass('checkbox-primary check-item'), - on::click('toggleCheckChildItem'), - h::input - ( - set::id($inputName), - set('type', 'checkbox'), - set('name', $inputName), - set('value', $key), - ), + set::id("stepIdList[{$stepResult['id']}]"), + set('name', "stepIdList[{$stepResult['id']}]"), + set('value', $key), ) : '', - $stepResult['type'] == 'group' ? set('colspan', '6') : '', div ( - setClass('inputGroup'), - h::span + setClass('inputGroup flex'), + span ( setClass('step-item-id mr-2'), - $stepResult['type'] == 'item' ? "{$stepID}.{$childID}" : $stepID, + setClass('ml-' . ((zget($stepResult, 'grade', 1) - 1) * 2)), + zget($stepResult, 'name', ''), ), - isset($stepResult['desc']) ? nl2br($stepResult['desc']) : '', + zget($stepResult, 'desc', ''), ), ), $itemTds, ); - - $childID ++; } - $stepResultTrs[] = $result->caseResult == 'fail' && common::hasPriv('testcase', 'createBug') ? h::tr + $stepResultTrs[] = !empty($result->ZTFResult) && $result->node > 0 ? div ( - h::td - ( - set('colspan', '2'), - div - ( - setClass('checkbox-primary check-all'), - on::click('toggleCheckAll'), - h::input - ( - set::id("checkAll[{$i}]"), - set('type', 'checkbox'), - set('name', 'checkAll'), - ), - h::label($lang->selectAll), - ), - ), - h::td - ( - set('colspan', '4'), - ), - h::td - ( - setClass('to-bug-button'), - btn - ( - setClass('btn h-7'), - set::type('primary'), - set::btnType('btnType'), - on::click('createBug'), - set('data-target', '_blank'), - set('data-close-modal', true), - $lang->testcase->createBug - ), - ), - ) : ''; - $stepResultTrs[] = !empty($result->ZTFResult) && $result->node > 0 ? h::td - ( - set('colspan', '6'), h::p($lang->testtask->runningLog), h::p($result->ZTFResult), ) : ''; @@ -247,93 +175,113 @@ foreach($results as $i => $result) h::td ( setClass('pd-0'), - set('colspan', '7'), h::form ( setClass('form load-indicator form-ajax form-grid'), set('data-params', $linkParams), set('action', createLink('bug', 'create', $linkParams)), - h::table + div ( - setClass('table resultSteps'), - h::thead + setClass('resultSteps ' . $result->caseResult), + div ( - h::tr + setClass('steps-header flex border-b'), + div ( - h::td - ( - setClass('text-left'), - $lang->testcase->stepDesc, - ), - h::td - ( - width('25%'), - setClass('text-left'), - $lang->testcase->stepExpect, - ), - h::td - ( - width('60px'), - setClass('text-left'), - $lang->testcase->stepVersion, - ), - h::td - ( - width('80px'), - setClass('text-center'), - $lang->testcase->result, - ), - h::td - ( - width('100px'), - setClass('text-left'), - $lang->testcase->real, - ), - h::td - ( - width('80px'), - ), + width('calc(75% - 376px)'), + setClass('text-left desc border-r'), + $lang->testcase->stepDesc, + ), + div + ( + width('calc(25%)'), + setClass('text-left border-r'), + $lang->testcase->stepExpect, + ), + div + ( + width('80px'), + setClass('text-center border-r'), + $lang->testcase->result, + ), + div + ( + width('240px'), + setClass('text-left border-r'), + $lang->testcase->real, + ), + div + ( + width('56px'), + setClass('text-left'), + $lang->attatch ), ), - h::tbody + div ( + setClass('steps-body ml-2'), $stepResultTrs, ), + $result->caseResult == 'fail' && common::hasPriv('testcase', 'createBug') ? div + ( + setClass('check-all flex items-center h-12 pl-4 border-t'), + checkbox + ( + on::click('toggleCheckAll'), + set::id("checkAll[{$i}]"), + set('type', 'checkbox'), + set('name', 'checkAll'), + set::text($lang->selectAll), + ), + div + ( + setClass('to-bug-button ml-8'), + btn + ( + setClass('btn h-7 px-6'), + set::type('primary'), + set::btnType('btnType'), + on::click('createBug'), + set('data-target', '_blank'), + set('data-close-modal', true), + $lang->testcase->createBug + ), + ), + ) : '', ), ), ), ); } +$resultItem = array(); +$resultItem[] = span +( + setClass('px-3 my-1 border-r'), + html(sprintf($lang->testtask->showResult, $count)), +); +$resultItem[] = span +( + setClass('pl-3 my-1'), + html(sprintf($lang->testtask->showFail, $failCount)), +); div ( div ( - setClass('main'), + setClass('main pt-6'), set::id('casesResults'), $case->auto != 'unit' ? formRowGroup ( set::title($lang->testcase->result), set::items ( - array - ( - span - ( - setClass('px-3 my-1 border-r'), - html(sprintf($lang->testtask->showResult, $count)), - ), - span - ( - setClass('pl-3 my-1'), - html(sprintf($lang->testtask->showFail, $failCount)), - ), - ), + $resultItem ), ) : null, h::table ( - setClass('table condensed table-hover border'), + setClass('table border'), $trs, ), $fileModals, diff --git a/module/testtask/ui/runcase.html.php b/module/testtask/ui/runcase.html.php index 780fe7a5fb..11528d12ba 100644 --- a/module/testtask/ui/runcase.html.php +++ b/module/testtask/ui/runcase.html.php @@ -75,6 +75,7 @@ if($confirm != 'yes') set::value($step->type != 'group' ? 'pass' : ''), set::required($step->type != 'group'), set::disabled($step->type == 'group'), + $step->type == 'group' ? set('disabled', 'disabled') : '', ), ), h::td @@ -250,7 +251,7 @@ form div ( - setClass('main border-t pt-6'), + setClass('main border-t'), set::id('resultsContainer'), div (