sso->redirect)) echo "class='ranzhiFixedTfootAction'";?> >
diff --git a/module/doc/css/index.css b/module/doc/css/index.css
index 7a426166af..f45675040c 100644
--- a/module/doc/css/index.css
+++ b/module/doc/css/index.css
@@ -1,3 +1,4 @@
#pageActions ul.dropdown-menu {left: 67px;}
#mainRow .main-col .row .col-sm-7 {width: 55% !important;}
#mainRow .main-col .row .col-sm-5 {width: 45% !important;}
+#mainRow .c-num {text-overflow: ellipsis; white-space: nowrap;}
diff --git a/module/doc/css/x.view.css b/module/doc/css/x.view.css
index 2e87c4aa0f..7014d2b1e0 100644
--- a/module/doc/css/x.view.css
+++ b/module/doc/css/x.view.css
@@ -1,4 +1,4 @@
-.side-col.col-4 {display: none;}
+.side-col.col-4 {display: none; position: unset !important;}
#main {margin-bottom: 40px;}
#mainMenu {margin-top: 0px;}
#mainMenu .btn {display: none;}
diff --git a/module/doc/view/index.html.php b/module/doc/view/index.html.php
index 293176cd59..e52cdc849d 100644
--- a/module/doc/view/index.html.php
+++ b/module/doc/view/index.html.php
@@ -33,8 +33,8 @@
| doc->title;?> |
- doc->size;?> |
- doc->addedBy;?> |
+ doc->size;?> |
+ doc->addedBy;?> |
doc->editedDate;?> |
diff --git a/module/execution/control.php b/module/execution/control.php
index cf6b9eea59..433c01591d 100644
--- a/module/execution/control.php
+++ b/module/execution/control.php
@@ -727,6 +727,9 @@ class execution extends control
}
if($type == 'bymodule')
{
+ $module = $this->loadModel('tree')->getByID($param);
+ $productID = $module->root;
+
$_COOKIE['storyModuleParam'] = $param;
$_COOKIE['storyProductParam'] = 0;
$_COOKIE['storyBranchParam'] = 0;
@@ -820,7 +823,7 @@ class execution extends control
$actionURL = $this->createLink('execution', 'story', "executionID=$executionID&orderBy=$orderBy&type=bySearch&queryID=myQueryID");
$branchGroups = $this->loadModel('branch')->getByProducts(array_keys($products));
$branchOption = array();
- foreach($branchGroups as $productID => $branches)
+ foreach($branchGroups as $branches)
{
foreach($branches as $branchID => $name)
{
diff --git a/module/execution/css/x.bug.css b/module/execution/css/x.bug.css
index ae214a0d8a..ab6c8a986f 100644
--- a/module/execution/css/x.bug.css
+++ b/module/execution/css/x.bug.css
@@ -1,5 +1,5 @@
body {margin-bottom: 0px !important;}
-#main {min-width: unset; overflow-y: overlay;}
+#main {min-width: unset; overflow-y: overlay; position: unset !important;}
#main > .container {width: 100% !important;}
#mainContent > .main-col {margin-top: 0px;}
#mainMenu, #sidebar, .dropdown, .table-footer > .table-actions, .table-footer>.table-statistic, .pager > li > .pager-size-menu {display: none;}
diff --git a/module/execution/css/x.story.css b/module/execution/css/x.story.css
index 715f595609..5e9ce09e29 100644
--- a/module/execution/css/x.story.css
+++ b/module/execution/css/x.story.css
@@ -1,6 +1,6 @@
body {margin-bottom: 0px !important;}
#main {min-width: unset; overflow-y: overlay;}
-#main > .container {width: 100% !important;}
+#main > .container {width: 100% !important; position: unset !important;}
#mainContent > .main-col {margin-top: 0px;}
#mainMenu, #sidebar, .dropdown, .c-sort, .c-category, .c-user, .c-estimate, .c-stage, .c-count, .c-actions-7, .c-actions, .table-footer > .table-statistic, .table-footer > .table-actions, .pager > li > .pager-size-menu {display: none;}
#storyList > thead > tr > .c-status, #storyList > thead > tr > .c-pri, #storyList > tbody > tr > .c-status, #storyList > tbody > tr > .c-pri {display: table-cell !important;}
diff --git a/module/execution/css/x.task.css b/module/execution/css/x.task.css
index 1edfd18ad9..300514ffb8 100644
--- a/module/execution/css/x.task.css
+++ b/module/execution/css/x.task.css
@@ -1,7 +1,7 @@
body {margin-bottom: 0px !important;}
td .task-toggle {pointer-events: auto !important;}
#mainMenu, #sidebar, .dropdown, .table-footer > .table-actions, .table-footer > .table-statistic, .pager > li > .pager-size-menu {display: none;}
-#main {min-width: unset; overflow-y: overlay;}
+#main {min-width: unset; overflow-y: overlay; position: unset !important;}
#main > .container {width: 100% !important;}
#mainContent > .main-col {margin-top: 0px;}
#xx-title {background-color: #F2F2F2; padding-left: 15px; line-height: 36px;}
diff --git a/module/execution/js/kanban.js b/module/execution/js/kanban.js
index 1be0d9bd5f..50ac5ec859 100644
--- a/module/execution/js/kanban.js
+++ b/module/execution/js/kanban.js
@@ -293,7 +293,7 @@ function createColumnCreateMenu(options)
else if(col.type == 'wait')
{
if(priv.canCreateTask) items.push({label: taskLang.create, url: $.createLink('task', 'create', 'executionID=' + executionID + "&storyID=0&moduleID=0&taskID=0&todoID=0&extra=regionID=" + regionID + ",laneID=" + laneID + ",columnID=" + col.id, '', true), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}});
- if(priv.canBatchCreateTask) items.push({label: taskLang.batchCreate, url: $.createLink('task', 'batchcreate', 'executionID=' + executionID + "&storyID=0&moduleID=0&taskID=0&iframe=0&extra=regionID=" + regionID + ",laneID=" + laneID + ",columnID=" + col.id, '', true), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}});
+ if(priv.canBatchCreateTask) items.push({label: taskLang.batchCreate, url: $.createLink('task', 'batchcreate', 'executionID=' + executionID + "&storyID=0&moduleID=0&taskID=0&iframe=0&extra=regionID=" + regionID + ",laneID=" + laneID + ",columnID=" + col.id, '', true), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '90%'}});
if(priv.canImportBug && vision == 'rnd') items.push({label: executionLang.importBug, url: $.createLink('execution', 'importBug', 'executionID=' + executionID + "&storyID=0&moduleID=0&taskID=0&todoID=0&extra=laneID=" + laneID + ",columnID=" + col.id, '', true), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '90%'}});
}
return items;
@@ -1358,7 +1358,7 @@ function createBugMenu(options)
if(priv.canResolveBug && (bug.$col.type == 'unconfirmed' || bug.$col.type == 'confirmed' || bug.$col.type == 'fixing')) items.push({label: bugLang.resolve, icon: 'checked', url: createLink('bug', 'resolve', 'bugID=' + bug.id, '', 'true'), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}});
if(priv.canConfirmBug && (bug.$col.type == 'fixed' || bug.$col.type == 'testing' || bug.$col.type == 'tested')) items.push({label: bugLang.close, icon: 'off', url: createLink('bug', 'close', 'bugID=' + bug.id, '', 'true'), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}});
if(priv.canConfirmBug && bug.$col.type == 'unconfirmed') items.push({label: bugLang.confirmBug, icon: 'ok', url: createLink('bug', 'confirmbug', 'bugID=' + bug.id, '', 'true'), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}});
- if(priv.canCopyBug) items.push({label: bugLang.copy, icon: 'copy', url: createLink('bug', 'create', 'productID=' + productID + '&branch=' + '' + '&extras=bugID=' + bug.id, '', 'true'), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}});
+ if(priv.canCopyBug) items.push({label: bugLang.copy, icon: 'copy', url: createLink('bug', 'create', 'productID=' + productID + '&branch=&extras=bugID=' + bug.id + ',regionID=' + bug.$lane.region + ',laneID=' + bug.lane + ',columnID=' + bug.column + ',executionID=' + executionID, '', 'true'), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}});
if(priv.canToStoryBug && (bug.$col.type != 'closed')) items.push({label: bugLang.toStory, icon: 'lightbulb', url: createLink('story', 'create', 'product=' + productID + '&branch=' + '0' + '&module=' + '0' + '&story=' + '0' + '&execution=' + '0' + '&bugID=' + bug.id, '', 'true'), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}});
if(priv.canActivateBug && (bug.$col.type == 'fixed') || bug.$col.type == 'testing' || bug.$col.type == 'tested' || bug.$col.type == 'closed') items.push({label: bugLang.activate, icon: 'magic', url: createLink('bug', 'activate', 'bugID=' + bug.id, '', 'true'), className: 'iframe', attrs: {'data-toggle': 'modal', 'data-width': '80%'}});
if(priv.canDeleteBug) items.push({label: bugLang.delete, icon: 'trash', onClick: function(){deleteCard('bug', bug.id, bug.$lane.region)}});
diff --git a/module/execution/js/story.js b/module/execution/js/story.js
index 6eeeee6785..a6dcb47577 100644
--- a/module/execution/js/story.js
+++ b/module/execution/js/story.js
@@ -62,6 +62,8 @@ $(function()
}
else
{
+ if(!unlinkTaskIdList) return false;
+
$('#storyIdList').val(unlinkTaskIdList);
}
}
diff --git a/module/execution/js/taskkanban.js b/module/execution/js/taskkanban.js
index 28588a9b89..9fc36d555f 100644
--- a/module/execution/js/taskkanban.js
+++ b/module/execution/js/taskkanban.js
@@ -969,7 +969,7 @@ function createColumnCreateMenu(options)
else
{
if(priv.canCreateTask) items.push({label: taskLang.create, url: $.createLink('task', 'create', 'executionID=' + executionID, '', true), className: 'iframe', attrs: {'data-width': '80%'}});
- if(priv.canBatchCreateTask) items.push({label: taskLang.batchCreate, url: $.createLink('task', 'batchcreate', 'executionID=' + executionID, '', true), className: 'iframe', attrs: {'data-width': '80%'}});
+ if(priv.canBatchCreateTask) items.push({label: taskLang.batchCreate, url: $.createLink('task', 'batchcreate', 'executionID=' + executionID, '', true), className: 'iframe', attrs: {'data-width': '90%'}});
if(priv.canImportBug) items.push({label: executionLang.importBug, url: $.createLink('execution', 'importBug', 'executionID=' + executionID, '', true), className: 'iframe', attrs: {'data-width': '90%'}});
}
return items;
diff --git a/module/execution/model.php b/module/execution/model.php
index aea6c8cfff..bc4b048e4c 100644
--- a/module/execution/model.php
+++ b/module/execution/model.php
@@ -4309,12 +4309,12 @@ class executionModel extends model
* Print execution nested list.
*
* @param object $execution
- * @param int $isChild
+ * @param bool $isChild
* @param array $users
* @access public
* @return void
*/
- public function printNestedList($execution, $isChild = false, $users, $productID)
+ public function printNestedList($execution, $isChild, $users, $productID)
{
$this->loadModel('task');
$this->loadModel('execution');
@@ -4374,7 +4374,14 @@ class executionModel extends model
}
}
- common::printIcon('programplan', 'edit', "stageID=$execution->id&projectID=$execution->project", $execution, 'list', '', '', 'iframe', true);
+ if($execution->type == 'stage')
+ {
+ common::printIcon('programplan', 'edit', "stageID=$execution->id&projectID=$execution->project", $execution, 'list', '', '', 'iframe', true);
+ }
+ else
+ {
+ common::printIcon('execution', 'edit', "executionID=$execution->id", $execution, 'list', '', '', 'iframe', true);
+ }
$disabled = !empty($execution->children) ? ' disabled' : '';
if($execution->status != 'closed' and common::hasPriv('execution', 'close', $execution))
diff --git a/module/execution/view/bug.html.php b/module/execution/view/bug.html.php
index 0c457dbf6c..e0e77ed7c5 100644
--- a/module/execution/view/bug.html.php
+++ b/module/execution/view/bug.html.php
@@ -210,7 +210,7 @@ $(function(){$('#executionBugForm').table();})
function handleLinkButtonClick()
{
- var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace(/\.xhtml/, '.html'));
+ var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace('xhtml', 'html'));
window.open(xxcUrl);
}
diff --git a/module/execution/view/importtask.html.php b/module/execution/view/importtask.html.php
index b47802bb63..03b40897ad 100644
--- a/module/execution/view/importtask.html.php
+++ b/module/execution/view/importtask.html.php
@@ -60,7 +60,7 @@
execution];?> |
pri == '0' ? '' : zget($lang->task->priList, $task->pri, $task->pri);?> |
- id", $task->name, '', "class='preview'", true, isonlybody())) echo $task->name;?> |
+ id", $task->name, '', "class='preview'", true, true)) echo $task->name;?> |
>assignedToRealName;?> |
left . ' ' . $lang->execution->workHourUnit;?> |
delay)) echo 'delayed';?>>deadline, 0, 4) > 0) echo $task->deadline;?> |
diff --git a/module/execution/view/kanban.html.php b/module/execution/view/kanban.html.php
index 85767b6478..95568a7e96 100644
--- a/module/execution/view/kanban.html.php
+++ b/module/execution/view/kanban.html.php
@@ -214,7 +214,7 @@ js::set('priv',
' . html::a(helper::createLink('task', 'create', "execution=$execution->id", '', true), $lang->task->create, '', "class='iframe'") . '';?>
' . html::a(helper::createLink('execution', 'importBug', "executionID=$execution->id", '', true), $lang->execution->importBug, '', "class='iframe' data-width=90%") . '';?>
' . html::a(helper::createLink('execution', 'importTask', "toExecution=$execution->id", '', true), $lang->execution->importTask, '', "class='iframe' data-width=90%") . '';?>
- ' . html::a(helper::createLink('task', 'batchCreate', "execution=$execution->id", '', true), $lang->execution->batchCreateTask, '', "class='iframe'") . '';?>
+ ' . html::a(helper::createLink('task', 'batchCreate', "execution=$execution->id", '', true), $lang->execution->batchCreateTask, '', "class='iframe' data-width=90%") . '';?>
diff --git a/module/execution/view/story.html.php b/module/execution/view/story.html.php
index 933e131229..0fd94dc27d 100644
--- a/module/execution/view/story.html.php
+++ b/module/execution/view/story.html.php
@@ -400,7 +400,7 @@ $(function()
});
function handleLinkButtonClick()
{
- var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace(/\.xhtml/, '.html'));
+ var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace('xhtml', 'html'));
window.open(xxcUrl);
}
diff --git a/module/execution/view/task.html.php b/module/execution/view/task.html.php
index 9be2c7db19..c22f33ac04 100644
--- a/module/execution/view/task.html.php
+++ b/module/execution/view/task.html.php
@@ -477,7 +477,7 @@ $(function()
app->getViewType() == 'xhtml'):?>
function handleLinkButtonClick()
{
- var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace(/\.xhtml/, '.html'));
+ var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace('xhtml', 'html'));
window.open(xxcUrl);
}
diff --git a/module/execution/view/taskkanban.html.php b/module/execution/view/taskkanban.html.php
index c2e2f5d370..fffb0e79c6 100644
--- a/module/execution/view/taskkanban.html.php
+++ b/module/execution/view/taskkanban.html.php
@@ -116,7 +116,7 @@
' . html::a(helper::createLink('execution', 'importBug', "execution=$execution->id", '', true), $lang->execution->importBug, '', "class='iframe'") . '';?>
' . html::a(helper::createLink('task', 'create', "execution=$execution->id", '', true), $lang->task->create, '', "class='iframe'") . '';?>
- ' . html::a(helper::createLink('task', 'batchCreate', "execution=$execution->id", '', true), $lang->execution->batchCreateTask, '', "class='iframe'") . '';?>
+ ' . html::a(helper::createLink('task', 'batchCreate', "execution=$execution->id", '', true), $lang->execution->batchCreateTask, '', "class='iframe' data-width=90%") . '';?>
diff --git a/module/job/control.php b/module/job/control.php
index ac4677c3c0..d25c6a0fe9 100644
--- a/module/job/control.php
+++ b/module/job/control.php
@@ -38,6 +38,9 @@ class job extends control
*/
public function browse($repoID = 0, $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
{
+ $repos = $this->loadModel('repo')->getRepoPairs('devops');
+ if(empty($repos)) $this->locate($this->repo->createLink('create'));
+
/* Set session. */
$this->loadModel('ci')->setMenu($repoID);
diff --git a/module/product/css/x.browse.css b/module/product/css/x.browse.css
index 1f1abfbddb..7486d97710 100644
--- a/module/product/css/x.browse.css
+++ b/module/product/css/x.browse.css
@@ -1,7 +1,7 @@
body {margin-bottom: 0px !important;}
td .story-toggle {pointer-events: auto !important;}
#mainMenu, #sidebar, .table-footer > .table-actions, .dropdown, .table-footer>.table-statistic, .pager > li > .pager-size-menu {display: none;}
-#main {min-width: unset; overflow-y: overlay;}
+#main {min-width: unset; overflow-y: overlay; position: unset !important;}
#main > .container {width: 100% !important;}
#mainContent > .main-col {margin-top: 0px;}
#xx-title {background-color: #F2F2F2; padding-left: 15px; line-height: 40px;}
diff --git a/module/product/view/browse.html.php b/module/product/view/browse.html.php
index 770dd3c972..9b340e2ed5 100644
--- a/module/product/view/browse.html.php
+++ b/module/product/view/browse.html.php
@@ -749,7 +749,7 @@ function setBadgeStyle(obj, isShow)
function handleLinkButtonClick()
{
- var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace(/\.xhtml/, '.html'));
+ var xxcUrl = "xxc:openInApp/zentao-integrated/" + encodeURIComponent(window.location.href.replace(/.display=card/, '').replace('xhtml', 'html'));
window.open(xxcUrl);
}
diff --git a/module/productplan/control.php b/module/productplan/control.php
index 9f2dc98d98..fb31e69a96 100644
--- a/module/productplan/control.php
+++ b/module/productplan/control.php
@@ -244,11 +244,11 @@ class productplan extends control
public function delete($planID, $confirm = 'no')
{
$plan = $this->productplan->getById($planID);
- if($plan->parent < 0) die(js::alert($this->lang->productplan->cannotDeleteParent));
+ if($plan->parent < 0) return print(js::alert($this->lang->productplan->cannotDeleteParent));
if($confirm == 'no')
{
- die(js::confirm($this->lang->productplan->confirmDelete, $this->createLink('productPlan', 'delete', "planID=$planID&confirm=yes")));
+ return print(js::confirm($this->lang->productplan->confirmDelete, $this->createLink('productPlan', 'delete', "planID=$planID&confirm=yes")));
}
else
{
@@ -274,7 +274,7 @@ class productplan extends control
}
if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess));
- die(js::reload('parent'));
+ return print(js::reload('parent'));
}
}
@@ -390,7 +390,7 @@ class productplan extends control
if(!$plan)
{
if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'fail', 'code' => 404, 'message' => '404 Not found'));
- die(js::error($this->lang->notFound) . js::locate($this->createLink('product', 'index')));
+ return print(js::error($this->lang->notFound) . js::locate($this->createLink('product', 'index')));
}
$this->session->set('storyList', $this->createLink('productplan', 'view', "planID=$planID&type=story"), 'product');
@@ -543,14 +543,14 @@ class productplan extends control
{
if($confirm == 'no')
{
- die(js::confirm($this->lang->productplan->confirmActivate, $this->createLink('productplan', 'activate', "planID=$planID&confirm=yes"), 'parent'));
+ return print(js::confirm($this->lang->productplan->confirmActivate, $this->createLink('productplan', 'activate', "planID=$planID&confirm=yes"), 'parent'));
}
else
{
$this->productplan->updateStatus($planID, 'doing', 'activated');
- if(dao::isError()) die(js::error(dao::getError()));
- die(js::reload('parent'));
+ if(dao::isError()) return print(js::error(dao::getError()));
+ return print(js::reload('parent'));
}
}
@@ -625,7 +625,7 @@ class productplan extends control
{
$this->productplan->linkStory($planID);
if($this->viewType == 'json') return $this->send(array('result' => 'success'));
- die(js::locate(inlink('view', "planID=$planID&type=story&orderBy=$orderBy"), 'parent'));
+ return print(js::locate(inlink('view', "planID=$planID&type=story&orderBy=$orderBy"), 'parent'));
}
$this->session->set('storyList', inlink('view', "planID=$planID&type=story&orderBy=$orderBy&link=true¶m=" . helper::safe64Encode("&browseType=$browseType&queryID=$param")), 'product');
@@ -710,7 +710,7 @@ class productplan extends control
{
if($confirm == 'no')
{
- die(js::confirm($this->lang->productplan->confirmUnlinkStory, $this->createLink('productplan', 'unlinkstory', "storyID=$storyID&planID=$planID&confirm=yes")));
+ return print(js::confirm($this->lang->productplan->confirmUnlinkStory, $this->createLink('productplan', 'unlinkstory', "storyID=$storyID&planID=$planID&confirm=yes")));
}
else
{
@@ -732,7 +732,7 @@ class productplan extends control
}
return $this->send($response);
}
- die(js::reload('parent'));
+ return print(js::reload('parent'));
}
}
@@ -771,7 +771,7 @@ class productplan extends control
{
$this->productplan->linkBug($planID);
if($this->viewType == 'json') return $this->send(array('result' => 'success'));
- die(js::locate(inlink('view', "planID=$planID&type=bug&orderBy=$orderBy"), 'parent'));
+ return print(js::locate(inlink('view', "planID=$planID&type=bug&orderBy=$orderBy"), 'parent'));
}
/* Load module and set session. */
@@ -852,7 +852,7 @@ class productplan extends control
{
if($confirm == 'no')
{
- die(js::confirm($this->lang->productplan->confirmUnlinkBug, $this->createLink('productplan', 'unlinkbug', "bugID=$bugID&confirm=yes")));
+ return print(js::confirm($this->lang->productplan->confirmUnlinkBug, $this->createLink('productplan', 'unlinkbug', "bugID=$bugID&confirm=yes")));
}
else
{
@@ -874,7 +874,7 @@ class productplan extends control
}
return $this->send($response);
}
- die(js::reload('parent'));
+ return print(js::reload('parent'));
}
}
diff --git a/module/productplan/css/x.view.css b/module/productplan/css/x.view.css
index ed93fc1ed9..0099dbac1e 100644
--- a/module/productplan/css/x.view.css
+++ b/module/productplan/css/x.view.css
@@ -1,6 +1,6 @@
#mainMenu, .actions, .pager-size-menu, .tab-btn-container ul li span {display: none;}
-#main {min-width: unset; overflow-y: overlay;}
-.main-content {padding: 0; }
+#main {min-width: unset; overflow-y: overlay; position: unset !important;}
+.main-content {padding: 0;}
.main-table {margin-bottom: 40px;}
.main-content, .main-table > .table, .main-table > .table-footer, .main-table > .table-header, .main-table > .table-responsive {box-shadow: none!important;}
.table-footer {position: fixed; width: 100%; bottom: 0;}
diff --git a/module/productplan/view/view.html.php b/module/productplan/view/view.html.php
index 4aaab515ba..584c631b62 100644
--- a/module/productplan/view/view.html.php
+++ b/module/productplan/view/view.html.php
@@ -609,7 +609,7 @@
diff --git a/module/task/control.php b/module/task/control.php
index 0aaa687020..e7d5578ab6 100755
--- a/module/task/control.php
+++ b/module/task/control.php
@@ -438,7 +438,7 @@ class task extends control
$customFields[$field] = $this->lang->task->$field;
}
- if($execution->lifetime == 'ops') unset($customFields['story']);
+ if($execution->lifetime == 'ops' or $execution->attribute == 'request' or $execution->attribute == 'review') unset($customFields['story']);
$this->view->customFields = $customFields;
$this->view->showFields = $this->config->task->custom->batchCreateFields;
@@ -801,7 +801,7 @@ class task extends control
if(($this->app->tab == 'execution' or ($this->config->vision == 'lite' and $this->app->tab == 'project')) and $execution->type == 'kanban')
{
$rdSearchValue = $this->session->rdSearchValue ? $this->session->rdSearchValue : '';
- $kanbanData = $this->loadModel('kanban')->getRDKanban($task->execution, $execLaneType, 'id_desc', 0, $execGroup, $rdSearchValue);
+ $kanbanData = $this->loadModel('kanban')->getRDKanban($task->execution, $execLaneType, 'id_desc', 0, $execGroupBy, $rdSearchValue);
$kanbanData = json_encode($kanbanData);
return print(js::closeModal('parent.parent', '', "parent.parent.updateKanban($kanbanData)"));
diff --git a/module/task/css/x.view.css b/module/task/css/x.view.css
index 5a96385b1f..94c67e8533 100644
--- a/module/task/css/x.view.css
+++ b/module/task/css/x.view.css
@@ -1,5 +1,5 @@
body * {font-size: 13px !important; line-height: 1.42857143; color: rgb(51, 51, 51);}
-#main {margin-bottom: 40px; min-width: unset;}
+#main {margin-bottom: 40px; min-width: unset; position: unset !important;}
#mainMenu .pull-left > a, #mainMenu .pull-left .divider, #mainMenu .pull-right, #mainContent .col-4, .main-actions {display: none;}
#mainMenu {position: fixed; width: 100%; z-index: 999;}
#scrollContent {margin-top: 35px; height: calc(100% - 70px); display: block; overflow: hidden;}
diff --git a/module/task/js/create.js b/module/task/js/create.js
index ab94beed36..4e87cc3cf1 100644
--- a/module/task/js/create.js
+++ b/module/task/js/create.js
@@ -6,7 +6,7 @@ $(function()
var fieldList = showFields + ',';
var requiredList = ',' + requiredFields + ',';
- if(lifetime == 'ops')
+ if(lifetime == 'ops' || (typeof execAttribute != 'undefined' && (execAttribute == 'request' || execAttribute == 'review')))
{
$('#fieldsstory').parent('div').addClass('hidden');
}
@@ -22,6 +22,10 @@ $(function()
saveCustomFields('createFields');
return false;
});
+
+ var executionID = $('#execution').val();
+ loadStories(executionID);
+
})
/**
@@ -299,7 +303,7 @@ function setLane(regionID)
/* Get select of stories.*/
function setStories(moduleID, executionID)
{
- link = createLink('story', 'ajaxGetExecutionStories', 'executionID=' + executionID + '&productID=0&branch=all&moduleID=' + moduleID + '&storyID=0&number=&type=full&status=unclosed');
+ link = createLink('story', 'ajaxGetExecutionStories', 'executionID=' + executionID + '&productID=0&branch=all&moduleID=' + moduleID + '&storyID=0&number=&type=full&status=active');
$.get(link, function(stories)
{
var storyID = $('#story').val();
diff --git a/module/task/model.php b/module/task/model.php
index 05c7217e63..857e6eef83 100644
--- a/module/task/model.php
+++ b/module/task/model.php
@@ -116,8 +116,8 @@ class taskModel extends model
$task = $this->loadModel('file')->processImgURL($task, $this->config->task->editor->create['id'], $this->post->uid);
/* Fix Bug #1525 */
- $executionLifetime = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($executionID)->fetch('lifetime');
- if($executionLifetime == 'ops')
+ $execution = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($task->execution)->fetch();
+ if($execution->lifetime == 'ops' or $execution->attribute == 'request' or $execution->attribute == 'review')
{
$requiredFields = str_replace(",story,", ',', "$requiredFields");
$task->story = 0;
@@ -381,9 +381,9 @@ class taskModel extends model
}
/* Fix bug #1525*/
- $executionLifetime = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($executionID)->fetch('lifetime');
+ $execution = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($executionID)->fetch();
$requiredFields = ',' . $this->config->task->create->requiredFields . ',';
- if($executionLifetime == 'ops') $requiredFields = str_replace(',story,', ',', $requiredFields);
+ if($execution->lifetime == 'ops' or $execution->attribute == 'request' or $execution->attribute == 'review') $requiredFields = str_replace(',story,', ',', $requiredFields);
$requiredFields = trim($requiredFields, ',');
/* check data. */
@@ -809,7 +809,7 @@ class taskModel extends model
}
else
{
- if($team[$oldTask->assignedTo]->left == 0 && $team[$oldTask->assignedTo]->consumed != 0)
+ if($team[$oldTask->assignedTo]->left == 0 and $team[$oldTask->assignedTo]->consumed != 0 and $this->app->rawMethod != 'deleteestimate')
{
if($oldTask->assignedTo != $teams[count($teams) - 1])
{
@@ -1036,9 +1036,9 @@ class taskModel extends model
$task->mode = '';
}
- $executionLifetime = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($task->execution)->fetch('lifetime');
+ $execution = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($task->execution)->fetch();
$requiredFields = "," . $this->config->task->edit->requiredFields . ",";
- if($executionLifetime == 'ops')
+ if($execution->lifetime == 'ops' or $execution->attribute == 'request' or $execution->attribute == 'review')
{
$requiredFields = str_replace(",story,", ',', "$requiredFields");
$task->story = 0;
@@ -1804,6 +1804,8 @@ class taskModel extends model
$data->assignedDate = $now;
$data->finishedBy = $this->app->user->account;
$data->finishedDate = $now;
+
+ $this->action->create('task', $taskID, 'Finished');
}
elseif($task->status == 'wait')
{
@@ -2512,7 +2514,7 @@ class taskModel extends model
->orWhere('t1.finishedList')->like("%,{$account},%")
->markRight(1)
->fi()
- ->beginIF($this->app->rawModule == 'my' or $this->app->rawModule == 'block')->andWhere('(t2.status')->ne('suspended')->orWhere('t4.status')->ne('suspended')->markRight(1)->fi()
+ ->beginIF($type == 'assignedTo' and ($this->app->rawModule == 'my' or $this->app->rawModule == 'block'))->andWhere('t2.status', true)->ne('suspended')->orWhere('t4.status')->ne('suspended')->markRight(1)->fi()
->beginIF($type != 'all' and $type != 'finishedBy' and $type != 'assignedTo')->andWhere("t1.`$type`")->eq($account)->fi()
->beginIF($type == 'assignedTo')->andWhere("(t1.assignedTo = '{$account}' or (t1.mode = 'multi' and t5.`account` = '{$account}') )")->fi()
->orderBy($orderBy)
@@ -3738,6 +3740,7 @@ class taskModel extends model
public function getFinishedUsers($taskID = 0, $team = array())
{
$task = $this->getById($taskID);
+ if($task->activatedDate == '') $task->activatedDate = "0000-00-00";
return $this->dao->select('actor')->from(TABLE_ACTION)
->where('objectType')->eq('task')
->andWhere('objectID')->eq($taskID)
@@ -3757,7 +3760,7 @@ class taskModel extends model
* @access public
* @return string
*/
- public function buildNestedList($execution, $task, $isChild = false, $showmore = false, $users)
+ public function buildNestedList($execution, $task, $isChild = false, $showmore = false, $users = array())
{
$showmore = $showmore ? 'showmore' : '';
$trAttrs = "data-id='t$task->id'";
diff --git a/module/task/view/batchcreate.html.php b/module/task/view/batchcreate.html.php
index 7c0c74879b..45e08a1aa3 100755
--- a/module/task/view/batchcreate.html.php
+++ b/module/task/view/batchcreate.html.php
@@ -45,7 +45,7 @@ $colspan = count($visibleFields) + 3;
task->batchCreate;?>
- lifetime != 'ops'):?>
+ lifetime != 'ops' and $execution->attribute != 'request' and $execution->attribute != 'review'):?>
@@ -67,7 +67,7 @@ $colspan = count($visibleFields) + 3;
| idAB;?> |
moduleBox'>task->module?> |
- lifetime != 'ops'):?>
+ lifetime != 'ops' and $execution->attribute != 'request' and $execution->attribute != 'review'):?>
storyBox'>task->story;?> |
task->name;?> |
@@ -99,7 +99,7 @@ $colspan = count($visibleFields) + 3;
$lang->task->typeList['ditto'] = $lang->task->ditto;
$members['ditto'] = $lang->task->ditto;
$modules['ditto'] = $lang->task->ditto;
- if($execution->lifetime == 'ops') $colspan = $colspan - 1;
+ if($execution->lifetime != 'ops' and $execution->attribute != 'request' and $execution->attribute != 'review') $colspan = $colspan - 1;
?>
task->batchCreate; $i++):?>
id)'")?>
- lifetime != 'ops'):?>
+ lifetime != 'ops' and $execution->attribute != 'request' and $execution->attribute != 'review'):?>
@@ -266,7 +266,7 @@ $colspan = count($visibleFields) + 3;
|
- lifetime != 'ops'):?>
+ lifetime != 'ops' and $execution->attribute != 'request' and $execution->attribute != 'review'):?>
diff --git a/module/task/view/create.html.php b/module/task/view/create.html.php
index 139676690b..3dd6fba585 100644
--- a/module/task/view/create.html.php
+++ b/module/task/view/create.html.php
@@ -21,7 +21,7 @@
error->notempty, $lang->task->estimate))?>
lifetime);?>
-
+
team) or $task->assignedTo == $this->app->user->account or ($task->mode == 'multi' and isset($task->team[$app->user->account]))):?>
app->user->admin or $this->app->user->account == $estimate->account)
+ if($this->app->user->account == $estimate->account)
{
common::printIcon('task', 'editEstimate', "estimateID=$estimate->id", '', 'list', 'pencil', '', 'showinonlybody', true);
common::printIcon('task', 'deleteEstimate', "estimateID=$estimate->id", '', 'list', 'close', 'hiddenwin', 'showinonlybody');
diff --git a/module/task/view/view.html.php b/module/task/view/view.html.php
index e2f4091aa7..f0732f48dd 100644
--- a/module/task/view/view.html.php
+++ b/module/task/view/view.html.php
@@ -166,8 +166,10 @@
+
' . $lang->goback, '', "class='btn btn-secondary'");?>
- ";?>
+ ";?>
+
executionList = $execution;?>
task->buildOperateMenu($task, 'view');?>
@@ -442,7 +444,7 @@
diff --git a/module/testcase/css/x.view.css b/module/testcase/css/x.view.css
index 8d3fc89b31..7e268496c8 100644
--- a/module/testcase/css/x.view.css
+++ b/module/testcase/css/x.view.css
@@ -1,5 +1,5 @@
.side-col.col-4 {display: none;}
-#main {margin-bottom: 40px;}
+#main {margin-bottom: 40px; position: unset !important;}
#mainMenu {margin-top: 0px;}
#mainMenu .btn {display: none;}
#mainMenu .divider {display: none;}
diff --git a/module/upgrade/model.php b/module/upgrade/model.php
index d92a655196..450dd6afd5 100644
--- a/module/upgrade/model.php
+++ b/module/upgrade/model.php
@@ -4742,6 +4742,7 @@ class upgradeModel extends model
$data->begin = $projects[$projectID]->begin;
$data->end = $projects[$projectID]->end;
$data->projectStatus = $projects[$projectID]->status;
+ $data->team = $projects[$projectID]->team;
$data->PM = $projects[$projectID]->PM;
$data->projectAcl = $projects[$projectID]->acl == 'custom' ? 'private' : $projects[$projectID]->acl;
diff --git a/module/user/js/batchcreate.js b/module/user/js/batchcreate.js
index 8e7bd97935..baad36b81d 100644
--- a/module/user/js/batchcreate.js
+++ b/module/user/js/batchcreate.js
@@ -91,18 +91,45 @@ $(document).on('change', '[id^=visions]', function()
}
})
-$('select[id^="visions"]').each(function()
+var rndGroupSelect = liteGroupSelect = allGroupSelect = emptyGroupSelect = '';
+$.post(createLink('user', 'ajaxGetGroup', "visions=rnd&i=2"), function(data)
{
- var i = $(this).attr('id').replace(/[^0-9]/ig, '');
+ rndGroupSelect = data;
var vision = $('#visions1 option:selected').val();
+ if(vision == 'rnd') initGroup(data);
+});
+$.post(createLink('user', 'ajaxGetGroup', "visions=lite&i=2"), function(data)
+{
+ liteGroupSelect = data;
+ var vision = $('#visions1 option:selected').val();
+ if(vision == 'lite') initGroup(data);
+});
+$.post(createLink('user', 'ajaxGetGroup', "visions=rnd,lite&i=2"), function(data)
+{
+ allGroupSelect = data;
+});
+$.post(createLink('user', 'ajaxGetGroup', "visions=null&i=2"), function(data)
+{
+ emptyGroupSelect = data;
+});
- $.post(createLink('user', 'ajaxGetGroup', "visions=" + vision + '&i=' + i + '&selected=' + $('#group' + i).val()), function(data)
+function initGroup(data)
+{
+ $('select[id^="visions"]').each(function()
{
- $('#group' + i).replaceWith(data);
- $('#group' + i + '_chosen').remove();
- $('#group' + i).chosen();
+ var i = $(this).attr('id').replace(/[^0-9]/ig, '');
+ var groupVal = $('#group' + i).val();
+
+ var dataObj = $(data);
+ var dataHtml = $(dataObj).attr('id', 'group' + i).attr('name', 'group[' + i + '][]').prop('outerHTML');
+
+ $('#group' + i).replaceWith(dataHtml);
+ $('#group' + i + '_chosen').remove();
+ if(i == 1) $('#group' + i).find('option[value="ditto"]').remove();
+ $('#group' + i).val(groupVal);
+ $('#group' + i).chosen();
})
-})
+}
$(document).on('change', "select[id^='visions']", function()
{
@@ -119,6 +146,22 @@ $(document).on('change', "select[id^='visions']", function()
$('#group' + i).chosen();
})
+ visions = visions ? visions.join() : '';
+ switch(visions)
+ {
+ case 'rnd':
+ var data = rndGroupSelect;
+ break;
+ case 'lite':
+ var data = liteGroupSelect;
+ break;
+ case 'rnd,lite':
+ var data = allGroupSelect;
+ break;
+ default:
+ var data = emptyGroupSelect;
+ break;
+ }
for(n = i + 1; n <= batchCreateCount; n++)
{
if(n == i) continue;
@@ -126,12 +169,12 @@ $(document).on('change', "select[id^='visions']", function()
((function(n)
{
- $.post(createLink('user', 'ajaxGetGroup', "visions=" + visions + '&i=' + n + '&selected=' + $('#group' + n).val()), function(data)
- {
- $('#group' + n).replaceWith(data);
- $('#group' + n + '_chosen').remove();
- $('#group' + n).chosen();
- })
+ var groupVal = $('#group' + n).val();
+ var dataHtml = $(data).attr('id', 'group' + n).attr('name', 'group[' + n + '][]').prop('outerHTML');
+ $('#group' + n).replaceWith(dataHtml);
+ $('#group' + n + '_chosen').remove();
+ $('#group' + n).val(groupVal);
+ $('#group' + n).chosen();
}(n)));
}
});
diff --git a/www/theme/default/style.css b/www/theme/default/style.css
index 9af189801e..a8fda8a560 100644
--- a/www/theme/default/style.css
+++ b/www/theme/default/style.css
@@ -98,3 +98,4 @@ body.xxc-embed {overflow-x: auto; overflow-y: hidden;}
.xxc-embed #toolbar {position: fixed;right: 120px!important;}
.xxc-embed #main {position: absolute;top: 50px;bottom: 0;left: 0;right: 0;overflow: auto;}
.xxc-embed .fix-table-copy-wrapper {top: 50px!important;}
+.xxc-embed #headerActions {right: 310px!important;}
diff --git a/xuanxuan/extension/xuan/misc/ext/control/downloadclient.php b/xuanxuan/extension/xuan/misc/ext/control/downloadclient.php
index d7549292d9..370e01f042 100644
--- a/xuanxuan/extension/xuan/misc/ext/control/downloadclient.php
+++ b/xuanxuan/extension/xuan/misc/ext/control/downloadclient.php
@@ -102,6 +102,7 @@ class myMisc extends misc
if($action == 'downloadPackage')
{
+ ini_set('memory_limit', '512M');
$account = $this->app->user->account;
$clientDir = $this->app->wwwRoot . 'data/client/' . "$account/";
| |