diff --git a/module/block/control.php b/module/block/control.php index 2749c70c77..3bb43b0046 100644 --- a/module/block/control.php +++ b/module/block/control.php @@ -164,6 +164,7 @@ class block extends control if($block) { $block->grid = $grid; + $block->params = helper::jsonEncode($block->params); $this->dao->replace(TABLE_BLOCK)->data($block)->exec(); if(dao::isError()) $this->send(array('result' => 'fail', 'code' => 500)); $this->send(array('result' => 'success')); @@ -187,7 +188,7 @@ class block extends control $inited = empty($this->config->$module->common->blockInited) ? '' : $this->config->$module->common->blockInited; /* Init block when vist index first. */ - if(empty($blocks) and !($inited and $inited->app == $module and $inited->value)) + if(empty($blocks) and !$inited) { if($this->block->initBlock($module)) die(js::reload()); } @@ -199,9 +200,9 @@ class block extends control $block->blockLink = $this->createLink('block', 'printBlock', "id=$block->id&module=$block->module"); $block->moreLink = ''; - if(isset($this->lang->block->modules[$module]->moreLinkList->{$blockID})) + if(isset($this->lang->block->modules[$block->source]->moreLinkList->{$blockID})) { - list($moduleName, $method, $vars) = explode('|', sprintf($this->lang->block->modules[$module]->moreLinkList->{$blockID}, $block->params->type)); + list($moduleName, $method, $vars) = explode('|', sprintf($this->lang->block->modules[$block->source]->moreLinkList->{$blockID}, isset($block->params->type) ? $block->params->type : '')); $block->moreLink = $this->createLink($moduleName, $method, $vars); } } @@ -559,6 +560,6 @@ class block extends control { $this->app->loadClass('pager', $static = true); $pager = pager::init(0, $this->params->num, 1); - $this->view->projectStats = $this->loadModel('project')->getProjectStats($status = 'undone', $productID = 0, $branch = 0, $itemCounts = 30, $orderBy = 'order_desc', $this->viewType != 'json' ? $pager : ''); + $this->view->projectStats = $this->loadModel('project')->getProjectStats($this->params->type, $productID = 0, $branch = 0, $itemCounts = 30, $orderBy = 'order_desc', $this->viewType != 'json' ? $pager : ''); } } diff --git a/module/block/lang/en.php b/module/block/lang/en.php index c86558fc3d..ba1888b897 100644 --- a/module/block/lang/en.php +++ b/module/block/lang/en.php @@ -219,7 +219,7 @@ $lang->block->modules['product']->moreLinkList = new stdclass(); $lang->block->modules['product']->moreLinkList->list = 'product|all|product=&status=%s'; $lang->block->modules['product']->moreLinkList->story = 'my|story|type=%s'; $lang->block->modules['project']->moreLinkList = new stdclass(); -$lang->block->modules['project']->moreLinkList->list = 'project|all|project=&status=%s'; +$lang->block->modules['project']->moreLinkList->list = 'project|all|status=%s&project='; $lang->block->modules['project']->moreLinkList->task = 'my|task|type=%s'; $lang->block->modules['qa']->moreLinkList = new stdclass(); $lang->block->modules['qa']->moreLinkList->bug = 'my|bug|type=%s'; diff --git a/module/block/lang/zh-cn.php b/module/block/lang/zh-cn.php index 624822af90..b28af17485 100644 --- a/module/block/lang/zh-cn.php +++ b/module/block/lang/zh-cn.php @@ -221,7 +221,7 @@ $lang->block->modules['product']->moreLinkList = new stdclass(); $lang->block->modules['product']->moreLinkList->list = 'product|all|product=&status=%s'; $lang->block->modules['product']->moreLinkList->story = 'my|story|type=%s'; $lang->block->modules['project']->moreLinkList = new stdclass(); -$lang->block->modules['project']->moreLinkList->list = 'project|all|project=&status=%s'; +$lang->block->modules['project']->moreLinkList->list = 'project|all|status=%s&project='; $lang->block->modules['project']->moreLinkList->task = 'my|task|type=%s'; $lang->block->modules['qa']->moreLinkList = new stdclass(); $lang->block->modules['qa']->moreLinkList->bug = 'my|bug|type=%s'; diff --git a/module/block/view/dashboard.html.php b/module/block/view/dashboard.html.php index 85b67fcaf2..e68ffe1f0d 100644 --- a/module/block/view/dashboard.html.php +++ b/module/block/view/dashboard.html.php @@ -37,7 +37,7 @@ if(isset($pageCSS)) css::internal($pageCSS); - moreLink)):?> + moreLink)):?> moreLink, $block->title . " ", null, "class='panel-title drag-disabled' title='$lang->more' data-toggle='tooltip' data-placement='right'"); ?> title;?> diff --git a/module/block/view/projectblock.html.php b/module/block/view/projectblock.html.php index 866e3bf07c..80946065f5 100644 --- a/module/block/view/projectblock.html.php +++ b/module/block/view/projectblock.html.php @@ -10,6 +10,8 @@ * @link http://www.zentao.net */ ?> +config->webRoot . 'js/';?> +
diff --git a/module/bug/control.php b/module/bug/control.php index e2bc1396ef..cf7d25809c 100644 --- a/module/bug/control.php +++ b/module/bug/control.php @@ -602,10 +602,15 @@ class bug extends control { $product = $this->product->getByID($productID); + /* Set plans. */ + $plans = $this->loadModel('productplan')->getPairs($productID, $branch); + $plans['ditto'] = $this->lang->bug->ditto; + /* Set product menu. */ $this->bug->setMenu($this->products, $productID, $branch); $this->view->title = $product->name . $this->lang->colon . "BUG" . $this->lang->bug->batchEdit; $this->view->position[] = html::a($this->createLink('bug', 'browse', "productID=$productID&branch=$branch"), $this->products[$productID]); + $this->view->plans = $plans; } /* The bugs of my. */ else @@ -631,11 +636,11 @@ class bug extends control $this->view->customFields = $customFields; $this->view->showFields = $this->config->bug->custom->batchedit; - /* Set ditto option for users and type, severity, pri, resolution list. */ + /* Set users. */ $users = $this->user->getPairs('nodeleted,devfirst'); $users['ditto'] = $this->lang->bug->ditto; - $plans = $this->loadModel('productplan')->getPairs($productID, $branch); - $plans['ditto'] = $this->lang->bug->ditto; + + /* Set ditto option for users and type, severity, pri, resolution list. */ $this->lang->bug->typeList['ditto'] = $this->lang->bug->ditto; $this->lang->bug->priList['ditto'] = $this->lang->bug->ditto; $this->lang->bug->resolutionList['ditto'] = $this->lang->bug->ditto; @@ -656,7 +661,6 @@ class bug extends control $this->view->bugs = $bugs; $this->view->branch = $branch; $this->view->users = $users; - $this->view->plans = $plans; $this->display(); } diff --git a/module/bug/js/batchedit.js b/module/bug/js/batchedit.js index a66f0cf3f5..3b958af9c0 100644 --- a/module/bug/js/batchedit.js +++ b/module/bug/js/batchedit.js @@ -27,6 +27,8 @@ $(function() }); }) +$(document).on('click', '.chosen-with-drop', function(){oldValue = $(this).prev('select').val();}) + $(document).on('change', 'select', function() { if($(this).val() == 'ditto') @@ -49,7 +51,26 @@ $(document).on('change', 'select', function() if(value != 'ditto') break; } - $(this).val(value); + isPlans = $(this).attr('name').indexOf('plans') != -1; + + if(isPlans) + { + var valueStr = ',' + $(this).find('option').map(function(){return $(this).val();}).get().join(',') + ','; + if(valueStr.indexOf(',' + value + ',') != -1) + { + $(this).val(value); + } + else + { + alert(dittoNotice); + $(this).val(oldValue); + } + } + else + { + $(this).val(value); + } + $(this).trigger("chosen:updated"); $(this).trigger("change"); } diff --git a/module/bug/lang/en.php b/module/bug/lang/en.php index 33397c7b7e..49d005375e 100644 --- a/module/bug/lang/en.php +++ b/module/bug/lang/en.php @@ -107,7 +107,9 @@ $lang->bug->allBugs = 'Allbug'; $lang->bug->byQuery = 'Search'; $lang->bug->needConfirm = 'StoryChanged'; $lang->bug->allProduct = "All {$lang->productCommon}s"; -$lang->bug->ditto = 'Ditto'; + +$lang->bug->ditto = 'Ditto'; +$lang->bug->dittoNotice = 'Current bug and bug above it do not belong to same product!'; /* Labels. */ $lang->bug->lblAssignedTo = 'Assigned to'; @@ -336,3 +338,16 @@ $lang->bug->action->unlinkrelatedbug = array('main' => '$date, unlink related bu $lang->bug->placeholder = new stdclass(); $lang->bug->placeholder->chooseBuilds = 'Choose builds...'; + +$lang->bug->featurebar['browse']['unclosed'] = $lang->bug->unclosed; +$lang->bug->featurebar['browse']['all'] = $lang->bug->allBugs; +$lang->bug->featurebar['browse']['assigntome'] = $lang->bug->assignToMe; +$lang->bug->featurebar['browse']['openedbyme'] = $lang->bug->openedByMe; +$lang->bug->featurebar['browse']['resolvedbyme'] = $lang->bug->resolvedByMe; +$lang->bug->featurebar['browse']['unconfirmed'] = $lang->bug->confirmedList[0]; +$lang->bug->featurebar['browse']['assigntonull'] = $lang->bug->assignToNull; +$lang->bug->featurebar['browse']['unresolved'] = $lang->bug->unResolved; +$lang->bug->featurebar['browse']['toclosed'] = $lang->bug->toClosed; +$lang->bug->featurebar['browse']['longlifebugs'] = $lang->bug->longLifeBugs; +$lang->bug->featurebar['browse']['postponedbugs'] = $lang->bug->postponedBugs; +$lang->bug->featurebar['browse']['needconfirm'] = $lang->bug->needConfirm; diff --git a/module/bug/lang/zh-cn.php b/module/bug/lang/zh-cn.php index 7e480f403f..9bd3783725 100644 --- a/module/bug/lang/zh-cn.php +++ b/module/bug/lang/zh-cn.php @@ -107,7 +107,9 @@ $lang->bug->allBugs = '所有'; $lang->bug->byQuery = '搜索'; $lang->bug->needConfirm = '需求变动'; $lang->bug->allProduct = '所有' . $lang->productCommon; -$lang->bug->ditto = '同上'; + +$lang->bug->ditto = '同上'; +$lang->bug->dittoNotice = '该bug与上一bug不属于同一产品!'; /* 页面标签。*/ $lang->bug->lblAssignedTo = '当前指派'; @@ -336,3 +338,16 @@ $lang->bug->action->unlinkrelatedbug = array('main' => '$date, 由 $acto $lang->bug->placeholder = new stdclass(); $lang->bug->placeholder->chooseBuilds = '选择相关版本...'; + +$lang->bug->featurebar['browse']['unclosed'] = $lang->bug->unclosed; +$lang->bug->featurebar['browse']['all'] = $lang->bug->allBugs; +$lang->bug->featurebar['browse']['assigntome'] = $lang->bug->assignToMe; +$lang->bug->featurebar['browse']['openedbyme'] = $lang->bug->openedByMe; +$lang->bug->featurebar['browse']['resolvedbyme'] = $lang->bug->resolvedByMe; +$lang->bug->featurebar['browse']['unconfirmed'] = $lang->bug->confirmedList[0]; +$lang->bug->featurebar['browse']['assigntonull'] = $lang->bug->assignToNull; +$lang->bug->featurebar['browse']['unresolved'] = $lang->bug->unResolved; +$lang->bug->featurebar['browse']['toclosed'] = $lang->bug->toClosed; +$lang->bug->featurebar['browse']['longlifebugs'] = $lang->bug->longLifeBugs; +$lang->bug->featurebar['browse']['postponedbugs'] = $lang->bug->postponedBugs; +$lang->bug->featurebar['browse']['needconfirm'] = $lang->bug->needConfirm; diff --git a/module/bug/model.php b/module/bug/model.php index bbeaad9f0d..922470965f 100644 --- a/module/bug/model.php +++ b/module/bug/model.php @@ -543,7 +543,7 @@ class bugModel extends model $bug->pri = $data->pris[$bugID]; $bug->status = $data->statuses[$bugID]; $bug->title = $data->titles[$bugID]; - $bug->plan = $data->plan[$bugID]; + $bug->plan = empty($data->plans[$bugID]) ? 0 : $data->plans[$bugID]; $bug->assignedTo = $data->assignedTos[$bugID]; $bug->resolvedBy = $data->resolvedBys[$bugID]; $bug->keywords = $data->keywords[$bugID]; diff --git a/module/bug/view/batchedit.html.php b/module/bug/view/batchedit.html.php index 8453ed7587..0e4a090d47 100644 --- a/module/bug/view/batchedit.html.php +++ b/module/bug/view/batchedit.html.php @@ -11,6 +11,7 @@ */ ?> +lang->bug->dittoNotice);?>
icons['bug']);?> @@ -40,16 +41,21 @@ $columns = count($hasFields) + 2;
- - + + loadModel('productplan')->getPairs($bugs[$bugID]->product, $branch); + $plans['ditto'] = $this->lang->story->ditto; + } /** * Remove designchange, newfeature, trackings from the typeList, because should be tracked in story or task. * These thress types if upgrade from bugfree2.x. @@ -67,6 +73,9 @@ $columns = count($hasFields) + 2; + + + - - - diff --git a/module/bug/view/browse.html.php b/module/bug/view/browse.html.php index 4189eec8b2..87393f3b25 100644 --- a/module/bug/view/browse.html.php +++ b/module/bug/view/browse.html.php @@ -32,21 +32,11 @@ js::set('bugBrowseType', $this->session->bugBrowseType); ?> - " . html::a($this->createLink('bug', 'browse', "productid=$productID&branch=$branch&browseType=unclosed¶m=0"), $lang->bug->unclosed) . ""; - echo "
  • " . html::a($this->createLink('bug', 'browse', "productid=$productID&branch=$branch&browseType=all¶m=0&orderBy=$orderBy&recTotal=0&recPerPage=200"), $lang->bug->allBugs) . "
  • "; - echo "
  • " . html::a($this->createLink('bug', 'browse', "productid=$productID&branch=$branch&browseType=assignToMe¶m=0"), $lang->bug->assignToMe) . "
  • "; - echo "
  • " . html::a($this->createLink('bug', 'browse', "productid=$productID&branch=$branch&browseType=openedByMe¶m=0"), $lang->bug->openedByMe) . "
  • "; - echo "
  • " . html::a($this->createLink('bug', 'browse', "productid=$productID&branch=$branch&browseType=resolvedByMe¶m=0"), $lang->bug->resolvedByMe) . "
  • "; - echo "
  • " . html::a($this->createLink('bug', 'browse', "productid=$productID&branch=$branch&browseType=unconfirmed¶m=0"), $lang->bug->confirmedList[0]) . "
  • "; - echo "
  • " . html::a($this->createLink('bug', 'browse', "productid=$productID&branch=$branch&browseType=assignToNull¶m=0"), $lang->bug->assignToNull) . "
  • "; - echo "
  • " . html::a($this->createLink('bug', 'browse', "productid=$productID&branch=$branch&browseType=unResolved¶m=0"), $lang->bug->unResolved) . "
  • "; - echo "
  • " . html::a($this->createLink('bug', 'browse', "productid=$productID&branch=$branch&browseType=toClosed¶m=0"), $lang->bug->toClosed) . "
  • "; - echo "
  • " . html::a($this->createLink('bug', 'browse', "productid=$productID&branch=$branch&browseType=longLifeBugs¶m=0"), $lang->bug->longLifeBugs) . "
  • "; - echo "
  • " . html::a($this->createLink('bug', 'browse', "productid=$productID&branch=$branch&browseType=postponedBugs¶m=0"), $lang->bug->postponedBugs) . "
  • "; - echo "
  • " . html::a($this->createLink('bug', 'browse', "productid=$productID&branch=$branch&browseType=needconfirm¶m=0"), $lang->bug->needConfirm) . "
  • "; - echo "
  •  {$lang->bug->byQuery}
  • "; - ?> + customMenu['featurebar'] as $type => $featurebar):?> + +
  • createLink('bug', 'browse', "productid=$productID&branch=$branch&browseType=unclosed¶m=0"), $featurebar['link'])?>
  • + +
  •  bug->byQuery;?>
  • diff --git a/module/common/lang/menuOrder.php b/module/common/lang/menuOrder.php index c9b8bc7891..7bfb0afd16 100644 --- a/module/common/lang/menuOrder.php +++ b/module/common/lang/menuOrder.php @@ -28,66 +28,60 @@ $lang->my->menuOrder[55] = 'changePassword'; $lang->todo->menuOrder = $lang->my->menuOrder; /* product menu order. */ -$lang->product->menuOrder[5] = 'index'; -$lang->product->menuOrder[10] = 'story'; -$lang->product->menuOrder[15] = 'dynamic'; -$lang->product->menuOrder[20] = 'plan'; -$lang->product->menuOrder[25] = 'release'; -$lang->product->menuOrder[30] = 'roadmap'; -$lang->product->menuOrder[35] = 'doc'; -$lang->product->menuOrder[40] = 'project'; -$lang->product->menuOrder[45] = 'branch'; -$lang->product->menuOrder[50] = 'module'; -$lang->product->menuOrder[55] = 'view'; -$lang->product->menuOrder[60] = 'create'; -$lang->product->menuOrder[65] = 'all'; +$lang->product->menuOrder[5] = 'list'; +$lang->product->menuOrder[10] = 'index'; +$lang->product->menuOrder[15] = 'story'; +$lang->product->menuOrder[20] = 'dynamic'; +$lang->product->menuOrder[25] = 'plan'; +$lang->product->menuOrder[30] = 'release'; +$lang->product->menuOrder[35] = 'roadmap'; +$lang->product->menuOrder[40] = 'doc'; +$lang->product->menuOrder[45] = 'project'; +$lang->product->menuOrder[50] = 'branch'; +$lang->product->menuOrder[55] = 'module'; +$lang->product->menuOrder[60] = 'view'; +$lang->product->menuOrder[65] = 'create'; +$lang->product->menuOrder[70] = 'all'; $lang->story->menuOrder = $lang->product->menuOrder; $lang->productplan->menuOrder = $lang->product->menuOrder; $lang->release->menuOrder = $lang->product->menuOrder; $lang->branch->menuOrder = $lang->product->menuOrder; /* project menu order. */ -$lang->project->menuOrder[1] = 'index'; -$lang->project->menuOrder[5] = 'task'; -$lang->project->menuOrder[10] = 'story'; -$lang->project->menuOrder[15] = 'bug'; -$lang->project->menuOrder[20] = 'build'; -$lang->project->menuOrder[25] = 'testtask'; -$lang->project->menuOrder[30] = 'burn'; -$lang->project->menuOrder[35] = 'team'; -$lang->project->menuOrder[40] = 'dynamic'; -$lang->project->menuOrder[45] = 'doc'; -$lang->project->menuOrder[50] = 'product'; -$lang->project->menuOrder[55] = 'linkstory'; +$lang->project->menuOrder[5] = 'list'; +$lang->project->menuOrder[10] = 'index'; +$lang->project->menuOrder[15] = 'task'; +$lang->project->menuOrder[20] = 'story'; +$lang->project->menuOrder[25] = 'bug'; +$lang->project->menuOrder[30] = 'build'; +$lang->project->menuOrder[35] = 'testtask'; +$lang->project->menuOrder[40] = 'team'; +$lang->project->menuOrder[45] = 'dynamic'; +$lang->project->menuOrder[50] = 'doc'; +$lang->project->menuOrder[55] = 'product'; $lang->project->menuOrder[60] = 'view'; -$lang->project->menuOrder[65] = 'order'; -$lang->project->menuOrder[70] = 'create'; -$lang->project->menuOrder[75] = 'copy'; -$lang->project->menuOrder[80] = 'all'; +$lang->project->menuOrder[65] = 'create'; +$lang->project->menuOrder[70] = 'all'; $lang->task->menuOrder = $lang->project->menuOrder; $lang->build->menuOrder = $lang->project->menuOrder; -/* bug menu order. */ -$lang->bug->menuOrder[0] = 'product'; -$lang->bug->menuOrder[1] = 'index'; -$lang->bug->menuOrder[5] = 'bug'; -$lang->bug->menuOrder[10] = 'testcase'; -$lang->bug->menuOrder[15] = 'testtask'; - -/* testcase menu order. */ -$lang->testcase->menuOrder[0] = 'product'; -$lang->testcase->menuOrder[1] = 'index'; -$lang->testcase->menuOrder[5] = 'bug'; -$lang->testcase->menuOrder[10] = 'testcase'; -$lang->testcase->menuOrder[15] = 'testtask'; -$lang->testtask->menuOrder = $lang->testcase->menuOrder; +/* qa menu order. */ +$lang->qa->menuOrder[5] = 'product'; +$lang->qa->menuOrder[10] = 'index'; +$lang->qa->menuOrder[15] = 'bug'; +$lang->qa->menuOrder[20] = 'testcase'; +$lang->qa->menuOrder[25] = 'testtask'; +$lang->bug->menuOrder = $lang->qa->menuOrder; +$lang->testcase->menuOrder = $lang->bug->menuOrder; +$lang->testtask->menuOrder = $lang->testcase->menuOrder; /* doc menu order. */ -$lang->doc->menuOrder[5] = 'browse'; -$lang->doc->menuOrder[10] = 'edit'; -$lang->doc->menuOrder[15] = 'module'; -$lang->doc->menuOrder[20] = 'delete'; -$lang->doc->menuOrder[25] = 'create'; +$lang->doc->menuOrder[5] = 'list'; +$lang->doc->menuOrder[10] = 'browse'; +$lang->doc->menuOrder[15] = 'edit'; +$lang->doc->menuOrder[20] = 'module'; +$lang->doc->menuOrder[25] = 'delete'; +$lang->doc->menuOrder[30] = 'create'; /* report menu order. */ $lang->report->menuOrder[5] = 'product'; @@ -96,15 +90,15 @@ $lang->report->menuOrder[15] = 'test'; $lang->report->menuOrder[20] = 'staff'; /* company menu order. */ -$lang->company->menuOrder[0] = 'name'; -$lang->company->menuOrder[5] = 'browseUser'; -$lang->company->menuOrder[10] = 'dept'; -$lang->company->menuOrder[15] = 'browseGroup'; -$lang->company->menuOrder[20] = 'view'; -$lang->company->menuOrder[25] = 'dynamic'; -$lang->company->menuOrder[30] = 'addGroup'; -$lang->company->menuOrder[35] = 'batchAddUser'; -$lang->company->menuOrder[40] = 'addUser'; +$lang->company->menuOrder[5] = 'name'; +$lang->company->menuOrder[10] = 'browseUser'; +$lang->company->menuOrder[15] = 'dept'; +$lang->company->menuOrder[20] = 'browseGroup'; +$lang->company->menuOrder[25] = 'view'; +$lang->company->menuOrder[30] = 'dynamic'; +$lang->company->menuOrder[35] = 'addGroup'; +$lang->company->menuOrder[40] = 'batchAddUser'; +$lang->company->menuOrder[45] = 'addUser'; $lang->dept->menuOrder = $lang->company->menuOrder; $lang->group->menuOrder = $lang->company->menuOrder; $lang->user->menuOrder = $lang->company->menuOrder; @@ -113,24 +107,22 @@ $lang->user->menuOrder = $lang->company->menuOrder; $lang->admin->menuOrder[5] = 'index'; $lang->admin->menuOrder[10] = 'extension'; $lang->admin->menuOrder[15] = 'custom'; -$lang->admin->menuOrder[20] = 'editor'; -$lang->admin->menuOrder[25] = 'mail'; -$lang->admin->menuOrder[30] = 'custom'; -$lang->admin->menuOrder[40] = 'convert'; -$lang->admin->menuOrder[45] = 'cron'; -$lang->admin->menuOrder[50] = 'backup'; -$lang->admin->menuOrder[55] = 'dev'; -$lang->admin->menuOrder[60] = 'safe'; -$lang->admin->menuOrder[65] = 'sso'; -$lang->admin->menuOrder[70] = 'trashes'; +$lang->admin->menuOrder[20] = 'mail'; +$lang->admin->menuOrder[25] = 'custom'; +$lang->admin->menuOrder[30] = 'convert'; +$lang->admin->menuOrder[35] = 'cron'; +$lang->admin->menuOrder[40] = 'backup'; +$lang->admin->menuOrder[45] = 'dev'; +$lang->admin->menuOrder[50] = 'safe'; +$lang->admin->menuOrder[55] = 'sso'; +$lang->admin->menuOrder[60] = 'trashes'; $lang->convert->menuOrder = $lang->admin->menuOrder; $lang->upgrade->menuOrder = $lang->admin->menuOrder; $lang->action->menuOrder = $lang->admin->menuOrder; +$lang->backup->menuOrder = $lang->admin->menuOrder; +$lang->cron->menuOrder = $lang->admin->menuOrder; $lang->extension->menuOrder = $lang->admin->menuOrder; $lang->custom->menuOrder = $lang->admin->menuOrder; $lang->editor->menuOrder = $lang->admin->menuOrder; $lang->mail->menuOrder = $lang->admin->menuOrder; -$lang->custom->menuOrder = $lang->admin->menuOrder; -$lang->backup->menuOrder = $lang->admin->menuOrder; -$lang->cron->menuOrder = $lang->admin->menuOrder; $lang->dev->menuOrder = $lang->admin->menuOrder; diff --git a/module/common/model.php b/module/common/model.php index 40ac0f3830..1dead13842 100644 --- a/module/common/model.php +++ b/module/common/model.php @@ -381,6 +381,7 @@ class commonModel extends model public static function printMainmenu($moduleName, $methodName = '') { global $app, $lang; + if(empty($app->customMenu)) $app->customMenu = customModel::getCustomMenu($app->getModuleName(), $app->getMethodName()); echo "
    @@ -96,7 +96,7 @@ js::set('confirmDelete', $lang->user->confirmDelete); diff --git a/module/product/control.php b/module/product/control.php index d00dc89517..614d716a61 100644 --- a/module/product/control.php +++ b/module/product/control.php @@ -597,6 +597,18 @@ class product extends control $this->display(); } + /** + * All product. + * + * @param int $productID + * @param string $status + * @param string $orderBy + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID + * @access public + * @return void + */ public function all($productID = 0, $status = 'noclosed', $orderBy = 'order_desc', $recTotal = 0, $recPerPage = 10, $pageID = 1) { $this->session->set('productList', $this->app->getURI(true)); diff --git a/module/product/lang/en.php b/module/product/lang/en.php index 7c6f239a14..dbc93aaaa9 100644 --- a/module/product/lang/en.php +++ b/module/product/lang/en.php @@ -93,3 +93,15 @@ $lang->product->aclList['custom'] = "Whitelist({$lang->projectCommon} team memb $lang->product->storySummary = "Total %s stories in this page, estimate %s hours, case coverage is %s "; $lang->product->noMatched = "No matched {$lang->productCommon} including '%s'"; + +$lang->product->featurebar['browse']['unclosed'] = $lang->product->unclosed; +$lang->product->featurebar['browse']['allstory'] = $lang->product->allStory; +$lang->product->featurebar['browse']['assignedtome'] = $lang->product->assignedToMe; +$lang->product->featurebar['browse']['openedbyme'] = $lang->product->openedByMe; +$lang->product->featurebar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; +$lang->product->featurebar['browse']['closedbyme'] = $lang->product->closedByMe; +$lang->product->featurebar['browse']['draftstory'] = $lang->product->draftStory; +$lang->product->featurebar['browse']['activestory'] = $lang->product->activeStory; +$lang->product->featurebar['browse']['changedstory'] = $lang->product->changedStory; +$lang->product->featurebar['browse']['willclose'] = $lang->product->willClose; +$lang->product->featurebar['browse']['closedstory'] = $lang->product->closedStory; diff --git a/module/product/lang/zh-cn.php b/module/product/lang/zh-cn.php index 200096ca1a..e2b466b902 100644 --- a/module/product/lang/zh-cn.php +++ b/module/product/lang/zh-cn.php @@ -93,3 +93,15 @@ $lang->product->aclList['custom'] = '自定义白名单(团队成员和白名 $lang->product->storySummary = "本页共 %s 个需求,预计 %s 个工时,用例覆盖率%s。"; $lang->product->noMatched = '找不到包含"%s"的' . $lang->productCommon; + +$lang->product->featurebar['browse']['unclosed'] = $lang->product->unclosed; +$lang->product->featurebar['browse']['allstory'] = $lang->product->allStory; +$lang->product->featurebar['browse']['assignedtome'] = $lang->product->assignedToMe; +$lang->product->featurebar['browse']['openedbyme'] = $lang->product->openedByMe; +$lang->product->featurebar['browse']['reviewedbyme'] = $lang->product->reviewedByMe; +$lang->product->featurebar['browse']['closedbyme'] = $lang->product->closedByMe; +$lang->product->featurebar['browse']['draftstory'] = $lang->product->draftStory; +$lang->product->featurebar['browse']['activestory'] = $lang->product->activeStory; +$lang->product->featurebar['browse']['changedstory'] = $lang->product->changedStory; +$lang->product->featurebar['browse']['willclose'] = $lang->product->willClose; +$lang->product->featurebar['browse']['closedstory'] = $lang->product->closedStory; diff --git a/module/product/view/browse.html.php b/module/product/view/browse.html.php index a567c5d49c..2d2f202710 100644 --- a/module/product/view/browse.html.php +++ b/module/product/view/browse.html.php @@ -28,17 +28,10 @@ ?> -
  • inlink('browse', "productID=$productID&branch=$branch&browseType=unclosed"), $lang->product->unclosed);?>
  • -
  • inlink('browse', "productID=$productID&branch=$branch&browseType=allStory"), $lang->product->allStory);?>
  • -
  • inlink('browse', "productID=$productID&branch=$branch&browseType=assignedtome"), $lang->product->assignedToMe);?>
  • -
  • inlink('browse', "productID=$productID&branch=$branch&browseType=openedByMe"), $lang->product->openedByMe);?>
  • -
  • inlink('browse', "productID=$productID&branch=$branch&browseType=reviewedByMe"), $lang->product->reviewedByMe);?>
  • -
  • inlink('browse', "productID=$productID&branch=$branch&browseType=closedByMe"), $lang->product->closedByMe);?>
  • -
  • inlink('browse', "productID=$productID&branch=$branch&browseType=draftStory"), $lang->product->draftStory);?>
  • -
  • inlink('browse', "productID=$productID&branch=$branch&browseType=activeStory"), $lang->product->activeStory);?>
  • -
  • inlink('browse', "productID=$productID&branch=$branch&browseType=changedStory"), $lang->product->changedStory);?>
  • -
  • inlink('browse', "productID=$productID&branch=$branch&browseType=willClose"), $lang->product->willClose);?>
  • -
  • inlink('browse', "productID=$productID&branch=$branch&browseType=closedStory"), $lang->product->closedStory);?>
  • + customMenu['featurebar'] as $type => $featurebar):?> + +
  • inlink('browse', "productID=$productID&branch=$branch&browseType=$type"), $featurebar['link']);?>
  • +
  • product->searchStory;?>
  • diff --git a/module/project/control.php b/module/project/control.php index ff14d15e11..b44d2400ee 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -1947,6 +1947,19 @@ class project extends control } } + /** + * All project. + * + * @param string $status + * @param int $projectID + * @param string $orderBy + * @param int $productID + * @param int $recTotal + * @param int $recPerPage + * @param int $pageID + * @access public + * @return void + */ public function all($status = 'undone', $projectID = 0, $orderBy = 'order_desc', $productID = 0, $recTotal = 0, $recPerPage = 10, $pageID = 1) { if($this->projects) $this->commonAction($projectID); diff --git a/module/project/lang/en.php b/module/project/lang/en.php index 62688cda9e..9be9a8527f 100644 --- a/module/project/lang/en.php +++ b/module/project/lang/en.php @@ -238,3 +238,14 @@ $lang->printKanban->taskStatus = 'Status'; $lang->printKanban->typeList['all'] = 'All'; $lang->printKanban->typeList['increment'] = 'Increment'; + +$lang->project->featurebar['task']['unclosed'] = $lang->project->unclosed; +$lang->project->featurebar['task']['all'] = $lang->project->allTasks; +$lang->project->featurebar['task']['kanban'] = $lang->project->kanban; +$lang->project->featurebar['task']['burn'] = $lang->project->burn; +$lang->project->featurebar['task']['assignedtome'] = $lang->project->assignedToMe; +$lang->project->featurebar['task']['status'] = $lang->project->statusSelects['']; +$lang->project->featurebar['task']['group'] = $lang->project->groups['']; +$lang->project->featurebar['grouptask'] = $lang->project->featurebar['task']; +$lang->project->featurebar['kanban'] = $lang->project->featurebar['task']; +$lang->project->featurebar['burn'] = $lang->project->featurebar['task']; diff --git a/module/project/lang/zh-cn.php b/module/project/lang/zh-cn.php index 04a00e6eb6..185238d582 100644 --- a/module/project/lang/zh-cn.php +++ b/module/project/lang/zh-cn.php @@ -249,3 +249,14 @@ $lang->printKanban->taskStatus = '状态'; $lang->printKanban->typeList['all'] = '全部'; $lang->printKanban->typeList['increment'] = '增量'; + +$lang->project->featurebar['task']['unclosed'] = $lang->project->unclosed; +$lang->project->featurebar['task']['all'] = $lang->project->allTasks; +$lang->project->featurebar['task']['kanban'] = $lang->project->kanban; +$lang->project->featurebar['task']['burn'] = $lang->project->burn; +$lang->project->featurebar['task']['assignedtome'] = $lang->project->assignedToMe; +$lang->project->featurebar['task']['status'] = $lang->project->statusSelects['']; +$lang->project->featurebar['task']['group'] = $lang->project->groups['']; +$lang->project->featurebar['grouptask'] = $lang->project->featurebar['task']; +$lang->project->featurebar['kanban'] = $lang->project->featurebar['task']; +$lang->project->featurebar['burn'] = $lang->project->featurebar['task']; diff --git a/module/project/view/taskheader.html.php b/module/project/view/taskheader.html.php index 4f676cbdc1..710d8d4d14 100644 --- a/module/project/view/taskheader.html.php +++ b/module/project/view/taskheader.html.php @@ -15,44 +15,54 @@ + + customMenu['featurebar'] as $type => $featurebar):?> + " . html::a(inlink('task', "project=$projectID&type=$type"), $featurebar['link']) . '' ; + if($hasKanbanPriv and $type == 'kanban') echo "
  • " . html::a(inlink('kanban', "projectID=$projectID"), $featurebar['link']) . '
  • '; + if($hasBurnPriv and $type == 'burn' and ($project->type == 'sprint' or $project->type == 'waterfall')) echo "
  • " . html::a(inlink('burn', "project=$projectID"), $featurebar['link']) . '
  • ' ; + if($hasBrowsePriv and $type == 'status') + { + echo "'; + } + elseif($hasGroupTaskPriv and $type == 'group') + { + echo "'; + } + ?> + "; common::printLink('project', 'task', "project=$projectID&type=unclosed", $lang->project->unclosed); echo '' ; - echo "
  • "; common::printLink('project', 'task', "project=$projectID&type=all", $lang->project->allTasks); echo '
  • ' ; - echo "
  • "; common::printLink('project', 'kanban', "projectID=$projectID", $lang->project->kanban, '', '', false); echo '
  • '; - echo "
  • "; common::printLink('project', 'tree', "projectID=$projectID", $lang->project->tree, '', '', false); echo '
  • '; - if($project->type == 'sprint' or $project->type == 'waterfall') print "
  • " and common::printLink('project', 'burn', "project=$projectID", $lang->project->burn); print '
  • ' ; - echo "
  • "; common::printLink('project', 'task', "project=$projectID&type=assignedtome", $lang->project->assignedToMe); echo '
  • ' ; - - echo "'; - - echo "'; - - if($this->methodName == 'task') echo "
  •  {$lang->project->byQuery}
  • "; ?> diff --git a/module/testcase/lang/en.php b/module/testcase/lang/en.php index 4e80f9e6eb..0ef0b12128 100644 --- a/module/testcase/lang/en.php +++ b/module/testcase/lang/en.php @@ -145,3 +145,10 @@ $lang->testcase->noFunction = 'Iconv and mb_convert_encoding does not exist, yo $lang->testcase->noRequire = "In the row of %s, the %s is a required field"; $lang->testcase->searchStories = 'Type to search stories'; + +$lang->testcase->featurebar['browse']['all'] = $lang->testcase->allCases; +$lang->testcase->featurebar['browse']['needconfirm'] = $lang->testcase->needConfirm; +$lang->testcase->featurebar['browse']['group'] = ''; +$lang->testcase->featurebar['browse']['zerocase'] = ''; +$lang->testcase->featurebar['groupcase'] = $lang->testcase->featurebar['browse']; +if(isset($lang->story))$lang->story->featurebar['zerocase'] = $lang->testcase->featurebar['browse']; diff --git a/module/testcase/lang/zh-cn.php b/module/testcase/lang/zh-cn.php index 3260342ab3..bc01be9917 100644 --- a/module/testcase/lang/zh-cn.php +++ b/module/testcase/lang/zh-cn.php @@ -145,3 +145,10 @@ $lang->testcase->noFunction = '不存在iconv和mb_convert_encoding转码方法 $lang->testcase->noRequire = "%s行的“%s”是必填字段,不能为空"; $lang->testcase->searchStories = '键入来搜索需求'; + +$lang->testcase->featurebar['browse']['all'] = $lang->testcase->allCases; +$lang->testcase->featurebar['browse']['needconfirm'] = $lang->testcase->needConfirm; +$lang->testcase->featurebar['browse']['group'] = ''; +$lang->testcase->featurebar['browse']['zerocase'] = ''; +$lang->testcase->featurebar['groupcase'] = $lang->testcase->featurebar['browse']; +if(isset($lang->story))$lang->story->featurebar['zerocase'] = $lang->testcase->featurebar['browse']; diff --git a/module/testcase/view/caseheader.html.php b/module/testcase/view/caseheader.html.php index 4f4306c575..bb10d7233e 100644 --- a/module/testcase/view/caseheader.html.php +++ b/module/testcase/view/caseheader.html.php @@ -16,11 +16,14 @@ + customMenu['featurebar'] as $type => $featurebar):?> + " . html::a($this->createLink('testcase', 'browse', "productid=$productID&branch=$branch&browseType=all"), $lang->testcase->allCases) . ""; - echo "
  • " . html::a($this->createLink('testcase', 'browse', "productid=$productID&branch=$branch&browseType=needconfirm"), $lang->testcase->needConfirm) . "
  • "; - - if(common::hasPriv('testcase', 'groupcase')) + if(common::hasPriv('testcase', 'browse') and ($type == 'all' or $type == 'needconfirm')) + { + echo "
  • " . html::a($this->createLink('testcase', 'browse', "productid=$productID&branch=$branch&browseType=$type"), $featurebar['link']) . "
  • "; + } + elseif($type == 'group' and common::hasPriv('testcase', 'groupcase')) { echo "'; } - - if(common::hasPriv('story', 'zeroCase')) echo "
  • " . html::a($this->createLink('story', 'zeroCase', "productID=$productID"), $lang->story->zeroCase) . '
  • '; + elseif($type == 'zerocase' and common::hasPriv('story', 'zeroCase')) + { + echo "
  • " . html::a($this->createLink('story', 'zeroCase', "productID=$productID"), $lang->story->zeroCase) . '
  • '; + } + ?> + + methodName == 'browse') echo "
  •  {$lang->testcase->bySearch}
  • "; ?> diff --git a/module/testtask/lang/en.php b/module/testtask/lang/en.php index e0f4557527..c223e9d842 100644 --- a/module/testtask/lang/en.php +++ b/module/testtask/lang/en.php @@ -103,3 +103,8 @@ $lang->testtask->action = new stdclass(); $lang->testtask->action->testtaskopened = '$date, 由 $actor opened test task. $extra。' . "\n"; $lang->testtask->action->testtaskstarted = '$date, 由 $actor started test task. $extra。' . "\n"; $lang->testtask->action->testtaskclosed = '$date, 由 $actor finished test task. $extra。' . "\n"; + +$lang->testtask->featurebar['cases']['all'] = $lang->testtask->allCases; +$lang->testtask->featurebar['cases']['assignedtome'] = $lang->testtask->assignedToMe; +$lang->testtask->featurebar['cases']['group'] = ''; +$lang->testtask->featurebar['groupcase'] = $lang->testtask->featurebar['cases']; diff --git a/module/testtask/lang/zh-cn.php b/module/testtask/lang/zh-cn.php index b07da7ee4d..7045f9bd12 100644 --- a/module/testtask/lang/zh-cn.php +++ b/module/testtask/lang/zh-cn.php @@ -103,3 +103,8 @@ $lang->testtask->action = new stdclass(); $lang->testtask->action->testtaskopened = '$date, 由 $actor 创建版本 $extra。' . "\n"; $lang->testtask->action->testtaskstarted = '$date, 由 $actor 启动版本 $extra。' . "\n"; $lang->testtask->action->testtaskclosed = '$date, 由 $actor 完成版本 $extra。' . "\n"; + +$lang->testtask->featurebar['cases']['all'] = $lang->testtask->allCases; +$lang->testtask->featurebar['cases']['assignedtome'] = $lang->testtask->assignedToMe; +$lang->testtask->featurebar['cases']['group'] = ''; +$lang->testtask->featurebar['groupcase'] = $lang->testtask->featurebar['cases']; diff --git a/module/testtask/view/caseheader.html.php b/module/testtask/view/caseheader.html.php index 60a6f22bb9..6b9c4c5155 100644 --- a/module/testtask/view/caseheader.html.php +++ b/module/testtask/view/caseheader.html.php @@ -3,25 +3,32 @@ " . html::icon($lang->icons['usecase']) . '' . $task->name . '';?>
    '>bug->productplan;?> '>bug->assignedTo;?> '>bug->status;?>'>bug->resolvedByAB;?>'>bug->resolutionAB;?> '>bug->os;?> '>bug->browser;?> '>bug->keywords;?>'>bug->resolvedByAB;?>'>bug->resolutionAB;?>
    ' style='overflow:visible'>plan, "class='form-control chosen'");?> ' style='overflow:visible'>assignedTo, "class='form-control chosen'");?> >bug->statusList, $bugs[$bugID]->status, 'class=form-control');?>>bug->osList, $bugs[$bugID]->os, 'class=form-control');?>>bug->browserList, $bugs[$bugID]->browser, 'class=form-control');?>>keywords, 'class=form-control');?> ' style='overflow:visible'>resolvedBy, "class='form-control chosen'");?> > @@ -80,9 +89,6 @@ $columns = count($hasFields) + 2;
    >bug->osList, $bugs[$bugID]->os, 'class=form-control');?>>bug->browserList, $bugs[$bugID]->browser, 'class=form-control');?>>keywords, 'class=form-control');?>
    account'> "; + if($canBatchEdit) echo " "; printf('%03d', $user->id); ?>
    edit, 'onclick=batchEdit()', 'btn btn-default'); ?>
    diff --git a/module/custom/model.php b/module/custom/model.php index 130def41e8..db979f23a0 100644 --- a/module/custom/model.php +++ b/module/custom/model.php @@ -122,4 +122,122 @@ class customModel extends model ->beginIF($params['section'])->andWhere('section')->in($params['section'])->fi() ->beginIF($params['key'])->andWhere('`key`')->in($params['key'])->fi(); } + + public static function getCustomMenu($module, $method) + { + global $app, $lang, $config; + if(!isset($lang->$module->menu)) return array(); + $allMenu['main'] = $lang->menu; + $allMenu['module'] = $lang->$module->menu; + + /* Process main and module menu. */ + $processedMenus = array(); + foreach($allMenu as $type => $menu) + { + $menucustom = ''; + $menuOrder = array(); + $menuStatus = array(); + if($type == 'main') $menucustom = isset($config->menucustom->main) ? $config->menucustom->main : ''; + if($type == 'module')$menucustom = isset($config->menucustomModule->$module) ? $config->menucustomModule->$module : ''; + /* Get order and status from config. */ + if($menucustom) + { + $menuStatus = json_decode($menucustom, true); + $i = 1; + foreach($menuStatus as $menuKey => $status) + { + $order = $i * 5; + $menuOrder[$order] = $menuKey; + $i++; + } + } + if(empty($menuOrder)) $menuOrder = $type == 'main' ? $lang->menuOrder : $lang->$module->menuOrder; + + /* Merge all menu. */ + $inOrderMenu = ',' . join(',', $menuOrder) . ','; + $notInOrderMenu = array(); + foreach($menu as $menuKey => $menuName) + { + if(strpos($inOrderMenu, ",$menuKey,") === false) $notInOrderMenu[] = $menuKey; + } + if($notInOrderMenu) + { + $order = count($menuOrder) * 5; + foreach($notInOrderMenu as $menuKey) + { + $order = $order + 5; + $menuOrder[$order] = $menuKey; + } + } + ksort($menuOrder, SORT_ASC); + + /* Rebuild menu. */ + $processedMenu = new stdclass(); + foreach($menuOrder as $order => $menuKey) + { + if(!isset($menu->$menuKey)) continue; + $menuContent = $menu->$menuKey; + if(is_string($menuContent)) $menuContent = array('link' => $menuContent); + $menuContent['status'] = isset($menuStatus[$menuKey]) ? $menuStatus[$menuKey] : 'show'; + $menuContent['order'] = $order; + + if(strpos($menuContent['link'], '|') !== false) + { + list($menuTitle, $menuModule, $menuMethod) = explode('|', $menuContent['link']); + if($menuContent['status'] == 'show' and !common::hasPriv($menuModule, $menuMethod)) $menuContent['status'] = 'hide'; + } + + $processedMenu->$menuKey = $menuContent; + } + $processedMenus[$type] = $processedMenu; + } + + /* Process featurebar. */ + $app->loadLang($module); + $featurebar = ''; + if(isset($lang->$module->featurebar[$method])) $featurebar = $lang->$module->featurebar[$method]; + $menucustomKey = 'menucustom' . $module; + if($featurebar) + { + $menuOrder = array(); + $menuStatus = array(); + if(isset($config->$menucustomKey->$method)) + { + $menuStatus = json_decode($config->$menucustomKey->$method, true); + foreach($menuStatus as $menuKey => $status) $menuOrder[] = $menuKey; + } + + /* Merge all menu. */ + $inOrderMenu = ',' . join(',', $menuOrder) . ','; + $notInOrderMenu = array(); + foreach($featurebar as $menuKey => $menuName) + { + if(strpos($inOrderMenu, ",$menuKey,") === false) $notInOrderMenu[] = $menuKey; + } + if($notInOrderMenu) + { + $order = count($menuOrder); + foreach($notInOrderMenu as $menuKey) + { + $menuOrder[$order] = $menuKey; + $order++; + } + } + ksort($menuOrder, SORT_ASC); + + $processedMenu = new stdclass(); + foreach($menuOrder as $order => $menuKey) + { + $menuContent = $featurebar[$menuKey]; + $menuContent = array('link' => $menuContent); + $menuContent['status'] = isset($menuStatus[$menuKey]) ? $menuStatus[$menuKey] : 'show'; + $menuContent['order'] = ($order + 1) * 5; + + $processedMenu->$menuKey = $menuContent; + } + $processedMenus['featurebar'] = $processedMenu; + } + + return $processedMenus; + } } diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index ac694ec0b6..e50ebd208a 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -1152,3 +1152,10 @@ $lang->changelog['8.0.1'][] = 'story-linkStory'; $lang->changelog['8.0.1'][] = 'story-unlinkStory'; $lang->changelog['8.0.1'][] = 'testcase-linkCases'; $lang->changelog['8.0.1'][] = 'testcase-unlinkCase'; + +$lang->changelog['8.1.3'][] = 'story-batchChangeModule'; +$lang->changelog['8.1.3'][] = 'task-batchChangeModule'; +$lang->changelog['8.1.3'][] = 'bug-batchChangeModule'; +$lang->changelog['8.1.3'][] = 'testcase-batchChangeModule'; +$lang->changelog['8.1.3'][] = 'my-manageContacts'; +$lang->changelog['8.1.3'][] = 'my-deleteContacts'; diff --git a/module/my/view/bug.html.php b/module/my/view/bug.html.php index 521708b106..7a944c613f 100644 --- a/module/my/view/bug.html.php +++ b/module/my/view/bug.html.php @@ -70,11 +70,15 @@
    -
    - edit, '', '');?> + createLink('bug', 'batchEdit'); + echo html::selectButton() . html::commonButton($lang->edit, "onclick=\"setFormAction('$actionLink')\""); + } + ?>
    - show();?>