From d4ed89e64a30b0c2f6c6deff7a7bc9e89d9aa063 Mon Sep 17 00:00:00 2001
From: wangyuting2 <851424971@qq.com>
Date: Wed, 11 May 2022 15:05:13 +0800
Subject: [PATCH] * Finish task #53548.
---
framework/control.class.php | 5 +-
module/build/model.php | 24 +++-
module/build/view/view.html.php | 10 +-
module/execution/model.php | 32 +++++
module/execution/view/view.html.php | 23 +---
module/program/view/browsebylist.html.php | 6 +-
module/project/model.php | 161 +++++++++++++++-------
module/project/view/view.html.php | 22 +--
module/task/model.php | 97 +++++++++++--
module/task/view/view.html.php | 24 +---
module/testcase/model.php | 7 +-
11 files changed, 268 insertions(+), 143 deletions(-)
diff --git a/framework/control.class.php b/framework/control.class.php
index 326c9f9c20..c153bb29f0 100644
--- a/framework/control.class.php
+++ b/framework/control.class.php
@@ -326,10 +326,7 @@ class control extends baseControl
if(!isset($this->config->bizVersion)) return false;
$moduleName = $this->moduleName;
- if(strpos(',bug,feedback,caselib,testsuite,testtask,testcase,product,productplan,', ",{$moduleName},") !== false) return $this->$moduleName->buildOperateMenu($object, $type);
-
- $flow = $this->loadModel('workflow')->getByModule($moduleName);
- return $this->loadModel('flow')->buildOperateMenu($flow, $object, $type);
+ return $this->$moduleName->buildOperateMenu($object, $type);
}
/**
diff --git a/module/build/model.php b/module/build/model.php
index b72d747ec6..06a61c1dc0 100644
--- a/module/build/model.php
+++ b/module/build/model.php
@@ -505,7 +505,6 @@ class buildModel extends model
*/
public function batchUnlinkBug($buildID)
{
-
$bugList = $this->post->unlinkBugs;
if(empty($bugList)) return true;
@@ -518,4 +517,27 @@ class buildModel extends model
$this->loadModel('action');
foreach($this->post->unlinkBugs as $unlinkBugID) $this->action->create('bug', $unlinkBugID, 'unlinkedfrombuild', '', $buildID);
}
+
+ /**
+ * Build action menu.
+ *
+ * @param object $build
+ * @param string $type
+ * @access public
+ * @return string
+ */
+ public function buildOperateMenu($build, $type = 'view')
+ {
+ $canBeChanged = common::canBeChanged('build', $build);
+ if($build->deleted || !$canBeChanged) return '';
+
+ $menu = '';
+ $params = "buildID=$build->id";
+
+ $menu .= $this->buildFlowMenu('build', $build, 'view', 'direct');
+ $menu .= $this->buildMenu('build', 'edit', $params, $build, $type);
+ $menu .= $this->buildMenu('build', 'delete', $params, $build, $type, 'trash', 'hiddenwin');
+
+ return $menu;
+ }
}
diff --git a/module/build/view/view.html.php b/module/build/view/view.html.php
index 101bd6b0fb..3adcc8d6f1 100644
--- a/module/build/view/view.html.php
+++ b/module/build/view/view.html.php
@@ -48,15 +48,7 @@ tbody tr td:first-child input {display: none;}
- deleted and $canBeChanged)
- {
- echo $this->buildOperateMenu($build, 'view');
-
- if(common::hasPriv('build', 'edit')) echo html::a($this->createLink('build', 'edit', "buildID=$build->id"), " " . $this->lang->edit, '', "class='btn btn-link' title='{$this->lang->edit}' data-app='{$app->tab}'");
- if(common::hasPriv('build', 'delete')) echo html::a($this->createLink('build', 'delete', "buildID=$build->id"), " " . $this->lang->delete, '', "class='btn btn-link' title='{$this->lang->delete}' target='hiddenwin' data-app='{$app->tab}'");
- }
- ?>
+ buildOperateMenu($build, 'view');?>
diff --git a/module/execution/model.php b/module/execution/model.php
index 266c19d257..e50d9ec569 100644
--- a/module/execution/model.php
+++ b/module/execution/model.php
@@ -4033,4 +4033,36 @@ class executionModel extends model
}
$this->dao->update(TABLE_PROJECT)->set('path')->eq($path['path'])->set('grade')->eq($path['grade'])->where('id')->eq($execution->id)->exec();
}
+
+ /**
+ * Build execution action menu.
+ *
+ * @param object $execution
+ * @param string $type
+ * @access public
+ * @return string
+ */
+ public function buildOperateMenu($execution, $type = 'view')
+ {
+ if($execution->deleted) return '';
+
+ $menu = '';
+ $params = "executionID=$execution->id";
+
+ $menu .= "
- id";
- $browseLink = $this->session->executionList ? $this->session->executionList : inlink('browse', "executionID=$execution->id");
- common::printBack($browseLink);
- if(!$execution->deleted)
- {
- echo "
";
- common::printIcon('execution', 'start', "executionID=$execution->id", $execution, 'button', '', '', 'iframe', true);
- common::printIcon('execution', 'activate', "executionID=$execution->id", $execution, 'button', '', '', 'iframe', true);
- common::printIcon('execution', 'putoff', "executionID=$execution->id", $execution, 'button', '', '', 'iframe', true);
- common::printIcon('execution', 'suspend', "executionID=$execution->id", $execution, 'button', '', '', 'iframe', true);
- common::printIcon('execution', 'close', "executionID=$execution->id", $execution, 'button', '', '', 'iframe', true);
-
- echo $this->buildOperateMenu($execution, 'view');
-
- echo "
";
- common::printIcon('execution', 'edit', $params, $execution);
- common::printIcon('execution', 'delete', $params, $execution, 'button', 'trash', 'hiddenwin');
- }
- ?>
+ session->executionList ? $this->session->executionList : inlink('browse', "executionID=$execution->id");?>
+
+ buildOperateMenu($execution, 'view');?>
diff --git a/module/program/view/browsebylist.html.php b/module/program/view/browsebylist.html.php
index 3271346cda..e200be6085 100644
--- a/module/program/view/browsebylist.html.php
+++ b/module/program/view/browsebylist.html.php
@@ -119,9 +119,9 @@
model == 'kanban' ? 'disabled' : '';?>
- id", $program, 'list', 'edit', '', 'iframe', true);?>
- id", $program, 'list', 'group', '', "$class", '', 'data-app="project"');?>
- id", $program, 'list', 'lock', '', "$class", '', 'data-app="project"');?>
+ id", $program, 'list', 'edit', '', 'iframe', true);?>
+ id", $program, 'list', 'group', '', "$class", '', 'data-app="project"');?>
+ id", $program, 'list', 'lock', '', "$class", '', 'data-app="project"');?>
diff --git a/module/project/model.php b/module/project/model.php
index 04a76c89f2..bafa678048 100644
--- a/module/project/model.php
+++ b/module/project/model.php
@@ -1763,54 +1763,8 @@ class projectModel extends model
echo html::ring($project->hours->progress);
break;
case 'actions':
- $moduleName = $this->config->systemMode == 'classic' ? "execution" : "project";
- if($project->status == 'wait' || $project->status == 'suspended') common::printIcon($moduleName, 'start', "projectID=$project->id", $project, 'list', 'play', '', 'iframe', true);
- if($project->status == 'doing') common::printIcon($moduleName, 'close', "projectID=$project->id", $project, 'list', 'off', '', 'iframe', true);
- if($project->status == 'closed') common::printIcon($moduleName, 'activate', "projectID=$project->id", $project, 'list', 'magic', '', 'iframe', true);
-
- if(common::hasPriv($moduleName, 'suspend') || (common::hasPriv($moduleName, 'close') && $project->status != 'doing') || (common::hasPriv($moduleName, 'activate') && $project->status != 'closed'))
- {
- echo "
";
- echo "";
- echo "";
- echo "
";
- }
-
- $from = $project->from == 'project' ? 'project' : 'pgmproject';
- $iframe = ($this->app->tab == 'program' or $project->model == 'kanban') ? 'iframe' : '';
- $onlyBody = ($this->app->tab == 'program' or $project->model == 'kanban') ? true : '';
- $dataApp = $this->config->systemMode == 'classic' ? "data-app=execution" : "data-app=project";
- $attr = $project->model == 'kanban' ? " disabled='disabled'" : '';
-
- common::printIcon($moduleName, 'edit', "projectID=$project->id", $project, 'list', 'edit', '', $iframe, $onlyBody, $dataApp);
-
- if($this->config->vision != 'lite')
- {
- common::printIcon($moduleName, 'team', "projectID=$project->id", $project, 'list', 'group', '', '', '', $dataApp . $attr, $this->lang->execution->team);
- if($this->config->systemMode == 'new') common::printIcon('project', 'group', "projectID=$project->id&programID=$programID", $project, 'list', 'lock', '', '', '', $dataApp . $attr);
-
- if(common::hasPriv($moduleName, 'manageProducts') || common::hasPriv($moduleName, 'whitelist') || common::hasPriv($moduleName, 'delete'))
- {
- echo "
";
- echo "";
- echo "";
- echo "
";
- }
- }
- else
- {
- common::printIcon($moduleName, 'team', "projectID=$project->id", $project, 'list', 'group', '', '', '', $dataApp, $this->lang->execution->team);
- if($this->config->systemMode == 'new') common::printIcon('project', 'whitelist', "projectID=$project->id&module=project&from=$from", $project, 'list', 'shield-check', '', 'btn-action', '', $dataApp);
- if(common::hasPriv($moduleName, 'delete')) echo html::a(helper::createLink($moduleName, "delete", "projectID=$project->id"), "
", 'hiddenwin', "class='btn btn-action' title='{$this->lang->project->delete}'");
- }
+ $project->programID = $programID;
+ echo $this->buildOperateMenu($project, 'browse');
break;
}
echo '';
@@ -2357,4 +2311,115 @@ class projectModel extends model
->fetch();
return $result;
}
+
+ /**
+ * Build project action menu.
+ *
+ * @param object $project
+ * @param string $type
+ * @access public
+ * @return string
+ */
+ public function buildOperateMenu($project, $type = 'view')
+ {
+ $function = 'buildOperate' . ucfirst($type) . 'Menu';
+ return $this->$function($project);
+ }
+
+ /**
+ * Build project view action menu.
+ *
+ * @param object $project
+ * @access public
+ * @return string
+ */
+ public function buildOperateViewMenu($project)
+ {
+ if($project->deleted) return '';
+
+ $menu = '';
+ $params = "projectID=$project->id";
+
+ $menu .= "
";
+ $menu .= $this->buildMenu('project', 'start', $params, $project, 'view', 'play', '', 'iframe', true, '', $this->lang->project->start);
+ $menu .= $this->buildMenu('project', 'activate', $params, $project, 'view', 'magic', '', 'iframe', true, '', $this->lang->project->activate);
+ $menu .= $this->buildMenu('project', 'suspend', $params, $project, 'view', 'pause', '', 'iframe', true, '', $this->lang->project->suspend);
+ $menu .= $this->buildMenu('project', 'close', $params, $project, 'view', 'off', '', 'iframe', true, '', $this->lang->close);
+
+ $menu .= "
";
+ $menu .= $this->buildFlowMenu('project', $project, 'view', 'direct');
+ $menu .= "
";
+
+ $menu .= $this->buildMenu('project', 'edit', "project=$project->id&from=view", $project, 'button', 'edit', '', '', '', '', $this->lang->edit);
+ $menu .= $this->buildMenu('project', 'delete', "project=$project->id", $project, 'button', 'trash', 'hiddenwin', '', '', '', $this->lang->delete);
+
+ return $menu;
+ }
+
+ /**
+ * Build project browse action menu.
+ *
+ * @param object $project
+ * @access public
+ * @return string
+ */
+ public function buildOperateBrowseMenu($project)
+ {
+ $menu = '';
+ $params = "projectID=$project->id";
+
+ $moduleName = $this->config->systemMode == 'classic' ? "execution" : "project";
+ if($project->status == 'wait' || $project->status == 'suspended')
+ {
+ $menu .= $this->buildMenu($moduleName, 'start', $params, $project, 'browse', 'play', '', 'iframe', true);
+ }
+ if($project->status == 'doing') $menu .= $this->buildMenu($moduleName, 'close', $params, $project, 'browse', 'off', '', 'iframe', true);
+ if($project->status == 'closed') $menu .= $this->buildMenu($moduleName, 'activate', $params, $project, 'browse', 'magic', '', 'iframe', true);
+
+ if(common::hasPriv($moduleName, 'suspend') || (common::hasPriv($moduleName, 'close') && $project->status != 'doing') || (common::hasPriv($moduleName, 'activate') && $project->status != 'closed'))
+ {
+ $menu .= "
";
+ $menu .= "";
+ $menu .= "";
+ $menu .= "
";
+ }
+
+ $from = $project->from == 'project' ? 'project' : 'pgmproject';
+ $iframe = ($this->app->tab == 'program' || $project->model == 'kanban') ? 'iframe' : '';
+ $onlyBody = ($this->app->tab == 'program' || $project->model == 'kanban') ? true : '';
+ $dataApp = $this->config->systemMode == 'classic' ? "data-app=execution" : "data-app=project";
+ $attr = $project->model == 'kanban' ? " disabled='disabled'" : '';
+
+ $menu .= $this->buildMenu($moduleName, 'edit', $params, $project, 'browse', 'edit', '', $iframe, $onlyBody, $dataApp);
+
+ if($this->config->vision != 'lite')
+ {
+ $menu .= $this->buildMenu($moduleName, 'team', $params, $project, 'browse', 'group', '', '', '', $dataApp . $attr, $this->lang->execution->team);
+ if($this->config->systemMode == 'new') $menu .= $this->buildMenu('project', 'group', "$params&programID={$project->programID}", $project, 'browse', 'lock', '', '', '', $dataApp . $attr);
+
+ if(common::hasPriv($moduleName, 'manageProducts') || common::hasPriv($moduleName, 'whitelist') || common::hasPriv($moduleName, 'delete'))
+ {
+ $menu .= "
";
+ $menu .= "";
+ $menu .= "";
+ $menu .= "
";
+ }
+ }
+ else
+ {
+ $menu .= $this->buildMenu($moduleName, 'team', $params, $project, 'browse', 'group', '', '', '', $dataApp, $this->lang->execution->team);
+ if($this->config->systemMode == 'new') $menu .= $this->buildMenu('project', 'whitelist', "$params&module=project&from=$from", $project, 'browse', 'shield-check', '', 'btn-action', '', $dataApp);
+ $menu .= $this->buildMenu($moduleName, "delete", $params, $project, 'browse', 'trash', 'hiddenwin', 'btn-action');
+ }
+
+ return $menu;
+ }
}
diff --git a/module/project/view/view.html.php b/module/project/view/view.html.php
index 562956096c..8986fb8d76 100644
--- a/module/project/view/view.html.php
+++ b/module/project/view/view.html.php
@@ -96,25 +96,9 @@
- id";
- $browseLink = $this->session->projectList ? $this->session->projectList : inlink('browse');
- common::printBack($browseLink);
- if(!$project->deleted)
- {
- echo "
";
- common::printIcon('project', 'start', "projectID=$project->id", $project, 'button', 'play', '', 'iframe', true, '', $lang->project->start);
- common::printIcon('project', 'activate', "projectID=$project->id", $project, 'button', 'magic', '', 'iframe', true, '', $lang->project->activate);
- common::printIcon('project', 'suspend', "projectID=$project->id", $project, 'button', 'pause', '', 'iframe', true, '', $lang->project->suspend);
- common::printIcon('project', 'close', "projectID=$project->id", $project, 'button', 'off', '', 'iframe', true, '', $lang->close);
-
- echo $this->buildOperateMenu($project, 'view');
-
- echo "
";
- common::printIcon('project', 'edit', $params . '&from=view', $project, 'button', 'edit', '', '', '', '', $lang->edit);
- common::printIcon('project', 'delete', $params, $project, 'button', 'trash', 'hiddenwin', '', '', '', $lang->delete);
- }
- ?>
+ session->projectList ? $this->session->projectList : inlink('browse');?>
+
+ buildOperateMenu($project, 'view');?>
diff --git a/module/task/model.php b/module/task/model.php
index fca1b01bf0..7048674465 100644
--- a/module/task/model.php
+++ b/module/task/model.php
@@ -3399,20 +3399,7 @@ class taskModel extends model
echo helper::isZeroDate($task->activatedDate) ? '' : substr($task->activatedDate, 5, 11);
break;
case 'actions':
- if($storyChanged)
- {
- common::printIcon('task', 'confirmStoryChange', "taskid=$task->id", $task, 'list', '', 'hiddenwin');
- break;
- }
-
- if($task->status != 'pause') common::printIcon('task', 'start', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
- if($task->status == 'pause') common::printIcon('task', 'restart', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
- common::printIcon('task', 'close', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
- common::printIcon('task', 'finish', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
-
- common::printIcon('task', 'recordEstimate', "taskID=$task->id", $task, 'list', 'time', '', 'iframe', true);
- common::printIcon('task', 'edit', "taskID=$task->id", $task, 'list');
- if($this->config->vision == 'rnd') common::printIcon('task', 'batchCreate', "execution=$task->execution&storyID=$task->story&moduleID=$task->module&taskID=$task->id&ifame=0", $task, 'list', 'split', '', '', '', '', $this->lang->task->children);
+ echo $this->buildOperateMenu($task, 'browse');
break;
}
echo '';
@@ -3535,4 +3522,86 @@ class taskModel extends model
}
return $members;
}
+
+ /**
+ * Build task menu.
+ *
+ * @param object $task
+ * @param string $type
+ * @access public
+ * @return string
+ */
+ public function buildOperateMenu($task, $type = 'view')
+ {
+ $function = 'buildOperate' . ucfirst($type) . 'Menu';
+ return $this->$function($task);
+ }
+
+ /**
+ * Build task view menu.
+ *
+ * @param object $task
+ * @access public
+ * @return string
+ */
+ public function buildOperateViewMenu($task)
+ {
+ if($task->deleted) return '';
+
+ $menu = '';
+ $params = "taskID=$task->id";
+ if((empty($task->team) || empty($task->children)) && $task->executionList->type != 'kanban')
+ {
+ $menu .= $this->buildMenu('task', 'batchCreate', "execution=$task->execution&storyID=$task->story&moduleID=$task->module&taskID=$task->id", $task, 'view', 'split', '', '', '', "title='{$this->lang->task->children}'", $this->lang->task->children);
+ }
+ $menu .= $this->buildMenu('task', 'assignTo', "executionID=$task->execution&taskID=$task->id", $task, 'button', '', '', 'iframe', true, '', empty($task->team) ? $this->lang->task->assignTo : $this->lang->task->transfer);
+ $menu .= $this->buildMenu('task', 'start', $params, $task, 'view', '', '', 'iframe showinonlybody', true);
+ $menu .= $this->buildMenu('task', 'restart', $params, $task, 'view', '', '', 'iframe showinonlybody', true);
+ $menu .= $this->buildMenu('task', 'recordEstimate', $params, $task, 'view', '', '', 'iframe showinonlybody', true);
+ $menu .= $this->buildMenu('task', 'pause', $params, $task, 'view', '', '', 'iframe showinonlybody', true);
+ $menu .= $this->buildMenu('task', 'finish', $params, $task, 'view', '', '', 'iframe showinonlybody text-success', true);
+ $menu .= $this->buildMenu('task', 'activate', $params, $task, 'view', '', '', 'iframe showinonlybody text-success', true);
+ $menu .= $this->buildMenu('task', 'close', $params, $task, 'view', '', '', 'iframe showinonlybody', true);
+ $menu .= $this->buildMenu('task', 'cancel', $params, $task, 'view', '', '', 'iframe showinonlybody', true);
+
+ $menu .= "