diff --git a/module/admin/config.php b/module/admin/config.php
index 8fa6c10599..858e34106c 100755
--- a/module/admin/config.php
+++ b/module/admin/config.php
@@ -6,3 +6,20 @@ $config->admin->log->saveDays = 30;
if(!isset($config->safe)) $config->safe = new stdclass();
if(!isset($config->safe->weak)) $config->safe->weak = '123456,password,12345,12345678,qwerty,123456789,1234,1234567,abc123,111111,123123';
+
+$config->admin->menuGroup['setting'] = array('backup', 'action|trash', 'admin|xuanxuan', 'admin|license', 'admin|safe', 'custom|timezone', 'search|buildindex', 'admin|tableengine', 'ldap', 'custom|libreoffice');
+$config->admin->menuGroup['user'] = array('dept', 'company', 'user', 'group');
+$config->admin->menuGroup['switch'] = array('admin|setmodule');
+$config->admin->menuGroup['model'] = array('auditcl', 'stage', 'design', 'cmcl', 'reviewcl', 'custom|required', 'custom|set', 'custom|flow', 'custom|code', 'custom|estimate', 'subject', 'process');
+$config->admin->menuGroup['feature'] = array('custom|set', 'custom|product', 'custom|execution', 'custom|required', 'custom|kanban', 'approvalflow', 'measurement', 'meetingroom', 'custom|browsestoryconcept', 'custom|kanban');
+$config->admin->menuGroup['template'] = array('custom|set', 'baseline');
+$config->admin->menuGroup['message'] = array('mail', 'webhook', 'sms', 'message');
+$config->admin->menuGroup['dev'] = array('dev', 'entry');
+$config->admin->menuGroup['extension'] = array('extension');
+$config->admin->menuGroup['convert'] = array('convert');
+
+$config->admin->menuModuleGroup['model']['custom|set'] = array('project', 'issue', 'risk', 'opportunity', 'nc');
+$config->admin->menuModuleGroup['model']['custom|required'] = array('project', 'build');
+$config->admin->menuModuleGroup['feature']['custom|set'] = array('todo', 'feedback', 'user', 'block', 'story', 'task', 'bug', 'testcase', 'testtask', 'feedback', 'user');
+$config->admin->menuModuleGroup['feature']['custom|required'] = array('bug', 'doc', 'product', 'story', 'productplan', 'release', 'task', 'bug', 'testcase', 'testsuite', 'testtask', 'testreport', 'caselib', 'doc', 'feedback', 'user');
+$config->admin->menuModuleGroup['template']['custom|set'] = array('baseline');
diff --git a/module/admin/lang/zh-cn.php b/module/admin/lang/zh-cn.php
index bd5c9ccf23..5000ae2646 100755
--- a/module/admin/lang/zh-cn.php
+++ b/module/admin/lang/zh-cn.php
@@ -148,3 +148,97 @@ $lang->admin->safe->noticeMode = '系统会在创建和修改用户、修改
$lang->admin->safe->noticeWeakMode = '系统会在登录、创建和修改用户、修改密码的时候检查用户口令。';
$lang->admin->safe->noticeStrong = '密码长度越长,含有大写字母或数字或特殊符号越多,密码字母越不重复,安全度越强!';
$lang->admin->safe->noticeGd = '系统检测到您的服务器未安装GD模块,无法使用验证码功能,请安装后使用。';
+
+$lang->admin->menuList = new stdclass();
+$lang->admin->menuList->setting['name'] = '系统设置';
+$lang->admin->menuList->setting['desc'] = '';
+$lang->admin->menuList->setting['order'] = 1;
+
+$lang->admin->menuList->user['name'] = '人员管理';
+$lang->admin->menuList->user['desc'] = '';
+$lang->admin->menuList->user['order'] = 2;
+
+$lang->admin->menuList->switch['name'] = '功能开关';
+$lang->admin->menuList->switch['desc'] = '';
+$lang->admin->menuList->switch['order'] = 3;
+
+$lang->admin->menuList->model['name'] = '模型配置';
+$lang->admin->menuList->model['desc'] = '';
+$lang->admin->menuList->model['order'] = 4;
+
+$lang->admin->menuList->feature['name'] = '功能配置';
+$lang->admin->menuList->feature['desc'] = '';
+$lang->admin->menuList->feature['order'] = 5;
+
+$lang->admin->menuList->template['name'] = '文档模板';
+$lang->admin->menuList->template['desc'] = '';
+$lang->admin->menuList->template['order'] = 6;
+
+$lang->admin->menuList->message['name'] = '通知设置';
+$lang->admin->menuList->message['desc'] = '';
+$lang->admin->menuList->message['order'] = 7;
+
+$lang->admin->menuList->extension['name'] = '插件管理';
+$lang->admin->menuList->extension['desc'] = '';
+$lang->admin->menuList->extension['order'] = 8;
+
+$lang->admin->menuList->dev['name'] = '二次开发';
+$lang->admin->menuList->dev['desc'] = '';
+$lang->admin->menuList->dev['order'] = 9;
+
+$lang->admin->menuList->convert['name'] = '数据导入';
+$lang->admin->menuList->convert['desc'] = '';
+$lang->admin->menuList->convert['order'] = 10;
+
+$lang->admin->menuList->setting['subMenu']['mode'] = array('link' => "模式|custom|mode|", 'subModule' => 'custom');
+$lang->admin->menuList->setting['subMenu']['backup'] = array('link' => "备份|backup|index|", 'subModule' => 'backup');
+$lang->admin->menuList->setting['subMenu']['trash'] = array('link' => "回收站|action|trash|", 'subModule' => 'action');
+$lang->admin->menuList->setting['subMenu']['xuanxuan'] = array('link' => "聊天|admin|xuanxuan|");
+$lang->admin->menuList->setting['subMenu']['license'] = array('link' => "授权信息|admin|license|");
+$lang->admin->menuList->setting['subMenu']['safe'] = array('link' => "安全|admin|safe|");
+$lang->admin->menuList->setting['subMenu']['timezone'] = array('link' => "时区|custom|timezone|", 'subModule' => 'custom');
+$lang->admin->menuList->setting['subMenu']['buildindex'] = array('link' => "重建索引|search|buildindex|", 'subModule' => 'search');
+$lang->admin->menuList->setting['subMenu']['tableengine'] = array('link' => "表引擎|admin|tableengine|");
+$lang->admin->menuList->setting['subMenu']['ldap'] = array('link' => "LDAP|ldap|set|", 'subModule' => 'ldap');
+$lang->admin->menuList->setting['subMenu']['libreoffice'] = array('link' => "Office|custom|libreoffice|", 'subModule' => 'custom');
+
+$lang->admin->menuList->setting['dividerMenu'] = ',license,ldap,';
+
+$lang->admin->menuList->user['subMenu']['dept'] = array('link' => "部门|dept|browse|", 'subModule' => 'dept');
+$lang->admin->menuList->user['subMenu']['user'] = array('link' => "用户|company|browse|", 'subModule' => 'company');
+$lang->admin->menuList->user['subMenu']['group'] = array('link' => "权限|group|browse|", 'subModule' => 'group');
+
+$lang->admin->menuList->switch['subMenu']['setmodule'] = array('link' => "功能设置|admin|setmodule|");
+
+$lang->admin->menuList->model['subMenu']['common'] = array('link' => "通用|custom|required|module=project", 'subModule' => 'custom');
+$lang->admin->menuList->model['subMenu']['scrum'] = array('link' => "敏捷模型|auditcl|scrumbrowse|", 'subModule' => 'auditcl');
+$lang->admin->menuList->model['subMenu']['waterfall'] = array('link' => "瀑布模型|stage|settype|", 'subModule' => 'stage');
+
+$lang->admin->menuList->feature['subMenu']['my'] = array('link' => "地盘|custom|set|module=todo", 'subModule' => 'custom');
+$lang->admin->menuList->feature['subMenu']['product'] = array('link' => "{$lang->productCommon}|custom|product|", 'subModule' => 'custom');
+$lang->admin->menuList->feature['subMenu']['execution'] = array('link' => "{$lang->execution->common}|custom|execution|", 'subModule' => 'custom');
+$lang->admin->menuList->feature['subMenu']['qa'] = array('link' => "测试|custom|required|module=bug", 'subModule' => 'custom');
+$lang->admin->menuList->feature['subMenu']['kanban'] = array('link' => "看板|custom|kanban|", 'subModule' => 'custom');
+$lang->admin->menuList->feature['subMenu']['doc'] = array('link' => "文档|custom|required|module=doc", 'subModule' => 'custom');
+$lang->admin->menuList->feature['subMenu']['feedback'] = array('link' => "反馈|custom|set|module=feedback", 'subModule' => 'custom');
+$lang->admin->menuList->feature['subMenu']['approval'] = array('link' => "审批|approvalflow|browse|", 'subModule' => 'approvalflow');
+$lang->admin->menuList->feature['subMenu']['measure'] = array('link' => "度量|measurement|settips|", 'subModule' => 'measurement');
+$lang->admin->menuList->feature['subMenu']['user'] = array('link' => "用户|custom|set|module=user", 'subModule' => 'custom');
+$lang->admin->menuList->feature['subMenu']['meetingroom'] = array('link' => "会议室|meetingroom|browse|", 'subModule' => 'meetingroom');
+
+$lang->admin->menuList->feature['dividerMenu'] = ',user,';
+
+$lang->admin->menuList->template['subMenu']['type'] = array('link' => "模版类型|custom|set|module=baseline&field=objectList", 'subModule' => 'custom');
+$lang->admin->menuList->template['subMenu']['template'] = array('link' => "文档模版|baseline|template|", 'subModule' => 'baseline');
+$lang->admin->menuList->template['subMenu']['catalog'] = array('link' => "文档目录|baseline|catalog|", 'subModule' => 'baseline');
+
+$lang->admin->menuList->message['subMenu']['mail'] = array('link' => "邮件|mail|edit|", 'subModule' => 'mail');
+$lang->admin->menuList->message['subMenu']['webhook'] = array('link' => "Webhook|webhook|browse|", 'subModule' => 'webhook');
+$lang->admin->menuList->message['subMenu']['sms'] = array('link' => "短信|sms|index|", 'subModule' => 'sms');
+$lang->admin->menuList->message['subMenu']['message'] = array('link' => "浏览器|message|browser|", 'subModule' => 'message');
+$lang->admin->menuList->message['subMenu']['setting'] = array('link' => "设置|message|setting|", 'subModule' => 'message');
+
+$lang->admin->menuList->dev['subMenu']['api'] = array('link' => "API|dev|api|", 'subModule' => 'dev');
+$lang->admin->menuList->dev['subMenu']['db'] = array('link' => "数据库|dev|db|", 'subModule' => 'dev');
+$lang->admin->menuList->dev['subMenu']['editor'] = array('link' => "编辑器|dev|editor|", 'subModule' => 'dev');
+$lang->admin->menuList->dev['subMenu']['entry'] = array('link' => "应用|entry|browse|", 'subModule' => 'entry');
diff --git a/module/admin/model.php b/module/admin/model.php
index c6ec4bed40..bff5a3bc9d 100755
--- a/module/admin/model.php
+++ b/module/admin/model.php
@@ -247,4 +247,63 @@ class adminModel extends model
if($user->birthday and $user->password == md5($user->birthday)) return true;
return false;
}
+
+ public function setMenu()
+ {
+ $this->lang->switcherMenu = $this->getSwitcher();
+ }
+
+ /**
+ * Get switcher.
+ *
+ * @access public
+ * @return string
+ */
+ public function getSwitcher()
+ {
+ $moduleName = $this->app->rawModule;
+ $methodName = $this->app->rawMethod;
+ $paramName = current($this->app->rawParams);
+ $currentMenu = 'setting';
+ $currentMenuName = '';
+ $link = $paramName ? helper::createLink($moduleName, $methodName, "param=$paramName") : helper::createLink($moduleName, $methodName);
+
+ foreach($this->config->admin->menuGroup as $menuKey => $menuGroup)
+ {
+ if(in_array($moduleName, $menuGroup))
+ {
+ $currentMenu = $menuKey;
+ break;
+ }
+ elseif(in_array("$moduleName|$methodName", $menuGroup))
+ {
+ if($moduleName == 'custom' and ($methodName == 'required' or $methodName == 'set'))
+ {
+ if(in_array($paramName, $this->config->admin->menuModuleGroup[$menuKey]["custom|$methodName"]))
+ {
+
+ $currentMenu = $menuKey;
+ break;
+ }
+ }
+ else
+ {
+ $currentMenu = $menuKey;
+ break;
+ }
+ }
+ }
+
+ $currentMenuName = $this->lang->admin->menuList->$currentMenu['name'];
+
+ $output = "
";
+
+ return $output;
+ }
}
diff --git a/module/bug/control.php b/module/bug/control.php
index b0651b9bb2..827fc78166 100755
--- a/module/bug/control.php
+++ b/module/bug/control.php
@@ -1955,6 +1955,8 @@ class bug extends control
$actionID = $this->action->create('bug', $bugID, 'Closed', $this->post->comment);
$this->action->logHistory($actionID, $changes);
+ $this->dao->update(TABLE_BUG)->set('assignedTo')->eq('closed')->where('id')->eq((int)$bugID)->exec();
+
$this->executeHooks($bugID);
$extra = str_replace(array(',', ' '), array('&', ''), $extra);
@@ -2093,6 +2095,7 @@ class bug extends control
/* Reset $_POST. Do not unset that because the function of close need that in model. */
$_POST = array();
+ $closedBugs = array();
$bugs = $this->bug->getByList($bugIDList);
foreach($bugs as $bugID => $bug)
{
@@ -2106,7 +2109,11 @@ class bug extends control
$actionID = $this->action->create('bug', $bugID, 'Closed');
$this->action->logHistory($actionID, $changes);
+ $closedBugs[] = $bugID;
}
+
+ $this->dao->update(TABLE_BUG)->set('assignedTo')->eq('closed')->where('id')->in($closedBugs)->exec();
+
$this->loadModel('score')->create('ajax', 'batchOther');
if(isset($skipBugs)) echo js::alert(sprintf($this->lang->bug->skipClose, join(',', $skipBugs)));
if($viewType)
diff --git a/module/bug/js/common.js b/module/bug/js/common.js
index cb51d5fc15..a6bb07c705 100644
--- a/module/bug/js/common.js
+++ b/module/bug/js/common.js
@@ -866,9 +866,15 @@ function notice()
var html = '';
if($('#execution').length == 0 || $('#execution').val() == 0)
{
- var branch = $('#branch').val();
+ var branch = $('#branch').val();
+ var projectID = $('#project').val();
+
if(typeof(branch) == 'undefined') branch = 0;
+ if(typeof(projectID) == 'undefined') projectID = 0;
+
var link = createLink('release', 'create', 'productID=' + $('#product').val() + '&branch=' + branch);
+ if(projectID > 0) link = createLink('projectrelease', 'create', 'projectID=' + projectID);
+
if(config.onlybody != 'yes') link += link.indexOf('?') >= 0 ? '&onlybody=yes' : '?onlybody=yes';
html += '' + createRelease + ' ';
html += '' + refresh + '';
diff --git a/module/bug/model.php b/module/bug/model.php
index 89d71c2aef..c61ccf0179 100644
--- a/module/bug/model.php
+++ b/module/bug/model.php
@@ -1493,7 +1493,6 @@ class bugModel extends model
$oldBug = $this->getById($bugID);
$bug = fixer::input('post')
->add('id', $bugID)
- ->add('assignedTo', 'closed')
->add('status', 'closed')
->add('confirmed', 1)
->setDefault('assignedDate', $now)
@@ -3598,9 +3597,9 @@ class bugModel extends model
$ccList = substr($ccList, $commaPos + 1);
}
}
- elseif(strtolower($toList) == 'closed')
+ elseif($bug->status == 'closed')
{
- $toList = $bug->resolvedBy;
+ $ccList .= ',' . $bug->resolvedBy;
}
return array($toList, $ccList);
diff --git a/module/common/lang/menu.php b/module/common/lang/menu.php
index 3811a4194b..437636fe0c 100644
--- a/module/common/lang/menu.php
+++ b/module/common/lang/menu.php
@@ -572,82 +572,82 @@ $lang->company->menuOrder[30] = 'addUser';
/* Admin menu. */
$lang->admin->menu = new stdclass();
-$lang->admin->menu->index = array('link' => "$lang->indexPage|admin|index", 'alias' => 'register,certifytemail,certifyztmobile,ztcompany');
-$lang->admin->menu->company = array('link' => "{$lang->personnel->common}|company|browse|", 'subModule' => ',user,dept,group,');
-$lang->admin->menu->model = array('link' => "$lang->model|custom|browsestoryconcept|", 'class' => 'dropdown dropdown-hover', 'exclude' => 'custom-index,custom-set,custom-product,custom-execution,custom-kanban,custom-required,custom-flow,custom-score,custom-feedback,custom-timezone,custom-mode');
-$lang->admin->menu->custom = array('link' => "{$lang->custom->common}|custom|index", 'exclude' => 'custom-browsestoryconcept,custom-timezone,custom-estimate,custom-code,custom-mode');
-$lang->admin->menu->extension = array('link' => "{$lang->extension->common}|extension|browse", 'subModule' => 'extension');
-$lang->admin->menu->dev = array('link' => "$lang->redev|dev|api", 'alias' => 'db', 'subModule' => 'dev,editor,entry');
-$lang->admin->menu->message = array('link' => "{$lang->message->common}|message|index", 'subModule' => 'message,mail,webhook');
-$lang->admin->menu->system = array('link' => "{$lang->admin->system}|custom|mode", 'subModule' => 'cron,backup,action,admin,search,convert', 'exclude' => 'admin-index,admin-xuanxuan,admin-register,admin-ztcompany');
-
-$lang->admin->menu->model['dropMenu'] = new stdclass();
-$lang->admin->menu->model['dropMenu']->allModel = array('link' => "{$lang->globalSetting}|custom|browsestoryconcept|", 'subModule' => 'measurement,report,sqlbuilder,subject,custom,meetingroom,baseline');
-
-if($config->edition == 'max') $lang->admin->menu->model['dropMenu']->scrum = array('link' => "{$lang->scrumModel}|auditcl|scrumbrowse|processID=0&browseType=scrum", 'subModule' => 'auditcl,process,activity,zoutput,classify,');
-$lang->admin->menu->model['dropMenu']->waterfall = array('link' => "{$lang->waterfallModel}|stage|setType|", 'subModule' => 'stage,auditcl,cmcl,process,activity,zoutput,classify,reviewcl,reviewsetting,design');
-
-$lang->admin->menu->allModel['subMenu'] = new stdclass();
-$lang->admin->menu->allModel['subMenu']->storyConcept = array('link' => "{$lang->storyConcept}|custom|browsestoryconcept|");
-$lang->admin->menu->allModel['subMenu']->code = array('link' => "{$lang->code}|custom|code|");
-
-$lang->admin->menu->allModel['menuOrder'][5] = 'storyConcept';
-$lang->admin->menu->allModel['menuOrder'][30] = 'code';
-
-$lang->admin->menu->waterfall['subMenu'] = new stdclass();
-$lang->admin->menu->waterfall['subMenu']->stage = array('link' => "{$lang->stage->common}|stage|setType|", 'subModule' => 'stage');
-
-/* Admin menu order. */
-$lang->admin->menuOrder[5] = 'index';
-$lang->admin->menuOrder[10] = 'company';
-$lang->admin->menuOrder[15] = 'model';
-$lang->admin->menuOrder[20] = 'custom';
-$lang->admin->menuOrder[25] = 'message';
-$lang->admin->menuOrder[30] = 'extension';
-$lang->admin->menuOrder[35] = 'dev';
-$lang->admin->menuOrder[40] = 'system';
-
-$lang->admin->menu->message['subMenu'] = new stdclass();
-$lang->admin->menu->message['subMenu']->message = array();
-$lang->admin->menu->message['subMenu']->mail = array('link' => "{$lang->mail->common}|mail|index", 'subModule' => 'mail');
-$lang->admin->menu->message['subMenu']->webhook = array('link' => "Webhook|webhook|browse", 'subModule' => 'webhook');
-$lang->admin->menu->message['subMenu']->browser = array('link' => "$lang->browser|message|browser");
-$lang->admin->menu->message['subMenu']->setting = array('link' => "$lang->settings|message|setting");
-
-$lang->admin->menu->message['menuOrder'][5] = 'mail';
-$lang->admin->menu->message['menuOrder'][10] = 'webhook';
-$lang->admin->menu->message['menuOrder'][15] = 'browser';
-$lang->admin->menu->message['menuOrder'][20] = 'setting';
-
-$lang->admin->menu->company['subMenu'] = new stdclass();
-$lang->admin->menu->company['subMenu']->browseUser = array('link' => "{$lang->user->common}|company|browse", 'subModule' => 'user');
-$lang->admin->menu->company['subMenu']->dept = array('link' => "{$lang->dept->common}|dept|browse", 'subModule' => 'dept');
-$lang->admin->menu->company['subMenu']->browseGroup = array('link' => "{$lang->priv}|group|browse", 'subModule' => 'group');
-
-$lang->admin->menu->dev['subMenu'] = new stdclass();
-$lang->admin->menu->dev['subMenu']->api = array('link' => "API|dev|api");
-$lang->admin->menu->dev['subMenu']->db = array('link' => "$lang->db|dev|db");
-$lang->admin->menu->dev['subMenu']->editor = array('link' => "$lang->editor|dev|editor");
-$lang->admin->menu->dev['subMenu']->entry = array('link' => "{$lang->admin->entry}|entry|browse", 'subModule' => 'entry');
-
-$lang->admin->menu->dev['menuOrder'][5] = 'api';
-$lang->admin->menu->dev['menuOrder'][10] = 'db';
-$lang->admin->menu->dev['menuOrder'][15] = 'editor';
-$lang->admin->menu->dev['menuOrder'][20] = 'entry';
-
-$lang->admin->menu->system['subMenu'] = new stdclass();
-$lang->admin->menu->system['subMenu']->mode = array('link' => "{$lang->custom->mode}|custom|mode");
-$lang->admin->menu->system['subMenu']->setModule = array('link' => "{$lang->admin->module}|admin|setmodule");
-$lang->admin->menu->system['subMenu']->backup = array('link' => "{$lang->backup->common}|backup|index");
-$lang->admin->menu->system['subMenu']->trash = array('link' => "{$lang->action->trash}|action|trash");
-$lang->admin->menu->system['subMenu']->safe = array('link' => "$lang->security|admin|safe", 'alias' => 'checkweak,resetpwdsetting');
-$lang->admin->menu->system['subMenu']->cron = array('link' => "{$lang->admin->cron}|cron|index", 'subModule' => 'cron');
-$lang->admin->menu->system['subMenu']->timezone = array('link' => "$lang->timezone|custom|timezone");
-$lang->admin->menu->system['subMenu']->buildIndex = array('link' => "{$lang->admin->buildIndex}|search|buildindex|");
-$lang->admin->menu->system['subMenu']->tableEngine = array('link' => "{$lang->admin->tableEngine}|admin|tableengine|");
-if(version_compare(phpversion(), 5.6) > 0) $lang->admin->menu->system['subMenu']->convertJira = array('link' => "{$lang->convert->importJira}|convert|convertjira|", 'subModule' => 'convert');
-
-$lang->admin->dividerMenu = ',company,message,system,';
+//$lang->admin->menu->index = array('link' => "$lang->indexPage|admin|index", 'alias' => 'register,certifytemail,certifyztmobile,ztcompany');
+//$lang->admin->menu->company = array('link' => "{$lang->personnel->common}|company|browse|", 'subModule' => ',user,dept,group,');
+//$lang->admin->menu->model = array('link' => "$lang->model|custom|browsestoryconcept|", 'class' => 'dropdown dropdown-hover', 'exclude' => 'custom-index,custom-set,custom-product,custom-execution,custom-kanban,custom-required,custom-flow,custom-score,custom-feedback,custom-timezone,custom-mode');
+//$lang->admin->menu->custom = array('link' => "{$lang->custom->common}|custom|index", 'exclude' => 'custom-browsestoryconcept,custom-timezone,custom-estimate,custom-code,custom-mode');
+//$lang->admin->menu->extension = array('link' => "{$lang->extension->common}|extension|browse", 'subModule' => 'extension');
+//$lang->admin->menu->dev = array('link' => "$lang->redev|dev|api", 'alias' => 'db', 'subModule' => 'dev,editor,entry');
+//$lang->admin->menu->message = array('link' => "{$lang->message->common}|message|index", 'subModule' => 'message,mail,webhook');
+//$lang->admin->menu->system = array('link' => "{$lang->admin->system}|custom|mode", 'subModule' => 'cron,backup,action,admin,search,convert', 'exclude' => 'admin-index,admin-xuanxuan,admin-register,admin-ztcompany');
+//
+//$lang->admin->menu->model['dropMenu'] = new stdclass();
+//$lang->admin->menu->model['dropMenu']->allModel = array('link' => "{$lang->globalSetting}|custom|browsestoryconcept|", 'subModule' => 'measurement,report,sqlbuilder,subject,custom,meetingroom,baseline');
+//
+//if($config->edition == 'max') $lang->admin->menu->model['dropMenu']->scrum = array('link' => "{$lang->scrumModel}|auditcl|scrumbrowse|processID=0&browseType=scrum", 'subModule' => 'auditcl,process,activity,zoutput,classify,');
+//$lang->admin->menu->model['dropMenu']->waterfall = array('link' => "{$lang->waterfallModel}|stage|setType|", 'subModule' => 'stage,auditcl,cmcl,process,activity,zoutput,classify,reviewcl,reviewsetting,design');
+//
+//$lang->admin->menu->allModel['subMenu'] = new stdclass();
+//$lang->admin->menu->allModel['subMenu']->storyConcept = array('link' => "{$lang->storyConcept}|custom|browsestoryconcept|");
+//$lang->admin->menu->allModel['subMenu']->code = array('link' => "{$lang->code}|custom|code|");
+//
+//$lang->admin->menu->allModel['menuOrder'][5] = 'storyConcept';
+//$lang->admin->menu->allModel['menuOrder'][30] = 'code';
+//
+//$lang->admin->menu->waterfall['subMenu'] = new stdclass();
+//$lang->admin->menu->waterfall['subMenu']->stage = array('link' => "{$lang->stage->common}|stage|setType|", 'subModule' => 'stage');
+//
+///* Admin menu order. */
+//$lang->admin->menuOrder[5] = 'index';
+//$lang->admin->menuOrder[10] = 'company';
+//$lang->admin->menuOrder[15] = 'model';
+//$lang->admin->menuOrder[20] = 'custom';
+//$lang->admin->menuOrder[25] = 'message';
+//$lang->admin->menuOrder[30] = 'extension';
+//$lang->admin->menuOrder[35] = 'dev';
+//$lang->admin->menuOrder[40] = 'system';
+//
+//$lang->admin->menu->message['subMenu'] = new stdclass();
+//$lang->admin->menu->message['subMenu']->message = array();
+//$lang->admin->menu->message['subMenu']->mail = array('link' => "{$lang->mail->common}|mail|index", 'subModule' => 'mail');
+//$lang->admin->menu->message['subMenu']->webhook = array('link' => "Webhook|webhook|browse", 'subModule' => 'webhook');
+//$lang->admin->menu->message['subMenu']->browser = array('link' => "$lang->browser|message|browser");
+//$lang->admin->menu->message['subMenu']->setting = array('link' => "$lang->settings|message|setting");
+//
+//$lang->admin->menu->message['menuOrder'][5] = 'mail';
+//$lang->admin->menu->message['menuOrder'][10] = 'webhook';
+//$lang->admin->menu->message['menuOrder'][15] = 'browser';
+//$lang->admin->menu->message['menuOrder'][20] = 'setting';
+//
+//$lang->admin->menu->company['subMenu'] = new stdclass();
+//$lang->admin->menu->company['subMenu']->browseUser = array('link' => "{$lang->user->common}|company|browse", 'subModule' => 'user');
+//$lang->admin->menu->company['subMenu']->dept = array('link' => "{$lang->dept->common}|dept|browse", 'subModule' => 'dept');
+//$lang->admin->menu->company['subMenu']->browseGroup = array('link' => "{$lang->priv}|group|browse", 'subModule' => 'group');
+//
+//$lang->admin->menu->dev['subMenu'] = new stdclass();
+//$lang->admin->menu->dev['subMenu']->api = array('link' => "API|dev|api");
+//$lang->admin->menu->dev['subMenu']->db = array('link' => "$lang->db|dev|db");
+//$lang->admin->menu->dev['subMenu']->editor = array('link' => "$lang->editor|dev|editor");
+//$lang->admin->menu->dev['subMenu']->entry = array('link' => "{$lang->admin->entry}|entry|browse", 'subModule' => 'entry');
+//
+//$lang->admin->menu->dev['menuOrder'][5] = 'api';
+//$lang->admin->menu->dev['menuOrder'][10] = 'db';
+//$lang->admin->menu->dev['menuOrder'][15] = 'editor';
+//$lang->admin->menu->dev['menuOrder'][20] = 'entry';
+//
+//$lang->admin->menu->system['subMenu'] = new stdclass();
+//$lang->admin->menu->system['subMenu']->mode = array('link' => "{$lang->custom->mode}|custom|mode");
+//$lang->admin->menu->system['subMenu']->setModule = array('link' => "{$lang->admin->module}|admin|setmodule");
+//$lang->admin->menu->system['subMenu']->backup = array('link' => "{$lang->backup->common}|backup|index");
+//$lang->admin->menu->system['subMenu']->trash = array('link' => "{$lang->action->trash}|action|trash");
+//$lang->admin->menu->system['subMenu']->safe = array('link' => "$lang->security|admin|safe", 'alias' => 'checkweak,resetpwdsetting');
+//$lang->admin->menu->system['subMenu']->cron = array('link' => "{$lang->admin->cron}|cron|index", 'subModule' => 'cron');
+//$lang->admin->menu->system['subMenu']->timezone = array('link' => "$lang->timezone|custom|timezone");
+//$lang->admin->menu->system['subMenu']->buildIndex = array('link' => "{$lang->admin->buildIndex}|search|buildindex|");
+//$lang->admin->menu->system['subMenu']->tableEngine = array('link' => "{$lang->admin->tableEngine}|admin|tableengine|");
+//if(version_compare(phpversion(), 5.6) > 0) $lang->admin->menu->system['subMenu']->convertJira = array('link' => "{$lang->convert->importJira}|convert|convertjira|", 'subModule' => 'convert');
+//
+//$lang->admin->dividerMenu = ',company,message,system,';
$lang->subject->menu = new stdclass();
$lang->subject->menu->storyConcept = array('link' => "{$lang->storyConcept}|custom|browsestoryconcept|");
diff --git a/module/common/model.php b/module/common/model.php
index 504f4c49a8..d5a533f37a 100644
--- a/module/common/model.php
+++ b/module/common/model.php
@@ -913,9 +913,9 @@ class commonModel extends model
*/
public static function printHomeButton($tab)
{
- global $lang;
- global $config;
+ global $lang, $config, $app;
+ if($tab == 'admin') $app->control->loadModel('admin')->setMenu();
if(!$tab) return;
$icon = zget($lang->navIcons, $tab, '');
diff --git a/module/projectrelease/control.php b/module/projectrelease/control.php
index a5caeecf1f..ab9fc56834 100644
--- a/module/projectrelease/control.php
+++ b/module/projectrelease/control.php
@@ -137,6 +137,8 @@ class projectrelease extends control
if($this->viewType == 'json') return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'id' => $releaseID));
+ if(isonlybody()) return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'closeModal' => true));
+
return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('view', "releaseID=$releaseID")));
}
diff --git a/module/story/control.php b/module/story/control.php
index 014eb38c1f..fdc90208ab 100755
--- a/module/story/control.php
+++ b/module/story/control.php
@@ -1822,6 +1822,8 @@ class story extends control
$this->action->logHistory($actionID, $changes);
}
+ $this->dao->update(TABLE_STORY)->set('assignedTo')->eq('closed')->where('id')->eq((int)$storyID)->exec();
+
$this->executeHooks($storyID);
if(isonlybody())
@@ -1968,6 +1970,8 @@ class story extends control
if(!empty($stories[$storyID]->twins)) $this->story->syncTwins($storyID, $stories[$storyID]->twins, $changes, 'Closed');
}
+
+ $this->dao->update(TABLE_STORY)->set('assignedTo')->eq('closed')->where('id')->in(array_keys($allChanges))->exec();
}
if(!dao::isError()) $this->loadModel('score')->create('ajax', 'batchOther');
diff --git a/module/story/model.php b/module/story/model.php
index e676929965..e115aee2d9 100644
--- a/module/story/model.php
+++ b/module/story/model.php
@@ -1986,7 +1986,6 @@ class storyModel extends model
$now = helper::now();
$story = fixer::input('post')
->add('id', $storyID)
- ->add('assignedTo', 'closed')
->add('status', 'closed')
->add('stage', 'closed')
->setDefault('lastEditedBy', $this->app->user->account)
@@ -2077,7 +2076,6 @@ class storyModel extends model
$story->lastEditedDate = $now;
$story->closedBy = $this->app->user->account;
$story->closedDate = $now;
- $story->assignedTo = 'closed';
$story->assignedDate = $now;
$story->status = 'closed';
$story->stage = 'closed';
@@ -4447,9 +4445,9 @@ class storyModel extends model
$ccList = substr($ccList, $commaPos + 1);
}
}
- elseif($toList == 'closed')
+ elseif($story->status == 'closed')
{
- $toList = $story->openedBy;
+ $ccList .= ',' . $story->openedBy;
}
return array($toList, $ccList);
diff --git a/module/tree/view/browse.html.php b/module/tree/view/browse.html.php
index 1eebc58be7..ef16073e5e 100644
--- a/module/tree/view/browse.html.php
+++ b/module/tree/view/browse.html.php
@@ -114,12 +114,13 @@ if($viewType == 'doc' or $viewType == 'api')
doc->manageType : $lang->tree->$manageChild;?>
+
tree->syncFromProduct, '', "class='btn btn-sm btn-primary'")?>
- createLink('feedback', 'syncProduct', "productID=$rootID", '', true), $lang->tree->syncProductModule, '', "class='btn btn-sm btn-primary iframe' data-width='40%'");?>
+ createLink('feedback', 'syncProduct', "productID=$rootID&parent=$parent", '', true), $lang->tree->syncProductModule, '', "class='btn btn-sm btn-primary iframe' data-width='40%'");?>
- createLink('ticket', 'syncProduct', "productID=$rootID", '', true), $lang->tree->syncProductModule, '', "class='btn btn-sm btn-primary iframe' data-width='40%'");?>
+ createLink('ticket', 'syncProduct', "productID=$rootID&parent=$parent", '', true), $lang->tree->syncProductModule, '', "class='btn btn-sm btn-primary iframe' data-width='40%'");?>