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%'");?>