diff --git a/api/v1/entries/storychange.php b/api/v1/entries/storychange.php index c5e1a52835..a4a87ba5d3 100644 --- a/api/v1/entries/storychange.php +++ b/api/v1/entries/storychange.php @@ -28,7 +28,7 @@ class storyChangeEntry extends entry $this->batchSetPost($fields, $oldStory); /* If reviewer is not post, set needNotReview. */ - if(empty($this->request('reviewer'))) + if(!$this->request('reviewer')) { $this->setPost('reviewer', array()); $this->setPost('needNotReview', 1); diff --git a/config/zentaopms.php b/config/zentaopms.php index 170afc14b9..68b7f8b1b8 100644 --- a/config/zentaopms.php +++ b/config/zentaopms.php @@ -429,9 +429,11 @@ $config->maxPriValue = '256'; $config->importWhiteList = array('user', 'task', 'story', 'bug', 'testcase', 'feedback', 'ticket'); $config->featureGroup = new stdclass(); -$config->featureGroup->my = array('score'); -$config->featureGroup->product = array('roadmap', 'track', 'UR'); -$config->featureGroup->scrum = array(); -$config->featureGroup->waterfall = array(); -$config->featureGroup->assetlib = array(); -$config->featureGroup->other = array('devops', 'kanban'); +$config->featureGroup->my = array('score'); +$config->featureGroup->product = array('roadmap', 'track', 'UR'); +$config->featureGroup->scrum = array(); +$config->featureGroup->waterfall = array(); +$config->featureGroup->agileplus = array(); +$config->featureGroup->waterfallplus = array(); +$config->featureGroup->assetlib = array(); +$config->featureGroup->other = array('devops', 'kanban'); diff --git a/db/update18.1.sql b/db/update18.1.sql index dea20bab4f..7a9b0d9d6a 100644 --- a/db/update18.1.sql +++ b/db/update18.1.sql @@ -8,3 +8,15 @@ REPLACE INTO `zt_lang` (`lang`, `module`, `section`, `key`, `value`, `system`, ` UPDATE `zt_project` AS parent INNER JOIN (select `id`,`parent`,`attribute` from `zt_project` where `parent` != 0 and `type` = 'stage') AS child ON parent.`id` = child.`parent` SET parent.`attribute`='mix' where parent.`grade`=1 and parent.`type`='stage' and parent.`attribute` != child.`attribute`; REPLACE INTO `zt_grouppriv` (SELECT `group`,`module`,'batchChangeStatus' FROM `zt_grouppriv` WHERE `module` = 'execution' AND `method` = 'batchEdit'); + +ALTER table `zt_stage` ADD `projectType` varchar(255) NOT NULL DEFAULT '' AFTER `type`; +UPDATE `zt_stage` SET `projectType` = 'waterfall' WHERE `projectType` = ''; + +REPLACE INTO `zt_stage` (`name`,`percent`,`type`, `projectType`, `createdBy`,`createdDate`,`editedBy`,`editedDate`,`deleted`) VALUES +('需求','10','request','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), +('设计','10','design','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), +('开发','50','dev','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), +('测试','15','qa','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), +('发布','10','release','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), +('总结评审','5','review','waterfallplus','admin','2020-02-08 21:08:45','admin','2020-02-12 13:50:27','0'); + diff --git a/db/zentao.sql b/db/zentao.sql index 9d5ffb171a..b7c0f371e0 100755 --- a/db/zentao.sql +++ b/db/zentao.sql @@ -6391,13 +6391,19 @@ REPLACE INTO `zt_lang` (`lang`, `module`, `section`, `key`, `value`, `system`) V ('all','stage','typeList','review','总结评审','1'), ('all','stage','typeList','other','其他','1'); -REPLACE INTO `zt_stage` (`name`,`percent`,`type`,`createdBy`,`createdDate`,`editedBy`,`editedDate`,`deleted`) VALUES -('需求','10','request','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), -('设计','10','design','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), -('开发','50','dev','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), -('测试','15','qa','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), -('发布','10','release','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), -('总结评审','5','review','admin','2020-02-08 21:08:45','admin','2020-02-12 13:50:27','0'); +REPLACE INTO `zt_stage` (`name`,`percent`,`type`,`projectType`,`createdBy`,`createdDate`,`editedBy`,`editedDate`,`deleted`) VALUES +('需求','10','request','waterfall','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), +('设计','10','design','waterfall','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), +('开发','50','dev','waterfall','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), +('测试','15','qa','waterfall','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), +('发布','10','release','waterfall','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), +('总结评审','5','review','waterfall','admin','2020-02-08 21:08:45','admin','2020-02-12 13:50:27','0'); +('需求','10','request','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), +('设计','10','design','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), +('开发','50','dev','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), +('测试','15','qa','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), +('发布','10','release','waterfallplus','admin','2020-02-08 21:08:30','admin','2020-02-12 13:50:27','0'), +('总结评审','5','review','waterfallplus','admin','2020-02-08 21:08:45','admin','2020-02-12 13:50:27','0'); INSERT INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'custom', '', 'hourPoint', '0'); INSERT INTO `zt_config` (`owner`, `module`, `section`, `key`, `value`) VALUES ('system', 'common', '', 'CRProduct', '1'); diff --git a/framework/helper.class.php b/framework/helper.class.php index 7134dde9e6..6435c7b69e 100644 --- a/framework/helper.class.php +++ b/framework/helper.class.php @@ -96,7 +96,7 @@ class helper extends baseHelper } else { - if($feature == 'scrum' or $feature == 'waterfall') return strpos(",$config->disabledFeatures,", ",{$feature},") === false; + if(in_array($feature, array('scrum', 'waterfall', 'agileplus', 'waterfallplus'))) return strpos(",$config->disabledFeatures,", ",{$feature},") === false; $hasFeature = false; $canConfigFeature = false; @@ -107,7 +107,7 @@ class helper extends baseHelper if($feature == $group or $feature == $module) { $canConfigFeature = true; - if($group == 'scrum' or $group == 'waterfall') + if(in_array($group, array('scrum', 'waterfall', 'agileplus', 'waterfallplus'))) { if(helper::hasFeature("{$group}") and helper::hasFeature("{$group}_{$module}")) $hasFeature = true; } diff --git a/module/admin/lang/de.php b/module/admin/lang/de.php index 115ee795ec..6ba6dae130 100755 --- a/module/admin/lang/de.php +++ b/module/admin/lang/de.php @@ -86,9 +86,11 @@ $lang->admin->setModule->opened = 'Opened'; $lang->admin->setModule->closed = 'Closed'; $lang->admin->setModule->my = 'My'; -$lang->admin->setModule->product = 'Product'; -$lang->admin->setModule->scrum = 'Scrum Project'; -$lang->admin->setModule->waterfall = 'Waterfall Project'; +$lang->admin->setModule->product = $lang->productCommon; +$lang->admin->setModule->scrum = 'Scrum ' . $lang->projectCommon; +$lang->admin->setModule->waterfall = 'Waterfall ' . $lang->projectCommon; +$lang->admin->setModule->agileplus = 'Agile + ' . $lang->projectCommon; +$lang->admin->setModule->waterfallplus = 'Waterfall + ' . $lang->projectCommon; $lang->admin->setModule->assetlib = 'Assetlib'; $lang->admin->setModule->other = 'Other'; diff --git a/module/admin/lang/en.php b/module/admin/lang/en.php index f377b35bad..aba1645159 100755 --- a/module/admin/lang/en.php +++ b/module/admin/lang/en.php @@ -86,9 +86,11 @@ $lang->admin->setModule->opened = 'Opened'; $lang->admin->setModule->closed = 'Closed'; $lang->admin->setModule->my = 'My'; -$lang->admin->setModule->product = 'Product'; -$lang->admin->setModule->scrum = 'Scrum Project'; -$lang->admin->setModule->waterfall = 'Waterfall Project'; +$lang->admin->setModule->product = $lang->productCommon; +$lang->admin->setModule->scrum = 'Scrum ' . $lang->projectCommon; +$lang->admin->setModule->waterfall = 'Waterfall ' . $lang->projectCommon; +$lang->admin->setModule->agileplus = 'Agile + ' . $lang->projectCommon; +$lang->admin->setModule->waterfallplus = 'Waterfall + ' . $lang->projectCommon; $lang->admin->setModule->assetlib = 'Assetlib'; $lang->admin->setModule->other = 'Other'; diff --git a/module/admin/lang/fr.php b/module/admin/lang/fr.php index 416bdc6965..71acb72380 100755 --- a/module/admin/lang/fr.php +++ b/module/admin/lang/fr.php @@ -86,9 +86,11 @@ $lang->admin->setModule->opened = 'Opened'; $lang->admin->setModule->closed = 'Closed'; $lang->admin->setModule->my = 'My'; -$lang->admin->setModule->product = 'Product'; -$lang->admin->setModule->scrum = 'Scrum Project'; -$lang->admin->setModule->waterfall = 'Waterfall Project'; +$lang->admin->setModule->product = $lang->productCommon; +$lang->admin->setModule->scrum = 'Scrum ' . $lang->projectCommon; +$lang->admin->setModule->waterfall = 'Waterfall ' . $lang->projectCommon; +$lang->admin->setModule->agileplus = 'Agile + ' . $lang->projectCommon; +$lang->admin->setModule->waterfallplus = 'Waterfall + ' . $lang->projectCommon; $lang->admin->setModule->assetlib = 'Assetlib'; $lang->admin->setModule->other = 'Other'; diff --git a/module/admin/lang/menu.php b/module/admin/lang/menu.php index 52175bb54a..80454b8b46 100644 --- a/module/admin/lang/menu.php +++ b/module/admin/lang/menu.php @@ -75,26 +75,34 @@ $lang->admin->menuList->switch['subMenu']['setmodule'] = array('link' => "{$lang $lang->admin->menuList->switch['menuOrder']['5'] = 'setmodule'; -$lang->admin->menuList->model['subMenu']['common'] = array('link' => "{$lang->globalSetting}|custom|required|module=project", 'subModule' => 'custom,subject,holiday'); -$lang->admin->menuList->model['subMenu']['scrum'] = array('link' => "{$lang->scrumModel}|auditcl|scrumbrowse|", 'subModule' => 'auditcl'); -$lang->admin->menuList->model['subMenu']['waterfall'] = array('link' => "{$lang->waterfallModel}|stage|settype|", 'subModule' => 'stage'); +$lang->admin->menuList->model['subMenu']['common'] = array('link' => "{$lang->globalSetting}|custom|required|module=project", 'subModule' => 'custom,subject,holiday,stage', 'exclude' => 'stage-browse,stage-plusbrowse,stage-create,stage-edit,stage-batchcreate'); +$lang->admin->menuList->model['subMenu']['scrum'] = array('link' => "{$lang->scrumModel}|auditcl|scrumbrowse|", 'subModule' => 'auditcl'); +$lang->admin->menuList->model['subMenu']['waterfall'] = array('link' => "{$lang->waterfallModel}|stage|browse|", 'subModule' => 'stage', 'exclude' => 'stage-settype,stage-plusbrowse'); +$lang->admin->menuList->model['subMenu']['agileplus'] = array('link' => "{$lang->agilePlusModel}|auditcl|agileplusbrowse|", 'subModule' => 'auditcl'); +$lang->admin->menuList->model['subMenu']['waterfallplus'] = array('link' => "{$lang->waterfallPlusModel}|stage|plusbrowse|", 'subModule' => 'stage', 'exclude' => 'stage-settype,stage-browse'); $lang->admin->menuList->model['menuOrder']['5'] = 'common'; $lang->admin->menuList->model['menuOrder']['10'] = 'scrum'; $lang->admin->menuList->model['menuOrder']['15'] = 'waterfall'; +$lang->admin->menuList->model['menuOrder']['20'] = 'agileplus'; +$lang->admin->menuList->model['menuOrder']['25'] = 'waterfallplus'; -$lang->admin->menuList->model['tabMenu']['common']['project'] = array('link' => "{$lang->project->common}|custom|required|module=project", 'alias' => 'set', 'exclude' => 'custom', 'links' => array('custom|set|')); -$lang->admin->menuList->model['tabMenu']['common']['build'] = array('link' => "{$lang->build->common}|custom|required|module=build", 'alias' => 'set', 'exclude' => 'custom'); -$lang->admin->menuList->model['tabMenu']['common']['flow'] = array('link' => "{$lang->custom->flow}|custom|flow|", 'divider' => true); -$lang->admin->menuList->model['tabMenu']['common']['code'] = array('link' => "{$lang->code}|custom|code|"); -$lang->admin->menuList->model['tabMenu']['common']['hours'] = array('link' => "{$lang->workingHour}|custom|hours|", 'subModule' => 'holiday', 'links' => array('holiday|browse|')); -$lang->admin->menuList->model['tabMenu']['waterfall']['stage'] = array('link' => "{$lang->stage->common}|stage|settype|", 'subModule' => 'stage', 'links' => array('stage|browse|')); -$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['5'] = 'project'; -$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['10'] = 'build'; -$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['35'] = 'flow'; -$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['40'] = 'code'; -$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['45'] = 'hours'; -$lang->admin->menuList->model['tabMenu']['menuOrder']['waterfall']['5'] = 'stage'; +$lang->admin->menuList->model['tabMenu']['common']['project'] = array('link' => "{$lang->project->common}|custom|required|module=project", 'alias' => 'set', 'exclude' => 'custom', 'links' => array('custom|set|')); +$lang->admin->menuList->model['tabMenu']['common']['stage'] = array('link' => "{$lang->stage->common}|stage|settype|", 'subModule' => 'stage', 'links' => array('stage|browse|')); +$lang->admin->menuList->model['tabMenu']['common']['build'] = array('link' => "{$lang->build->common}|custom|required|module=build", 'alias' => 'set', 'exclude' => 'custom'); +$lang->admin->menuList->model['tabMenu']['common']['flow'] = array('link' => "{$lang->custom->flow}|custom|flow|", 'divider' => true); +$lang->admin->menuList->model['tabMenu']['common']['code'] = array('link' => "{$lang->code}|custom|code|"); +$lang->admin->menuList->model['tabMenu']['common']['hours'] = array('link' => "{$lang->workingHour}|custom|hours|", 'subModule' => 'holiday', 'links' => array('holiday|browse|')); +$lang->admin->menuList->model['tabMenu']['waterfall']['stage'] = array('link' => "{$lang->stage->common}|stage|browse|", 'subModule' => 'stage', 'exclude' => 'stage-plusbrowse'); +$lang->admin->menuList->model['tabMenu']['waterfallplus']['stage'] = array('link' => "{$lang->stage->common}|stage|plusbrowse|", 'subModule' => 'stage', 'exclude' => 'stage-browse'); +$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['5'] = 'project'; +$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['7'] = 'stage'; +$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['10'] = 'build'; +$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['35'] = 'flow'; +$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['40'] = 'code'; +$lang->admin->menuList->model['tabMenu']['menuOrder']['common']['45'] = 'hours'; +$lang->admin->menuList->model['tabMenu']['menuOrder']['waterfall']['5'] = 'stage'; +$lang->admin->menuList->model['tabMenu']['menuOrder']['waterfallplus']['5'] = 'stage'; $lang->admin->menuList->feature['subMenu']['my'] = array('link' => "{$lang->my->common}|custom|set|module=todo&field=priList", 'exclude' => 'set,required'); $lang->admin->menuList->feature['subMenu']['product'] = array('link' => "{$lang->productCommon}|custom|required|module=product", 'exclude' => 'set,required', 'alias' => 'browsestoryconcept,product'); @@ -169,15 +177,25 @@ $lang->admin->menuList->dev['menuOrder']['15'] = 'langItem'; $lang->admin->menuList->dev['menuOrder']['20'] = 'editor'; $lang->admin->menuList->dev['menuOrder']['25'] = 'entry'; -if($config->edition != 'max') unset($lang->admin->menuList->model['subMenu']['scrum'], $lang->admin->menuList->model['menuOrder']['10'], $lang->admin->menuList->template); +if($config->edition != 'max') +{ + unset($lang->admin->menuList->model['subMenu']['scrum']); + unset($lang->admin->menuList->model['subMenu']['agileplus']); + unset($lang->admin->menuList->model['menuOrder']['10']); + unset($lang->admin->menuList->model['menuOrder']['20']); + unset($lang->admin->menuList->template); +} if(!helper::hasFeature('waterfall')) { unset($lang->admin->menuList->model['subMenu']['waterfall']); + unset($lang->admin->menuList->model['subMenu']['waterfallplus']); unset($lang->admin->menuList->model['menuOrder']['15']); + unset($lang->admin->menuList->model['menuOrder']['25']); } -if($config->edition == 'max' and !helper::hasFeature('scrum_auditplan')) +if($config->edition == 'max') { - if(!helper::hasFeature('scrum_process')) unset($lang->admin->menuList->model['subMenu']['scrum'], $lang->admin->menuList->model['menuOrder']['10']); + if(!helper::hasFeature('scrum_auditplan') and !helper::hasFeature('scrum_process')) unset($lang->admin->menuList->model['subMenu']['scrum'], $lang->admin->menuList->model['menuOrder']['10']); + if(!helper::hasFeature('agileplus_auditplan') and !helper::hasFeature('agileplus_process')) unset($lang->admin->menuList->model['subMenu']['agileplus'], $lang->admin->menuList->model['menuOrder']['20']); } if($config->vision == 'lite') @@ -191,8 +209,12 @@ if($config->vision == 'lite') unset($lang->admin->menuList->model['subMenu']['scrum']); unset($lang->admin->menuList->model['subMenu']['waterfall']); + unset($lang->admin->menuList->model['subMenu']['agileplus']); + unset($lang->admin->menuList->model['subMenu']['waterfallplus']); unset($lang->admin->menuList->model['menuOrder']['10']); unset($lang->admin->menuList->model['menuOrder']['15']); + unset($lang->admin->menuList->model['menuOrder']['20']); + unset($lang->admin->menuList->model['menuOrder']['25']); unset($lang->admin->menuList->feature['subMenu']['product']); unset($lang->admin->menuList->feature['subMenu']['execution']); diff --git a/module/admin/lang/zh-cn.php b/module/admin/lang/zh-cn.php index 926dede079..ab9f757940 100755 --- a/module/admin/lang/zh-cn.php +++ b/module/admin/lang/zh-cn.php @@ -86,9 +86,11 @@ $lang->admin->setModule->opened = '已开启'; $lang->admin->setModule->closed = '已关闭'; $lang->admin->setModule->my = '地盘'; -$lang->admin->setModule->product = '产品'; -$lang->admin->setModule->scrum = '敏捷项目'; -$lang->admin->setModule->waterfall = '瀑布项目'; +$lang->admin->setModule->product = $lang->productCommon; +$lang->admin->setModule->scrum = '敏捷' . $lang->projectCommon; +$lang->admin->setModule->waterfall = '瀑布' . $lang->projectCommon; +$lang->admin->setModule->agileplus = '融合敏捷' . $lang->projectCommon; +$lang->admin->setModule->waterfallplus = '融合瀑布' . $lang->projectCommon; $lang->admin->setModule->assetlib = '资产库'; $lang->admin->setModule->other = '通用功能'; diff --git a/module/backup/model.php b/module/backup/model.php index d54d98419f..bbc9ff95ac 100644 --- a/module/backup/model.php +++ b/module/backup/model.php @@ -299,7 +299,7 @@ class backupModel extends model $summaryFile = dirname($backup) . DS . 'summary'; if(!file_exists($summaryFile)) return array(); - $summary = json_decode(file_get_contents(dirname($backup) . DS . 'summary'), 'true'); + $summary = json_decode(file_get_contents(dirname($backup) . DS . 'summary'), true); return isset($summary[basename($backup)]) ? $summary[basename($backup)] : array(); } diff --git a/module/block/control.php b/module/block/control.php index b65269bc6c..78edb264b5 100755 --- a/module/block/control.php +++ b/module/block/control.php @@ -78,7 +78,25 @@ class block extends control elseif(isset($this->lang->block->moduleList[$module])) { $this->get->set('mode', 'getblocklist'); - if($module == 'project') $this->get->set('dashboard', 'project'); + if($module == 'project') + { + $this->get->set('dashboard', 'project'); + + if($this->config->edition == 'max' and $this->app->tab == 'project') + { + $project = $this->loadModel('project')->getByID($this->session->project); + if(isset($project->model) and !helper::hasFeature("{$project->model}_issue")) + { + unset($this->lang->block->modules['scrum']['index']->availableBlocks->scrumissue); + unset($this->lang->block->modules['waterfall']['index']->availableBlocks->waterfallissue); + } + if(isset($project->model) and !helper::hasFeature("{$project->model}_risk")) + { + unset($this->lang->block->modules['scrum']['index']->availableBlocks->scrumrisk); + unset($this->lang->block->modules['waterfall']['index']->availableBlocks->waterfallrisk); + } + } + } $this->view->blocks = $this->fetch('block', 'main', "module=$module&id=$id"); $this->view->module = $module; } @@ -253,10 +271,20 @@ class block extends control $shortBlocks = $longBlocks = array(); foreach($blocks as $key => $block) { - if($block->block == 'waterfallrisk' and !helper::hasFeature('waterfall_risk')) continue; - if($block->block == 'waterfallissue' and !helper::hasFeature('waterfall_issue')) continue; - if($block->block == 'scrumrisk' and !helper::hasFeature('scrum_risk')) continue; - if($block->block == 'scrumissue' and !helper::hasFeature('scrum_issue')) continue; + if(in_array($block->block, array('waterfallrisk', 'waterfallissue'))) + { + $model = isset($project->model) ? $project->model : 'waterfall'; + if($block->block == 'waterfallrisk' and !helper::hasFeature("{$model}_risk")) continue; + if($block->block == 'waterfallissue' and !helper::hasFeature("{$model}_issue")) continue; + } + + if(in_array($block->block, array('scrumrisk', 'scrumissue'))) + { + $model = isset($project->model) ? $project->model : 'scrum'; + if($block->block == 'scrumrisk' and !helper::hasFeature("{$model}_risk")) continue; + if($block->block == 'scrumissue' and !helper::hasFeature("{$model}_issue")) continue; + } + if(!empty($block->source) and $block->source != 'todo' and !empty($acls['views']) and !isset($acls['views'][$block->source])) { unset($blocks[$key]); diff --git a/module/block/view/caseblock.html.php b/module/block/view/caseblock.html.php index dc6c00cc38..02882a2306 100644 --- a/module/block/view/caseblock.html.php +++ b/module/block/view/caseblock.html.php @@ -1,4 +1,3 @@ - runInfo = "
Z PUBLIC LICENSE 1.2 . Without authorization, I should not remove, hide or cover any logos/links of ZenTao."; $lang->designedByAIUX = " AIUX"; -$lang->reset = 'Zurücksetzen'; -$lang->cancel = 'Abbrechen'; -$lang->refresh = 'Aktualisieren'; -$lang->refreshIcon = ""; -$lang->create = 'Create'; -$lang->edit = 'Bearbeiten'; -$lang->delete = 'Löschen'; -$lang->activate = 'Activate'; -$lang->close = 'Schließen'; -$lang->unlink = 'Entfernen'; -$lang->import = 'Importieren'; -$lang->export = 'Exportieren'; -$lang->setFileName = 'Dateiame'; -$lang->submitting = 'Speichern...'; -$lang->save = 'Speichern'; -$lang->confirm = 'Bestätigen'; -$lang->preview = 'Ansehen'; -$lang->goback = 'Zurück'; -$lang->goPC = 'PC'; -$lang->more = 'Mehr'; -$lang->moreLink = 'MORE'; -$lang->day = 'Tag'; -$lang->customConfig = 'Custom Config'; -$lang->public = 'Öffentlich'; -$lang->trunk = 'Trunk'; -$lang->sort = 'Sortieren'; -$lang->required = 'Pflicht'; -$lang->noData = 'Kein Datensatz'; -$lang->fullscreen = 'Fullscreen'; -$lang->retrack = 'Retrack'; -$lang->whitelist = 'Weiße Liste'; -$lang->globalSetting = 'Common'; -$lang->waterfallModel = 'Waterfall'; -$lang->scrumModel = 'Scrum'; -$lang->agilePlusModel = 'Agile Plus'; -$lang->all = 'All'; -$lang->viewDetails = 'View Details'; +$lang->reset = 'Zurücksetzen'; +$lang->cancel = 'Abbrechen'; +$lang->refresh = 'Aktualisieren'; +$lang->refreshIcon = ""; +$lang->create = 'Create'; +$lang->edit = 'Bearbeiten'; +$lang->delete = 'Löschen'; +$lang->activate = 'Activate'; +$lang->close = 'Schließen'; +$lang->unlink = 'Entfernen'; +$lang->import = 'Importieren'; +$lang->export = 'Exportieren'; +$lang->setFileName = 'Dateiame'; +$lang->submitting = 'Speichern...'; +$lang->save = 'Speichern'; +$lang->confirm = 'Bestätigen'; +$lang->preview = 'Ansehen'; +$lang->goback = 'Zurück'; +$lang->goPC = 'PC'; +$lang->more = 'Mehr'; +$lang->moreLink = 'MORE'; +$lang->day = 'Tag'; +$lang->customConfig = 'Custom Config'; +$lang->public = 'Öffentlich'; +$lang->trunk = 'Trunk'; +$lang->sort = 'Sortieren'; +$lang->required = 'Pflicht'; +$lang->noData = 'Kein Datensatz'; +$lang->fullscreen = 'Fullscreen'; +$lang->retrack = 'Retrack'; +$lang->whitelist = 'Weiße Liste'; +$lang->globalSetting = 'Common'; +$lang->waterfallModel = 'Waterfall'; +$lang->scrumModel = 'Scrum'; +$lang->agilePlusModel = 'Agile Plus'; +$lang->waterfallPlusModel = 'Waterfall Plus'; +$lang->all = 'All'; +$lang->viewDetails = 'View Details'; $lang->actions = 'Aktionen'; $lang->restore = 'Wiederherstellen'; @@ -188,6 +189,7 @@ $lang->team->common = 'Team'; $lang->user->common = 'User'; $lang->custom->common = 'Custom'; $lang->custom->mode = 'Mode'; +$lang->custom->flow = 'Concept'; $lang->extension->common = 'Extension'; $lang->company->common = 'Company'; $lang->dept->common = 'Dept'; diff --git a/module/common/lang/en.php b/module/common/lang/en.php index cfe4c3849b..932179814c 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -49,43 +49,44 @@ $lang->runInfo = "
Without authorization, I should not remove, hide or cover any logos/links of ZenTao."; $lang->designedByAIUX = " AIUX"; -$lang->reset = 'Reset'; -$lang->cancel = 'Cancel'; -$lang->refresh = 'Refresh'; -$lang->refreshIcon = ""; -$lang->create = 'Create'; -$lang->edit = 'Edit'; -$lang->delete = 'Delete'; -$lang->activate = 'Activate'; -$lang->close = 'Close'; -$lang->unlink = 'Unlink'; -$lang->import = 'Import'; -$lang->export = 'Export'; -$lang->setFileName = 'File Name'; -$lang->submitting = 'Saving...'; -$lang->save = 'Save'; -$lang->confirm = 'Confirm'; -$lang->preview = 'View'; -$lang->goback = 'Back'; -$lang->goPC = 'PC'; -$lang->more = 'More'; -$lang->moreLink = 'MORE'; -$lang->day = ' Day'; -$lang->customConfig = 'Custom Config'; -$lang->public = 'Public'; -$lang->trunk = 'Trunk'; -$lang->sort = 'Order'; -$lang->required = 'Required'; -$lang->noData = 'No data.'; -$lang->fullscreen = 'Fullscreen'; -$lang->retrack = 'Retrack'; -$lang->whitelist = 'Access whitelist'; -$lang->globalSetting = 'Common'; -$lang->waterfallModel = 'Waterfall'; -$lang->scrumModel = 'Scrum'; -$lang->agilePlusModel = 'Agile Plus'; -$lang->all = 'All'; -$lang->viewDetails = 'View Details'; +$lang->reset = 'Reset'; +$lang->cancel = 'Cancel'; +$lang->refresh = 'Refresh'; +$lang->refreshIcon = ""; +$lang->create = 'Create'; +$lang->edit = 'Edit'; +$lang->delete = 'Delete'; +$lang->activate = 'Activate'; +$lang->close = 'Close'; +$lang->unlink = 'Unlink'; +$lang->import = 'Import'; +$lang->export = 'Export'; +$lang->setFileName = 'File Name'; +$lang->submitting = 'Saving...'; +$lang->save = 'Save'; +$lang->confirm = 'Confirm'; +$lang->preview = 'View'; +$lang->goback = 'Back'; +$lang->goPC = 'PC'; +$lang->more = 'More'; +$lang->moreLink = 'MORE'; +$lang->day = ' Day'; +$lang->customConfig = 'Custom Config'; +$lang->public = 'Public'; +$lang->trunk = 'Trunk'; +$lang->sort = 'Order'; +$lang->required = 'Required'; +$lang->noData = 'No data.'; +$lang->fullscreen = 'Fullscreen'; +$lang->retrack = 'Retrack'; +$lang->whitelist = 'Access whitelist'; +$lang->globalSetting = 'Common'; +$lang->waterfallModel = 'Waterfall'; +$lang->scrumModel = 'Scrum'; +$lang->agilePlusModel = 'Agile Plus'; +$lang->waterfallPlusModel = 'Waterfall Plus'; +$lang->all = 'All'; +$lang->viewDetails = 'View Details'; $lang->actions = 'Action'; $lang->restore = 'Reset'; @@ -188,6 +189,7 @@ $lang->team->common = 'Team'; $lang->user->common = 'User'; $lang->custom->common = 'Custom'; $lang->custom->mode = 'Mode'; +$lang->custom->flow = 'Concept'; $lang->extension->common = 'Extension'; $lang->company->common = 'Company'; $lang->dept->common = 'Dept'; diff --git a/module/common/lang/fr.php b/module/common/lang/fr.php index 2af3f87108..1ffdc2955d 100644 --- a/module/common/lang/fr.php +++ b/module/common/lang/fr.php @@ -49,43 +49,44 @@ $lang->runInfo = "
Z PUBLIC LICENSE 1.2 . Sans autorisation, je ne dois pas supprimer, masquer ou couvrir les logos / liens de ZenTao."; $lang->designedByAIUX = " AIUX"; -$lang->reset = 'Réinitialiser'; -$lang->cancel = 'Annuler'; -$lang->refresh = 'Rafraichir'; -$lang->refreshIcon = ""; -$lang->create = 'Create'; -$lang->edit = 'Editer'; -$lang->delete = 'Supprimer'; -$lang->activate = 'Activate'; -$lang->close = 'Fermer'; -$lang->unlink = 'Dissocier'; -$lang->import = 'Importer'; -$lang->export = 'Exporter'; -$lang->setFileName = 'Nom du Fichier'; -$lang->submitting = 'Enregistrement...'; -$lang->save = 'Sauvegarde'; -$lang->confirm = 'Confirmer'; -$lang->preview = 'Consulter'; -$lang->goback = 'Retour'; -$lang->goPC = 'PC'; -$lang->more = 'Plus'; -$lang->moreLink = 'MORE'; -$lang->day = 'Jour'; -$lang->customConfig = 'Personnalisation'; -$lang->public = 'Public'; -$lang->trunk = 'Tronc'; -$lang->sort = 'Ordre'; -$lang->required = 'Obligatoire'; -$lang->noData = 'No data.'; -$lang->fullscreen = 'Plein Ecran'; -$lang->retrack = 'Réduire'; -$lang->whitelist = 'Liste blanche'; -$lang->globalSetting = 'Common'; -$lang->waterfallModel = 'Waterfall'; -$lang->scrumModel = 'Scrum'; -$lang->agilePlusModel = 'Agile Plus'; -$lang->all = 'All'; -$lang->viewDetails = 'View Details'; +$lang->reset = 'Réinitialiser'; +$lang->cancel = 'Annuler'; +$lang->refresh = 'Rafraichir'; +$lang->refreshIcon = ""; +$lang->create = 'Create'; +$lang->edit = 'Editer'; +$lang->delete = 'Supprimer'; +$lang->activate = 'Activate'; +$lang->close = 'Fermer'; +$lang->unlink = 'Dissocier'; +$lang->import = 'Importer'; +$lang->export = 'Exporter'; +$lang->setFileName = 'Nom du Fichier'; +$lang->submitting = 'Enregistrement...'; +$lang->save = 'Sauvegarde'; +$lang->confirm = 'Confirmer'; +$lang->preview = 'Consulter'; +$lang->goback = 'Retour'; +$lang->goPC = 'PC'; +$lang->more = 'Plus'; +$lang->moreLink = 'MORE'; +$lang->day = 'Jour'; +$lang->customConfig = 'Personnalisation'; +$lang->public = 'Public'; +$lang->trunk = 'Tronc'; +$lang->sort = 'Ordre'; +$lang->required = 'Obligatoire'; +$lang->noData = 'No data.'; +$lang->fullscreen = 'Plein Ecran'; +$lang->retrack = 'Réduire'; +$lang->whitelist = 'Liste blanche'; +$lang->globalSetting = 'Common'; +$lang->waterfallModel = 'Waterfall'; +$lang->scrumModel = 'Scrum'; +$lang->agilePlusModel = 'Agile Plus'; +$lang->waterfallPlusModel = 'Waterfall Plus'; +$lang->all = 'All'; +$lang->viewDetails = 'View Details'; $lang->actions = 'Action'; $lang->restore = 'Réinitialiser'; @@ -188,6 +189,7 @@ $lang->team->common = 'Team'; $lang->user->common = 'User'; $lang->custom->common = 'Custom'; $lang->custom->mode = 'Mode'; +$lang->custom->flow = 'Concept'; $lang->extension->common = 'Extension'; $lang->company->common = 'Company'; $lang->dept->common = 'Dept'; diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php index 410da8fe83..eaa5946aaa 100644 --- a/module/common/lang/zh-cn.php +++ b/module/common/lang/zh-cn.php @@ -49,43 +49,44 @@ $lang->runInfo = "
未经许可,不得去除、隐藏或遮掩禅道软件的任何标志及链接。"; $lang->designedByAIUX = " 艾体验设计"; -$lang->reset = '重填'; -$lang->cancel = '取消'; -$lang->refresh = '刷新'; -$lang->refreshIcon = ""; -$lang->create = '新建'; -$lang->edit = '编辑'; -$lang->delete = '删除'; -$lang->activate = '激活'; -$lang->close = '关闭'; -$lang->unlink = '移除'; -$lang->import = '导入'; -$lang->export = '导出'; -$lang->setFileName = '文件名:'; -$lang->submitting = '稍候...'; -$lang->save = '保存'; -$lang->confirm = '确认'; -$lang->preview = '查看'; -$lang->goback = '返回'; -$lang->goPC = 'PC版'; -$lang->more = '更多'; -$lang->moreLink = 'More'; -$lang->day = '天'; -$lang->customConfig = '自定义'; -$lang->public = '公共'; -$lang->trunk = '主干'; -$lang->sort = '排序'; -$lang->required = '必填'; -$lang->noData = '暂无'; -$lang->fullscreen = '全屏'; -$lang->retrack = '收起'; -$lang->whitelist = '访问白名单'; -$lang->globalSetting = '通用'; -$lang->waterfallModel = '瀑布模型'; -$lang->scrumModel = '敏捷模型'; -$lang->agilePlusModel = '融合敏捷模型'; -$lang->all = '所有'; -$lang->viewDetails = '查看详情'; +$lang->reset = '重填'; +$lang->cancel = '取消'; +$lang->refresh = '刷新'; +$lang->refreshIcon = ""; +$lang->create = '新建'; +$lang->edit = '编辑'; +$lang->delete = '删除'; +$lang->activate = '激活'; +$lang->close = '关闭'; +$lang->unlink = '移除'; +$lang->import = '导入'; +$lang->export = '导出'; +$lang->setFileName = '文件名:'; +$lang->submitting = '稍候...'; +$lang->save = '保存'; +$lang->confirm = '确认'; +$lang->preview = '查看'; +$lang->goback = '返回'; +$lang->goPC = 'PC版'; +$lang->more = '更多'; +$lang->moreLink = 'More'; +$lang->day = '天'; +$lang->customConfig = '自定义'; +$lang->public = '公共'; +$lang->trunk = '主干'; +$lang->sort = '排序'; +$lang->required = '必填'; +$lang->noData = '暂无'; +$lang->fullscreen = '全屏'; +$lang->retrack = '收起'; +$lang->whitelist = '访问白名单'; +$lang->globalSetting = '通用'; +$lang->waterfallModel = '瀑布模型'; +$lang->scrumModel = '敏捷模型'; +$lang->agilePlusModel = '融合敏捷模型'; +$lang->waterfallPlusModel = '融合瀑布模型'; +$lang->all = '所有'; +$lang->viewDetails = '查看详情'; $lang->actions = '操作'; $lang->restore = '恢复默认'; @@ -188,6 +189,7 @@ $lang->team->common = '团队'; $lang->user->common = '用户'; $lang->custom->common = '自定义'; $lang->custom->mode = '模式'; +$lang->custom->flow = '流程设置'; $lang->extension->common = '插件'; $lang->company->common = '公司'; $lang->dept->common = '部门'; diff --git a/module/convert/model.php b/module/convert/model.php index e6c2e3ce9f..02843425aa 100644 --- a/module/convert/model.php +++ b/module/convert/model.php @@ -46,7 +46,7 @@ class convertModel extends model public function dbExists($dbName = '') { $statement = $this->dbh->prepare('SHOW DATABASES like ?'); - $statement->execute([$dbName]); + $statement->execute(array($dbName)); return $statement->fetch(); } diff --git a/module/custom/config.php b/module/custom/config.php index d13809c919..dca615e25c 100644 --- a/module/custom/config.php +++ b/module/custom/config.php @@ -22,8 +22,8 @@ $config->custom->requiredModules[35] = 'execution'; $config->custom->requiredModules[40] = 'task'; $config->custom->requiredModules[45] = 'build'; -$config->custom->allFeatures = array('program', 'productRR', 'productUR', 'productLine', 'projectScrum', 'projectWaterfall', 'projectKanban', 'execution', 'qa', 'devops', 'kanban', 'doc', 'report', 'system', 'admin', 'vision'); -$config->custom->dataFeatures = array('productUR', 'waterfall'); +$config->custom->allFeatures = array('program', 'productRR', 'productUR', 'productLine', 'projectScrum', 'projectWaterfall', 'projectKanban', 'projectAgileplus', 'projectWaterfallplus', 'execution', 'qa', 'devops', 'kanban', 'doc', 'report', 'system', 'admin', 'vision'); +$config->custom->dataFeatures = array('productUR', 'waterfall', 'waterfallplus'); $config->custom->scrumFeatures = array(); $config->custom->requiredModules[50] = 'bug'; diff --git a/module/custom/lang/de.php b/module/custom/lang/de.php index a60abfa439..b3140f2c89 100644 --- a/module/custom/lang/de.php +++ b/module/custom/lang/de.php @@ -8,7 +8,6 @@ $lang->custom->set = 'Customize'; $lang->custom->restore = 'Reset to Default'; $lang->custom->key = 'Key'; $lang->custom->value = 'Value'; -$lang->custom->flow = 'Concept'; $lang->custom->working = 'WorkStyle'; $lang->custom->select = 'Select Concept'; $lang->custom->branch = 'Multi Branch'; @@ -252,31 +251,34 @@ $lang->custom->modeList['ALM'] = 'ALM Mode'; $lang->custom->modeIntroductionList['light'] = 'Provides the core function of project management, suitable for small R&D teams'; $lang->custom->modeIntroductionList['ALM'] = 'The concept is more complete and rigorous, and the function is more abundant. It is suitable for medium and large R&D teams'; -$lang->custom->features['program'] = 'Program'; -$lang->custom->features['productRR'] = 'Product - R&D Requirements'; -$lang->custom->features['productUR'] = 'Product - User Requirements'; -$lang->custom->features['productLine'] = 'Product - Product Line'; -$lang->custom->features['projectScrum'] = 'Project - Scrum Model'; -$lang->custom->features['projectWaterfall'] = 'Project - Waterfall Model'; -$lang->custom->features['projectKanban'] = 'Project - Kanban Model'; -$lang->custom->features['execution'] = 'Execution'; -$lang->custom->features['qa'] = 'QA'; -$lang->custom->features['devops'] = 'DevOps'; -$lang->custom->features['kanban'] = 'Kanban'; -$lang->custom->features['doc'] = 'Doc'; -$lang->custom->features['report'] = 'Statistics'; -$lang->custom->features['system'] = 'System'; -$lang->custom->features['assetlib'] = 'Asset Lib'; -$lang->custom->features['oa'] = 'Attend'; -$lang->custom->features['ops'] = 'Deploy'; -$lang->custom->features['feedback'] = 'Feedback'; -$lang->custom->features['traincourse'] = 'Academy'; -$lang->custom->features['workflow'] = 'Workflow'; -$lang->custom->features['admin'] = 'Admin'; -$lang->custom->features['vision'] = 'Full Feature Interface, Operation Management Interface'; +$lang->custom->features['program'] = 'Program'; +$lang->custom->features['productRR'] = $lang->productCommon . ' - R&D Requirements'; +$lang->custom->features['productUR'] = $lang->productCommon . ' - User Requirements'; +$lang->custom->features['productLine'] = $lang->productCommon . ' - Product Line'; +$lang->custom->features['projectScrum'] = $lang->projectCommon . ' - Scrum Model'; +$lang->custom->features['projectWaterfall'] = $lang->projectCommon . ' - Waterfall Model'; +$lang->custom->features['projectKanban'] = $lang->projectCommon . ' - Kanban Model'; +$lang->custom->features['projectAgileplus'] = $lang->projectCommon . ' - Agile + Model'; +$lang->custom->features['projectWaterfallplus'] = $lang->projectCommon . ' - Waterfall + Model'; +$lang->custom->features['execution'] = 'Execution'; +$lang->custom->features['qa'] = 'QA'; +$lang->custom->features['devops'] = 'DevOps'; +$lang->custom->features['kanban'] = 'Kanban'; +$lang->custom->features['doc'] = 'Doc'; +$lang->custom->features['report'] = 'Statistics'; +$lang->custom->features['system'] = 'System'; +$lang->custom->features['assetlib'] = 'Asset Lib'; +$lang->custom->features['oa'] = 'Attend'; +$lang->custom->features['ops'] = 'Deploy'; +$lang->custom->features['feedback'] = 'Feedback'; +$lang->custom->features['traincourse'] = 'Academy'; +$lang->custom->features['workflow'] = 'Workflow'; +$lang->custom->features['admin'] = 'Admin'; +$lang->custom->features['vision'] = 'Full Feature Interface, Operation Management Interface'; -$lang->custom->needClosedFunctions['waterfall'] = 'Waterfall'; -$lang->custom->needClosedFunctions['URStory'] = 'User Story'; +$lang->custom->needClosedFunctions['waterfall'] = 'Waterfall'; +$lang->custom->needClosedFunctions['waterfallplus'] = 'Waterfall +'; +$lang->custom->needClosedFunctions['URStory'] = 'User Story'; if($config->edition == 'max') $lang->custom->needClosedFunctions['assetLib'] = 'Assetlib'; $lang->custom->scoreStatus[1] = 'On'; diff --git a/module/custom/lang/en.php b/module/custom/lang/en.php index 8c29df5c94..8f2e139a8d 100644 --- a/module/custom/lang/en.php +++ b/module/custom/lang/en.php @@ -8,7 +8,6 @@ $lang->custom->set = 'Customize'; $lang->custom->restore = 'Reset'; $lang->custom->key = 'Key'; $lang->custom->value = 'Value'; -$lang->custom->flow = 'Concept'; $lang->custom->working = 'Mode'; $lang->custom->select = 'Select Concept'; $lang->custom->branch = 'Multi-Branch'; @@ -252,31 +251,34 @@ $lang->custom->modeList['ALM'] = 'ALM Mode'; $lang->custom->modeIntroductionList['light'] = 'Provides the core function of project management, suitable for small R&D teams'; $lang->custom->modeIntroductionList['ALM'] = 'The concept is more complete and rigorous, and the function is more abundant. It is suitable for medium and large R&D teams'; -$lang->custom->features['program'] = 'Program'; -$lang->custom->features['productRR'] = 'Product - R&D Requirements'; -$lang->custom->features['productUR'] = 'Product - User Requirements'; -$lang->custom->features['productLine'] = 'Product - Product Line'; -$lang->custom->features['projectScrum'] = 'Project - Scrum Model'; -$lang->custom->features['projectWaterfall'] = 'Project - Waterfall Model'; -$lang->custom->features['projectKanban'] = 'Project - Kanban Model'; -$lang->custom->features['execution'] = 'Execution'; -$lang->custom->features['qa'] = 'QA'; -$lang->custom->features['devops'] = 'DevOps'; -$lang->custom->features['kanban'] = 'Kanban'; -$lang->custom->features['doc'] = 'Doc'; -$lang->custom->features['report'] = 'Statistics'; -$lang->custom->features['system'] = 'System'; -$lang->custom->features['assetlib'] = 'Asset Lib'; -$lang->custom->features['oa'] = 'Attend'; -$lang->custom->features['ops'] = 'Deploy'; -$lang->custom->features['feedback'] = 'Feedback'; -$lang->custom->features['traincourse'] = 'Academy'; -$lang->custom->features['workflow'] = 'Workflow'; -$lang->custom->features['admin'] = 'Admin'; -$lang->custom->features['vision'] = 'Full Feature Interface, Operation Management Interface'; +$lang->custom->features['program'] = 'Program'; +$lang->custom->features['productRR'] = $lang->productCommon . ' - R&D Requirements'; +$lang->custom->features['productUR'] = $lang->productCommon . ' - User Requirements'; +$lang->custom->features['productLine'] = $lang->productCommon . ' - Product Line'; +$lang->custom->features['projectScrum'] = $lang->projectCommon . ' - Scrum Model'; +$lang->custom->features['projectWaterfall'] = $lang->projectCommon . ' - Waterfall Model'; +$lang->custom->features['projectKanban'] = $lang->projectCommon . ' - Kanban Model'; +$lang->custom->features['projectAgileplus'] = $lang->projectCommon . ' - Agile + Model'; +$lang->custom->features['projectWaterfallplus'] = $lang->projectCommon . ' - Waterfall + Model'; +$lang->custom->features['execution'] = 'Execution'; +$lang->custom->features['qa'] = 'QA'; +$lang->custom->features['devops'] = 'DevOps'; +$lang->custom->features['kanban'] = 'Kanban'; +$lang->custom->features['doc'] = 'Doc'; +$lang->custom->features['report'] = 'Statistics'; +$lang->custom->features['system'] = 'System'; +$lang->custom->features['assetlib'] = 'Asset Lib'; +$lang->custom->features['oa'] = 'Attend'; +$lang->custom->features['ops'] = 'Deploy'; +$lang->custom->features['feedback'] = 'Feedback'; +$lang->custom->features['traincourse'] = 'Academy'; +$lang->custom->features['workflow'] = 'Workflow'; +$lang->custom->features['admin'] = 'Admin'; +$lang->custom->features['vision'] = 'Full Feature Interface, Operation Management Interface'; -$lang->custom->needClosedFunctions['waterfall'] = 'Waterfall'; -$lang->custom->needClosedFunctions['URStory'] = 'User Story'; +$lang->custom->needClosedFunctions['waterfall'] = 'Waterfall'; +$lang->custom->needClosedFunctions['waterfallplus'] = 'Waterfall +'; +$lang->custom->needClosedFunctions['URStory'] = 'User Story'; if($config->edition == 'max') $lang->custom->needClosedFunctions['assetLib'] = 'Assetlib'; $lang->custom->scoreStatus[1] = 'On'; diff --git a/module/custom/lang/fr.php b/module/custom/lang/fr.php index 609cad69a4..2e43227781 100644 --- a/module/custom/lang/fr.php +++ b/module/custom/lang/fr.php @@ -8,7 +8,6 @@ $lang->custom->set = 'Personnaliser'; $lang->custom->restore = 'Réinitialiser'; $lang->custom->key = 'Clé'; $lang->custom->value = 'Valeur'; -$lang->custom->flow = 'Concept'; $lang->custom->working = 'Mode'; $lang->custom->select = 'Choix du Concept'; $lang->custom->branch = 'Multi-Branches'; @@ -252,31 +251,34 @@ $lang->custom->modeList['ALM'] = 'ALM Mode'; $lang->custom->modeIntroductionList['light'] = 'Provides the core function of project management, suitable for small R&D teams'; $lang->custom->modeIntroductionList['ALM'] = 'The concept is more complete and rigorous, and the function is more abundant. It is suitable for medium and large R&D teams'; -$lang->custom->features['program'] = 'Program'; -$lang->custom->features['productRR'] = 'Product - R&D Requirements'; -$lang->custom->features['productUR'] = 'Product - User Requirements'; -$lang->custom->features['productLine'] = 'Product - Product Line'; -$lang->custom->features['projectScrum'] = 'Project - Scrum Model'; -$lang->custom->features['projectWaterfall'] = 'Project - Waterfall Model'; -$lang->custom->features['projectKanban'] = 'Project - Kanban Model'; -$lang->custom->features['execution'] = 'Execution'; -$lang->custom->features['qa'] = 'QA'; -$lang->custom->features['devops'] = 'DevOps'; -$lang->custom->features['kanban'] = 'Kanban'; -$lang->custom->features['doc'] = 'Doc'; -$lang->custom->features['report'] = 'Statistics'; -$lang->custom->features['system'] = 'System'; -$lang->custom->features['assetlib'] = 'Asset Lib'; -$lang->custom->features['oa'] = 'Attend'; -$lang->custom->features['ops'] = 'Deploy'; -$lang->custom->features['feedback'] = 'Feedback'; -$lang->custom->features['traincourse'] = 'Academy'; -$lang->custom->features['workflow'] = 'Workflow'; -$lang->custom->features['admin'] = 'Admin'; -$lang->custom->features['vision'] = 'Full Feature Interface, Operation Management Interface'; +$lang->custom->features['program'] = 'Program'; +$lang->custom->features['productRR'] = $lang->productCommon . ' - R&D Requirements'; +$lang->custom->features['productUR'] = $lang->productCommon . ' - User Requirements'; +$lang->custom->features['productLine'] = $lang->productCommon . ' - Product Line'; +$lang->custom->features['projectScrum'] = $lang->projectCommon . ' - Scrum Model'; +$lang->custom->features['projectWaterfall'] = $lang->projectCommon . ' - Waterfall Model'; +$lang->custom->features['projectKanban'] = $lang->projectCommon . ' - Kanban Model'; +$lang->custom->features['projectAgileplus'] = $lang->projectCommon . ' - Agile + Model'; +$lang->custom->features['projectWaterfallplus'] = $lang->projectCommon . ' - Waterfall + Model'; +$lang->custom->features['execution'] = 'Execution'; +$lang->custom->features['qa'] = 'QA'; +$lang->custom->features['devops'] = 'DevOps'; +$lang->custom->features['kanban'] = 'Kanban'; +$lang->custom->features['doc'] = 'Doc'; +$lang->custom->features['report'] = 'Statistics'; +$lang->custom->features['system'] = 'System'; +$lang->custom->features['assetlib'] = 'Asset Lib'; +$lang->custom->features['oa'] = 'Attend'; +$lang->custom->features['ops'] = 'Deploy'; +$lang->custom->features['feedback'] = 'Feedback'; +$lang->custom->features['traincourse'] = 'Academy'; +$lang->custom->features['workflow'] = 'Workflow'; +$lang->custom->features['admin'] = 'Admin'; +$lang->custom->features['vision'] = 'Full Feature Interface, Operation Management Interface'; -$lang->custom->needClosedFunctions['waterfall'] = 'Waterfall'; -$lang->custom->needClosedFunctions['URStory'] = 'User Story'; +$lang->custom->needClosedFunctions['waterfall'] = 'Waterfall'; +$lang->custom->needClosedFunctions['waterfallplus'] = 'Waterfall +'; +$lang->custom->needClosedFunctions['URStory'] = 'User Story'; if($config->edition == 'max') $lang->custom->needClosedFunctions['assetLib'] = 'Assetlib'; $lang->custom->scoreStatus[1] = 'On'; diff --git a/module/custom/lang/zh-cn.php b/module/custom/lang/zh-cn.php index ae60c824fb..8ed08ff52c 100644 --- a/module/custom/lang/zh-cn.php +++ b/module/custom/lang/zh-cn.php @@ -8,7 +8,6 @@ $lang->custom->set = '自定义配置'; $lang->custom->restore = '恢复默认'; $lang->custom->key = '键'; $lang->custom->value = '值'; -$lang->custom->flow = '流程设置'; $lang->custom->working = '工作方式'; $lang->custom->select = '请选择流程:'; $lang->custom->branch = '多分支'; @@ -252,31 +251,34 @@ $lang->custom->modeList['ALM'] = '全生命周期管理模式'; $lang->custom->modeIntroductionList['light'] = '提供了项目管理的核心功能,适用于小型研发团队'; $lang->custom->modeIntroductionList['ALM'] = '概念更加完整、严谨,功能更加丰富,适用于中大型研发团队'; -$lang->custom->features['program'] = '项目集'; -$lang->custom->features['productRR'] = '产品-研发需求'; -$lang->custom->features['productUR'] = '产品-用户需求'; -$lang->custom->features['productLine'] = '产品-产品线'; -$lang->custom->features['projectScrum'] = '项目-敏捷模型'; -$lang->custom->features['projectWaterfall'] = '项目-瀑布模型'; -$lang->custom->features['projectKanban'] = '项目-看板模型'; -$lang->custom->features['execution'] = '执行'; -$lang->custom->features['qa'] = '测试'; -$lang->custom->features['devops'] = 'DevOps'; -$lang->custom->features['kanban'] = '看板'; -$lang->custom->features['doc'] = '文档'; -$lang->custom->features['report'] = '统计'; -$lang->custom->features['system'] = '组织'; -$lang->custom->features['assetlib'] = '资产库'; -$lang->custom->features['oa'] = '办公'; -$lang->custom->features['ops'] = '运维'; -$lang->custom->features['feedback'] = '反馈'; -$lang->custom->features['traincourse'] = '学堂'; -$lang->custom->features['workflow'] = '工作流'; -$lang->custom->features['admin'] = '后台'; -$lang->custom->features['vision'] = '研发综合界面、运营管理界面'; +$lang->custom->features['program'] = '项目集'; +$lang->custom->features['productRR'] = '产品-研发需求'; +$lang->custom->features['productUR'] = '产品-用户需求'; +$lang->custom->features['productLine'] = '产品-产品线'; +$lang->custom->features['projectScrum'] = '项目-敏捷模型'; +$lang->custom->features['projectWaterfall'] = '项目-瀑布模型'; +$lang->custom->features['projectKanban'] = '项目-看板模型'; +$lang->custom->features['projectAgileplus'] = '项目-融合敏捷模型'; +$lang->custom->features['projectWaterfallplus'] = '项目-融合瀑布模型'; +$lang->custom->features['execution'] = '执行'; +$lang->custom->features['qa'] = '测试'; +$lang->custom->features['devops'] = 'DevOps'; +$lang->custom->features['kanban'] = '看板'; +$lang->custom->features['doc'] = '文档'; +$lang->custom->features['report'] = '统计'; +$lang->custom->features['system'] = '组织'; +$lang->custom->features['assetlib'] = '资产库'; +$lang->custom->features['oa'] = '办公'; +$lang->custom->features['ops'] = '运维'; +$lang->custom->features['feedback'] = '反馈'; +$lang->custom->features['traincourse'] = '学堂'; +$lang->custom->features['workflow'] = '工作流'; +$lang->custom->features['admin'] = '后台'; +$lang->custom->features['vision'] = '研发综合界面、运营管理界面'; -$lang->custom->needClosedFunctions['waterfall'] = '瀑布项目'; -$lang->custom->needClosedFunctions['URStory'] = '用户需求'; +$lang->custom->needClosedFunctions['waterfall'] = '瀑布项目'; +$lang->custom->needClosedFunctions['waterfallplus'] = '融合瀑布项目'; +$lang->custom->needClosedFunctions['URStory'] = '用户需求'; if($config->edition == 'max') $lang->custom->needClosedFunctions['assetLib'] = '资产库'; $lang->custom->scoreStatus[1] = '开启'; diff --git a/module/custom/model.php b/module/custom/model.php index 0f4fed2cf1..7778cb03f3 100644 --- a/module/custom/model.php +++ b/module/custom/model.php @@ -852,7 +852,7 @@ class customModel extends model if(!isset($disabledFeatures['scrum'])) $disabledFeatures['scrum'] = array(); $disabledFeatures['scrum'][] = $feature; } - elseif($feature == 'waterfall') + elseif(in_array($feature, array('waterfall', 'waterfallplus'))) { $disabledFeatures[] = 'project' . ucfirst($feature); } @@ -1000,6 +1000,17 @@ class customModel extends model return $this->dao->select('*')->from(TABLE_PROJECT)->where('model')->eq('waterfall')->andWhere('deleted')->eq('0')->count(); } + /** + * Check for waterfallplus project data. + * + * @access public + * @return int + */ + public function hasWaterfallplusData() + { + return $this->dao->select('*')->from(TABLE_PROJECT)->where('model')->eq('waterfallplus')->andWhere('deleted')->eq('0')->count(); + } + /** * Check for assetlib data. * @@ -1136,8 +1147,9 @@ class customModel extends model $disabledFeatures = $disabledFeatures . ',' . $closedFeatures; $hasWaterfall = strpos(",{$disabledFeatures},", ',waterfall,') === false; + $hasWaterfallPlus = strpos(",{$disabledFeatures},", ',waterfallplus,') === false; $hasScrumMeasrecord = strpos(",{$disabledFeatures},", ',scrumMeasrecord,') === false; - $hasWaterfallMeasrecord = (strpos(",{$disabledFeatures},", ',waterfallMeasrecord,') === false and $hasWaterfall); + $hasWaterfallMeasrecord = (strpos(",{$disabledFeatures},", ',waterfallMeasrecord,') === false and ($hasWaterfall or $hasWaterfallPlus)); $cronStatus = 'normal'; if(!$hasScrumMeasrecord and !$hasWaterfallMeasrecord) $cronStatus = 'stop'; diff --git a/module/custom/view/mode.html.php b/module/custom/view/mode.html.php index 7378168d3a..5376929d50 100644 --- a/module/custom/view/mode.html.php +++ b/module/custom/view/mode.html.php @@ -36,9 +36,9 @@ custom->modeIntroductionList['ALM'];?> - + - lang->custom->scrum->common, implode($lang->comma, $disabledScrumFeatures)) : $this->lang->custom->features[$feature];?> + lang->custom->scrum->common, implode($lang->comma, $disabledScrumFeatures)) : $this->lang->custom->features[$feature];?> @@ -46,9 +46,9 @@ custom->allFeatures as $feature):?> - + - lang->custom->scrum->common, implode($lang->comma, $enabledScrumFeatures)) : $this->lang->custom->features[$feature];?> + lang->custom->scrum->common, implode($lang->comma, $enabledScrumFeatures)) : $this->lang->custom->features[$feature];?> diff --git a/module/design/control.php b/module/design/control.php index fd6babe192..9964b82378 100755 --- a/module/design/control.php +++ b/module/design/control.php @@ -71,6 +71,9 @@ class design extends control { $productID = $this->commonAction($projectID, $productID); + $project = $this->loadModel('project')->getByID($projectID); + $typeList = $project->model == 'waterfall' ? $this->lang->design->typeList : $this->lang->design->plusTypeList; + /* Save session for design list and process product id. */ $this->session->set('designList', $this->app->getURI(true), 'project'); $this->session->set('reviewList', $this->app->getURI(true), 'project'); @@ -80,6 +83,7 @@ class design extends control $productIdList = $productID ? $productID : array_keys($products); $stories = $this->loadModel('story')->getProductStoryPairs($productIdList, 'all', 0, 'active', 'id_desc', 0, 'full', 'story', false); $this->config->design->search['params']['story']['values'] = $stories; + $this->config->design->search['params']['type']['values'] = $typeList; $queryID = ($type == 'bySearch') ? (int)$param : 0; $actionURL = $this->createLink('design', 'browse', "projectID=$projectID&productID=$productID&type=bySearch&queryID=myQueryID"); @@ -120,7 +124,6 @@ class design extends control $pager = pager::init(0, $recPerPage, $pageID); $designs = $this->design->getList($projectID, $productID, $type, $queryID, $orderBy, $pager); - $project = $this->loadModel('project')->getByID($projectID); $this->view->hiddenProduct = $project->hasProduct ? false : true; $this->view->title = $this->lang->design->common . $this->lang->colon . $this->lang->design->browse; @@ -134,6 +137,7 @@ class design extends control $this->view->projectID = $projectID; $this->view->pager = $pager; $this->view->users = $this->loadModel('user')->getPairs('noletter'); + $this->view->typeList = $typeList; $this->display(); } @@ -173,6 +177,8 @@ class design extends control $products = $this->product->getProductPairsByProject($projectID); $productIdList = $productID ? $productID : array_keys($products); + $project = $this->loadModel('project')->getByID($projectID); + $this->view->title = $this->lang->design->common . $this->lang->colon . $this->lang->design->create; $this->view->position[] = $this->lang->design->create; @@ -181,7 +187,7 @@ class design extends control $this->view->productID = $productID; $this->view->projectID = $projectID; $this->view->type = $type; - $this->view->project = $this->loadModel('project')->getByID($projectID); + $this->view->typeList = $project->model == 'waterfall' ? $this->lang->design->typeList : $this->lang->design->plusTypeList; $this->display(); } @@ -220,12 +226,15 @@ class design extends control $products = $this->product->getProductPairsByProject($projectID); $productIdList = $productID ? $productID : array_keys($products); + $project = $this->loadModel('project')->getByID($projectID); + $this->view->title = $this->lang->design->common . $this->lang->colon . $this->lang->design->batchCreate; $this->view->position[] = $this->lang->design->batchCreate; - $this->view->stories = $this->loadModel('story')->getProductStoryPairs($productIdList); - $this->view->users = $this->loadModel('user')->getPairs('noclosed'); - $this->view->type = $type; + $this->view->stories = $this->loadModel('story')->getProductStoryPairs($productIdList); + $this->view->users = $this->loadModel('user')->getPairs('noclosed'); + $this->view->type = $type; + $this->view->typeList = $project->model == 'waterfall' ? $this->lang->design->typeList : $this->lang->design->plusTypeList; $this->display(); } @@ -248,6 +257,8 @@ class design extends control $products = $this->product->getProductPairsByProject($design->project); $productIdList = $design->product ? $design->product : array_keys($products); + $project = $this->loadModel('project')->getByID($design->project); + $this->view->title = $this->lang->design->common . $this->lang->colon . $this->lang->design->view; $this->view->position[] = $this->lang->design->view; @@ -256,7 +267,8 @@ class design extends control $this->view->users = $this->loadModel('user')->getPairs('noletter'); $this->view->actions = $this->loadModel('action')->getList('design', $design->id); $this->view->repos = $this->loadModel('repo')->getRepoPairs('project', $design->project); - $this->view->project = $this->loadModel('project')->getByID($design->project); + $this->view->project = $project; + $this->view->typeList = $project->model == 'waterfall' ? $this->lang->design->typeList : $this->lang->design->plusTypeList; $this->display(); } @@ -300,13 +312,16 @@ class design extends control $products = $this->product->getProductPairsByProject($design->project); $productIdList = $design->product ? $design->product : array_keys($products); + $project = $this->loadModel('project')->getByID($design->project); + $this->view->title = $this->lang->design->common . $this->lang->colon . $this->lang->design->edit; $this->view->position[] = $this->lang->design->edit; $this->view->design = $design; - $this->view->project = $this->loadModel('project')->getByID($design->project); + $this->view->project = $project; $this->view->stories = $this->loadModel('story')->getProductStoryPairs($productIdList); $this->view->users = $this->loadModel('user')->getPairs('noclosed'); + $this->view->typeList = $project->model == 'waterfall' ? $this->lang->design->typeList : $this->lang->design->plusTypeList; $this->display(); } diff --git a/module/design/lang/de.php b/module/design/lang/de.php index ac051992b9..9fe4690a63 100644 --- a/module/design/lang/de.php +++ b/module/design/lang/de.php @@ -65,6 +65,8 @@ $lang->design->typeList['DDS'] = 'Detailed'; $lang->design->typeList['DBDS'] = 'Database'; $lang->design->typeList['ADS'] = 'API'; +$lang->design->plusTypeList = $lang->design->typeList; + $lang->design->rangeList = array(); $lang->design->rangeList['all'] = 'All'; $lang->design->rangeList['assign'] = 'Selected'; diff --git a/module/design/lang/en.php b/module/design/lang/en.php index 9b3d40e66c..166f1458f9 100644 --- a/module/design/lang/en.php +++ b/module/design/lang/en.php @@ -65,6 +65,8 @@ $lang->design->typeList['DDS'] = 'Detailed'; $lang->design->typeList['DBDS'] = 'Database'; $lang->design->typeList['ADS'] = 'API'; +$lang->design->plusTypeList = $lang->design->typeList; + $lang->design->rangeList = array(); $lang->design->rangeList['all'] = 'All'; $lang->design->rangeList['assign'] = 'Selected'; diff --git a/module/design/lang/fr.php b/module/design/lang/fr.php index 91f8e004e5..33a0580b41 100644 --- a/module/design/lang/fr.php +++ b/module/design/lang/fr.php @@ -65,6 +65,8 @@ $lang->design->typeList['DDS'] = 'Detailed'; $lang->design->typeList['DBDS'] = 'Database'; $lang->design->typeList['ADS'] = 'API'; +$lang->design->plusTypeList = $lang->design->typeList; + $lang->design->rangeList = array(); $lang->design->rangeList['all'] = 'All'; $lang->design->rangeList['assign'] = 'Selected'; diff --git a/module/design/lang/zh-cn.php b/module/design/lang/zh-cn.php index f500018190..372ec8dca6 100644 --- a/module/design/lang/zh-cn.php +++ b/module/design/lang/zh-cn.php @@ -65,6 +65,8 @@ $lang->design->typeList['DDS'] = '详细设计'; $lang->design->typeList['DBDS'] = '数据库设计'; $lang->design->typeList['ADS'] = '接口设计'; +$lang->design->plusTypeList = $lang->design->typeList; + $lang->design->rangeList = array(); $lang->design->rangeList['all'] = '全部记录'; $lang->design->rangeList['assign'] = '选中记录'; diff --git a/module/design/model.php b/module/design/model.php index 7384f2755b..caa5d6ca3b 100755 --- a/module/design/model.php +++ b/module/design/model.php @@ -404,11 +404,15 @@ class designModel extends model */ public function setMenu($projectID, $products, $productID = 0) { + $project = $this->loadModel('project')->getByID($projectID); + if(!empty($project) and $project->model == 'waterfall') $typeList = 'typeList'; + if(!empty($project) and $project->model == 'waterfallplus') $typeList = 'plusTypeList'; + /* Show custom design types. */ $this->lang->waterfall->menu->design['subMenu'] = new stdclass(); $this->lang->waterfall->menu->design['subMenu']->all = array('link' => "{$this->lang->all}|design|browse|projectID=%s&productID=0&browseType=all"); $count = 1; - foreach(array_filter($this->lang->design->typeList) as $key => $value) + foreach(array_filter($this->lang->design->{$typeList}) as $key => $value) { $key = strtolower($key); diff --git a/module/design/view/batchcreate.html.php b/module/design/view/batchcreate.html.php index 891f37465f..955682d283 100644 --- a/module/design/view/batchcreate.html.php +++ b/module/design/view/batchcreate.html.php @@ -30,7 +30,7 @@ - design->typeList, '', "class='form-control chosen'");?> + diff --git a/module/design/view/browse.html.php b/module/design/view/browse.html.php index 59d1e8dd20..ca58918162 100644 --- a/module/design/view/browse.html.php +++ b/module/design/view/browse.html.php @@ -48,7 +48,7 @@ id);?> createLink('design', 'view', "id={$design->id}"), $design->name) : $design->name;?> product);?> - design->typeList, $design->type);?> + type);?> design->printAssignedHtml($design, $users);?> createdBy);?> createdDate, 0, 11);?> diff --git a/module/design/view/create.html.php b/module/design/view/create.html.php index 01c69ec63e..38976d0ca5 100755 --- a/module/design/view/create.html.php +++ b/module/design/view/create.html.php @@ -34,7 +34,7 @@ design->type;?> - design->typeList, '', "class='form-control chosen'");?> + diff --git a/module/design/view/edit.html.php b/module/design/view/edit.html.php index 78bb51cfd2..7c39073ec9 100755 --- a/module/design/view/edit.html.php +++ b/module/design/view/edit.html.php @@ -40,7 +40,7 @@ design->type;?> - design->typeList, $design->type, "class='form-control chosen'");?> + type, "class='form-control chosen'");?> diff --git a/module/design/view/view.html.php b/module/design/view/view.html.php index ec45ab0e80..c3b9b45f80 100755 --- a/module/design/view/view.html.php +++ b/module/design/view/view.html.php @@ -66,7 +66,7 @@ - + hasProduct)) echo "class='hide'";?>> diff --git a/module/dev/view/api.html.php b/module/dev/view/api.html.php index 3bdb9b80a8..914b930f84 100644 --- a/module/dev/view/api.html.php +++ b/module/dev/view/api.html.php @@ -9,7 +9,6 @@
disableFeature and in_array($module, $config->disableFeature)) continue; $active = ($module == $selectedModule) ? 'text-primary' : ''; $moduleName = zget($lang->dev->tableList, $module, $module); ?> diff --git a/module/execution/control.php b/module/execution/control.php index d47b66eaa6..23e12a6ecc 100644 --- a/module/execution/control.php +++ b/module/execution/control.php @@ -1862,7 +1862,12 @@ class execution extends control $this->loadModel('product'); $allProducts = $this->product->getProductPairsByProject($projectID, 'noclosed'); - $copyProjects = $this->loadModel('project')->getPairsByProgram(isset($project->parent) ? $project->parent : '', 'noclosed', '', 'order_asc', '', isset($project->model) ? $project->model : '', 'multiple'); + + $projectModel = isset($project->model) ? $project->model : ''; + if($projectModel == 'agileplus') $projectModel = array('scrum', 'agileplus'); + if($projectModel == 'waterfallplus') $projectModel = array('waterfall', 'waterfallplus'); + + $copyProjects = $this->loadModel('project')->getPairsByProgram(isset($project->parent) ? $project->parent : '', 'noclosed', '', 'order_asc', '', $projectModel, 'multiple'); $copyProjectID = ($projectID == 0) ? key($copyProjects) : $projectID; if(!empty($project->hasProduct)) $allProducts = array(0 => '') + $allProducts; diff --git a/module/execution/css/edit.css b/module/execution/css/edit.css index 1331271af3..69e41e254b 100644 --- a/module/execution/css/edit.css +++ b/module/execution/css/edit.css @@ -7,3 +7,5 @@ #dateRange {vertical-align: top; padding-top: 13px;} .form-date {min-width: 90px;} + +.productsBox div[id^='branch'].chosen-disabled {pointer-events: none;} diff --git a/module/execution/js/edit.js b/module/execution/js/edit.js index 78d040216c..5527fd5b0b 100644 --- a/module/execution/js/edit.js +++ b/module/execution/js/edit.js @@ -107,6 +107,11 @@ $(function() }); $(document).on('change', "select[id^='branch']", disableSelectedBranch); + + if($('.disabledBranch').length > 0) + { + $('.disabledBranch div[id^="branch"]').addClass('chosen-disabled'); + } }) var lastProjectID = $("#project").val(); diff --git a/module/execution/lang/de.php b/module/execution/lang/de.php index 9cd8aa1b8c..d6c506033d 100644 --- a/module/execution/lang/de.php +++ b/module/execution/lang/de.php @@ -140,6 +140,7 @@ $lang->execution->myTask = "My Task"; $lang->execution->list = "{$lang->executionCommon} List"; $lang->execution->allProject = 'All'; $lang->execution->method = 'Method'; +$lang->execution->sameAsParent = "Same as parent"; /* Fields of zt_team. */ $lang->execution->root = 'Root'; diff --git a/module/execution/lang/en.php b/module/execution/lang/en.php index 5331ed2369..995e4f9d53 100644 --- a/module/execution/lang/en.php +++ b/module/execution/lang/en.php @@ -140,6 +140,7 @@ $lang->execution->myTask = "My Task"; $lang->execution->list = 'List'; $lang->execution->allProject = 'All'; $lang->execution->method = 'Method'; +$lang->execution->sameAsParent = "Same as parent"; /* Fields of zt_team. */ $lang->execution->root = 'Root'; diff --git a/module/execution/lang/fr.php b/module/execution/lang/fr.php index 41520d6e0d..ac5351d360 100644 --- a/module/execution/lang/fr.php +++ b/module/execution/lang/fr.php @@ -140,6 +140,7 @@ $lang->execution->myTask = "My Task"; $lang->execution->list = "{$lang->executionCommon} List"; $lang->execution->allProject = 'Tous'; $lang->execution->method = 'Method'; +$lang->execution->sameAsParent = "Same as parent"; /* Fields of zt_team. */ $lang->execution->root = 'Root'; diff --git a/module/execution/lang/zh-cn.php b/module/execution/lang/zh-cn.php index bfb7610028..a83b65dc25 100644 --- a/module/execution/lang/zh-cn.php +++ b/module/execution/lang/zh-cn.php @@ -140,6 +140,7 @@ $lang->execution->myTask = "我的任务"; $lang->execution->list = '列表'; $lang->execution->allProject = '全部项目'; $lang->execution->method = '方法'; +$lang->execution->sameAsParent = "同父阶段"; /* Fields of zt_team. */ $lang->execution->root = '源ID'; diff --git a/module/execution/view/edit.html.php b/module/execution/view/edit.html.php index 299f88e233..6ade126e6e 100644 --- a/module/execution/view/edit.html.php +++ b/module/execution/view/edit.html.php @@ -243,23 +243,43 @@ type == 'stage' and !in_array($execution->attribute, array('request', 'design', 'review'))) or $execution->type != 'stage'): ?> + + - - + + + diff --git a/module/group/lang/resource.php b/module/group/lang/resource.php index ac6c5c578b..3e3614f5b5 100644 --- a/module/group/lang/resource.php +++ b/module/group/lang/resource.php @@ -399,6 +399,7 @@ $lang->resource->stage->batchCreate = 'batchCreate'; $lang->resource->stage->edit = 'edit'; $lang->resource->stage->setType = 'setType'; $lang->resource->stage->delete = 'delete'; +$lang->resource->stage->plusBrowse = 'plusBrowse'; $lang->stage->methodOrder[5] = 'browse'; $lang->stage->methodOrder[10] = 'create'; @@ -406,6 +407,7 @@ $lang->stage->methodOrder[15] = 'batchCreate'; $lang->stage->methodOrder[20] = 'edit'; $lang->stage->methodOrder[25] = 'setType'; $lang->stage->methodOrder[30] = 'delete'; +$lang->stage->methodOrder[35] = 'plusBrowse'; /* Program. */ $lang->resource->program = new stdclass(); @@ -2017,15 +2019,15 @@ if(!$inUpgrade) unset($lang->resource->program); unset($lang->resource->project->programTitle); } - if(!helper::hasFeature('waterfall')) + if(!helper::hasFeature('waterfall') and !helper::hasFeature('waterfallplus')) { unset($lang->resource->design); unset($lang->resource->programplan); unset($lang->resource->stage); } - if(!helper::hasFeature('product_track')) unset($lang->resource->product->track); - if(!helper::hasFeature('product_roadmap')) unset($lang->resource->product->roadmap); - if(!helper::hasFeature('waterfall_track')) unset($lang->resource->projectstory->track); + if(!helper::hasFeature('product_track')) unset($lang->resource->product->track); + if(!helper::hasFeature('product_roadmap')) unset($lang->resource->product->roadmap); + if(!helper::hasFeature('waterfall_track') and !helper::hasFeature('waterfallplus_track')) unset($lang->resource->projectstory->track); if(!helper::hasFeature('devops')) { unset($lang->resource->repo); diff --git a/module/kanban/view/importrelease.html.php b/module/kanban/view/importrelease.html.php index 70faa64f91..12ad5517d9 100644 --- a/module/kanban/view/importrelease.html.php +++ b/module/kanban/view/importrelease.html.php @@ -51,7 +51,7 @@ - builds)) ? 1 : count($release->builds);?> + builds) ? 1 : count($release->builds);?>
design->type;?>design->typeList, $design->type);?>type);?>
design->product;?>
execution->manageProducts;?> -
- - $product):?> - branches as $branchID):?> - -
- " . $product->name . $branchName;?> +
project->manageProductPlan;?> +
+
+
+
+ type != 'normal' and isset($branchGroups[$product->id]);?> +
'> + product->common;?> + type == 'stage' ? "disabled='disabled'" : '';?> + id, "class='form-control chosen' $disabled onchange='loadBranches(this)' data-last='" . $product->id . "' data-type='" . $product->type . "'");?> + type == 'stage' and !$project->division) echo html::hidden("products[$i]", $product->id);?> +
+
+
'> +
+ project->branch;?> + branches) ? join(',', $product->branches) : '';?> + id]) ? $branchGroups[$product->id] : array(), $branchIdList, "class='form-control chosen' multiple onchange=\"loadPlans('#products{$i}', this)\"");?> +
+
+
+
+
+
> + product->plan;?> + id][]", isset($productPlans[$product->id]) ? $productPlans[$product->id] : array(), isset($product->plans) ? $product->plans : '', "class='form-control chosen' multiple");?> +
- - -
diff --git a/module/mail/lang/de.php b/module/mail/lang/de.php index d52845f176..572e19a838 100644 --- a/module/mail/lang/de.php +++ b/module/mail/lang/de.php @@ -1,5 +1,4 @@ mail->common = 'Email Einstellungen'; $lang->mail->index = 'Home'; $lang->mail->detect = 'Testen'; $lang->mail->detectAction = 'Detect By Email Address'; diff --git a/module/mail/lang/en.php b/module/mail/lang/en.php index 8c363ee2e3..657c5e8fec 100755 --- a/module/mail/lang/en.php +++ b/module/mail/lang/en.php @@ -1,5 +1,4 @@ mail->common = 'Email Settings'; $lang->mail->index = 'Email Home'; $lang->mail->detect = 'Detect'; $lang->mail->detectAction = 'Detect By Email Address'; diff --git a/module/mail/lang/fr.php b/module/mail/lang/fr.php index 8c363ee2e3..657c5e8fec 100644 --- a/module/mail/lang/fr.php +++ b/module/mail/lang/fr.php @@ -1,5 +1,4 @@ mail->common = 'Email Settings'; $lang->mail->index = 'Email Home'; $lang->mail->detect = 'Detect'; $lang->mail->detectAction = 'Detect By Email Address'; diff --git a/module/mail/lang/zh-cn.php b/module/mail/lang/zh-cn.php index f90a6bf78b..5aa4390587 100755 --- a/module/mail/lang/zh-cn.php +++ b/module/mail/lang/zh-cn.php @@ -1,5 +1,4 @@ mail->common = '发信配置'; $lang->mail->index = '首页'; $lang->mail->detect = '检测'; $lang->mail->detectAction = '通过邮箱地址检测'; diff --git a/module/my/lang/de.php b/module/my/lang/de.php index b508fa00cc..1d9f272c19 100644 --- a/module/my/lang/de.php +++ b/module/my/lang/de.php @@ -99,7 +99,7 @@ $lang->my->auditMenu->audit = new stdclass(); $lang->my->auditMenu->audit->all = 'All'; $lang->my->auditMenu->audit->story = 'Story'; $lang->my->auditMenu->audit->testcase = 'Case'; -if($config->edition == 'max' and helper::hasFeature('waterfall')) $lang->my->auditMenu->audit->project = 'Project'; +if($config->edition == 'max' and (helper::hasFeature('waterfall') or helper::hasFeature('waterfallplus'))) $lang->my->auditMenu->audit->project = $lang->projectCommon; if($config->edition != 'open') $lang->my->auditMenu->audit->feedback = 'Feedback'; if($config->edition != 'open' and helper::hasFeature('OA')) $lang->my->auditMenu->audit->oa = 'OA'; diff --git a/module/my/lang/en.php b/module/my/lang/en.php index b508fa00cc..1d9f272c19 100644 --- a/module/my/lang/en.php +++ b/module/my/lang/en.php @@ -99,7 +99,7 @@ $lang->my->auditMenu->audit = new stdclass(); $lang->my->auditMenu->audit->all = 'All'; $lang->my->auditMenu->audit->story = 'Story'; $lang->my->auditMenu->audit->testcase = 'Case'; -if($config->edition == 'max' and helper::hasFeature('waterfall')) $lang->my->auditMenu->audit->project = 'Project'; +if($config->edition == 'max' and (helper::hasFeature('waterfall') or helper::hasFeature('waterfallplus'))) $lang->my->auditMenu->audit->project = $lang->projectCommon; if($config->edition != 'open') $lang->my->auditMenu->audit->feedback = 'Feedback'; if($config->edition != 'open' and helper::hasFeature('OA')) $lang->my->auditMenu->audit->oa = 'OA'; diff --git a/module/my/lang/fr.php b/module/my/lang/fr.php index b508fa00cc..1d9f272c19 100644 --- a/module/my/lang/fr.php +++ b/module/my/lang/fr.php @@ -99,7 +99,7 @@ $lang->my->auditMenu->audit = new stdclass(); $lang->my->auditMenu->audit->all = 'All'; $lang->my->auditMenu->audit->story = 'Story'; $lang->my->auditMenu->audit->testcase = 'Case'; -if($config->edition == 'max' and helper::hasFeature('waterfall')) $lang->my->auditMenu->audit->project = 'Project'; +if($config->edition == 'max' and (helper::hasFeature('waterfall') or helper::hasFeature('waterfallplus'))) $lang->my->auditMenu->audit->project = $lang->projectCommon; if($config->edition != 'open') $lang->my->auditMenu->audit->feedback = 'Feedback'; if($config->edition != 'open' and helper::hasFeature('OA')) $lang->my->auditMenu->audit->oa = 'OA'; diff --git a/module/my/lang/zh-cn.php b/module/my/lang/zh-cn.php index 545768b7ea..b6e0038cf1 100644 --- a/module/my/lang/zh-cn.php +++ b/module/my/lang/zh-cn.php @@ -99,7 +99,7 @@ $lang->my->auditMenu->audit = new stdclass(); $lang->my->auditMenu->audit->all = '所有'; $lang->my->auditMenu->audit->story = '需求'; $lang->my->auditMenu->audit->testcase = '用例'; -if($config->edition == 'max' and helper::hasFeature('waterfall')) $lang->my->auditMenu->audit->project = '项目'; +if($config->edition == 'max' and (helper::hasFeature('waterfall') or helper::hasFeature('waterfallplus'))) $lang->my->auditMenu->audit->project = $lang->projectCommon; if($config->edition != 'open') $lang->my->auditMenu->audit->feedback = '反馈'; if($config->edition != 'open' and helper::hasFeature('OA')) $lang->my->auditMenu->audit->oa = '办公'; diff --git a/module/programplan/control.php b/module/programplan/control.php index 7a7783561f..ccf3baa0a5 100644 --- a/module/programplan/control.php +++ b/module/programplan/control.php @@ -211,7 +211,7 @@ class programplan extends control $this->view->productList = $productList; $this->view->project = $project; $this->view->productID = $productID ? $productID : key($productList); - $this->view->stages = empty($planID) ? $this->loadModel('stage')->getStages('id_asc') : array(); + $this->view->stages = empty($planID) ? $this->loadModel('stage')->getStages('id_asc', 0, $project->model) : array(); $this->view->programPlan = $programPlan; $this->view->plans = empty($executions) ? $plans : $executions; $this->view->planID = $planID; diff --git a/module/programplan/lang/de.php b/module/programplan/lang/de.php index 7b1a58d0cf..5068fce91a 100644 --- a/module/programplan/lang/de.php +++ b/module/programplan/lang/de.php @@ -110,7 +110,7 @@ $lang->programplan->ganttCustom['delayDays'] = 'Delay days'; $lang->programplan->error = new stdclass(); $lang->programplan->error->percentNumber = '"Workload %" must be digits.'; $lang->programplan->error->planFinishSmall = 'The "End" date must be > the "Begin" date.'; -$lang->programplan->error->percentOver = 'The sum of "Workload %" cannot exceed 100%.'; +$lang->programplan->error->percentOver = 'The sum of "Workload %" cannot exceed 100% of one stage.'; $lang->programplan->error->createdTask = 'The task has been decomposed. Sub phases cannot be added.'; $lang->programplan->error->parentWorkload = 'The sum of the workload of the child phase cannot be greater than that of the parent phase: %s.'; $lang->programplan->error->parentDuration = 'The planned start and planned completion of the child phase cannot exceed the parent phase.'; @@ -119,6 +119,7 @@ $lang->programplan->error->sameCode = 'Stage code cannot be the same!'; $lang->programplan->error->taskDrag = 'The %s task cannot be dragged'; $lang->programplan->error->planDrag = 'The %s stage cannot be dragged'; $lang->programplan->error->notStage = $lang->executionCommon . '/Kanban cannot create a sub stage.'; +$lang->programplan->error->sameType = 'Type of the stage must be as same as parent: "%s"'; $lang->programplan->ganttBrowseType['gantt'] = 'Group by Stage'; $lang->programplan->ganttBrowseType['assignedTo'] = 'Group by AssignedTo'; diff --git a/module/programplan/lang/en.php b/module/programplan/lang/en.php index 6d25da9d4c..689cfeb296 100644 --- a/module/programplan/lang/en.php +++ b/module/programplan/lang/en.php @@ -110,7 +110,7 @@ $lang->programplan->ganttCustom['delayDays'] = 'Delay days'; $lang->programplan->error = new stdclass(); $lang->programplan->error->percentNumber = '"Workload %" must be digits.'; $lang->programplan->error->planFinishSmall = 'The "End" date must be > the "Begin" date.'; -$lang->programplan->error->percentOver = 'The sum of "Workload %" cannot exceed 100%.'; +$lang->programplan->error->percentOver = 'The sum of "Workload %" cannot exceed 100% of one stage.'; $lang->programplan->error->createdTask = 'The task is decomposed. Sub stages cannot be added.'; $lang->programplan->error->parentWorkload = 'The sum of the workload in the sub stage cannot be > that in the parent stage: %s.'; $lang->programplan->error->parentDuration = 'The planned start and planned completion of the child phase cannot exceed the parent phase.'; @@ -119,6 +119,7 @@ $lang->programplan->error->sameCode = 'Stage code cannot be the same!'; $lang->programplan->error->taskDrag = 'The %s task cannot be dragged'; $lang->programplan->error->planDrag = 'The %s stage cannot be dragged'; $lang->programplan->error->notStage = $lang->executionCommon . '/Kanban cannot create a sub stage.'; +$lang->programplan->error->sameType = 'Type of the stage must be as same as parent: "%s"'; $lang->programplan->ganttBrowseType['gantt'] = 'Group by Stage'; $lang->programplan->ganttBrowseType['assignedTo'] = 'Group by AssignedTo'; diff --git a/module/programplan/lang/fr.php b/module/programplan/lang/fr.php index 7b1a58d0cf..5068fce91a 100644 --- a/module/programplan/lang/fr.php +++ b/module/programplan/lang/fr.php @@ -110,7 +110,7 @@ $lang->programplan->ganttCustom['delayDays'] = 'Delay days'; $lang->programplan->error = new stdclass(); $lang->programplan->error->percentNumber = '"Workload %" must be digits.'; $lang->programplan->error->planFinishSmall = 'The "End" date must be > the "Begin" date.'; -$lang->programplan->error->percentOver = 'The sum of "Workload %" cannot exceed 100%.'; +$lang->programplan->error->percentOver = 'The sum of "Workload %" cannot exceed 100% of one stage.'; $lang->programplan->error->createdTask = 'The task has been decomposed. Sub phases cannot be added.'; $lang->programplan->error->parentWorkload = 'The sum of the workload of the child phase cannot be greater than that of the parent phase: %s.'; $lang->programplan->error->parentDuration = 'The planned start and planned completion of the child phase cannot exceed the parent phase.'; @@ -119,6 +119,7 @@ $lang->programplan->error->sameCode = 'Stage code cannot be the same!'; $lang->programplan->error->taskDrag = 'The %s task cannot be dragged'; $lang->programplan->error->planDrag = 'The %s stage cannot be dragged'; $lang->programplan->error->notStage = $lang->executionCommon . '/Kanban cannot create a sub stage.'; +$lang->programplan->error->sameType = 'Type of the stage must be as same as parent: "%s"'; $lang->programplan->ganttBrowseType['gantt'] = 'Group by Stage'; $lang->programplan->ganttBrowseType['assignedTo'] = 'Group by AssignedTo'; diff --git a/module/programplan/lang/vi.php b/module/programplan/lang/vi.php index da516686a2..0a5cb7e8cb 100644 --- a/module/programplan/lang/vi.php +++ b/module/programplan/lang/vi.php @@ -68,6 +68,7 @@ $lang->programplan->stageCustom->task = 'Show Task'; $lang->programplan->error = new stdclass(); $lang->programplan->error->percentNumber = '"Workload %" must be digits.'; $lang->programplan->error->planFinishSmall = 'The "End" date must be > the "Begin" date.'; -$lang->programplan->error->percentOver = 'The sum of "Workload %" cannot exceed 100%.'; +$lang->programplan->error->percentOver = 'The sum of "Workload %" cannot exceed 100% of one stage.'; $lang->programplan->error->createdTask = 'The task has been decomposed. Sub phases cannot be added.'; $lang->programplan->error->parentWorkload = 'The sum of the workload of the child phase cannot be greater than that of the parent phase: %s.'; +$lang->programplan->error->sameType = 'Type of the stage must be as same as parent: "%s"'; diff --git a/module/programplan/lang/zh-cn.php b/module/programplan/lang/zh-cn.php index eb55d08810..fcf4a5d0d6 100644 --- a/module/programplan/lang/zh-cn.php +++ b/module/programplan/lang/zh-cn.php @@ -110,7 +110,7 @@ $lang->programplan->ganttCustom['delayDays'] = '延期天数'; $lang->programplan->error = new stdclass(); $lang->programplan->error->percentNumber = '"工作量占比"必须为数字'; $lang->programplan->error->planFinishSmall = '"计划完成时间"必须大于"计划开始时间"'; -$lang->programplan->error->percentOver = '工作量占比累计不应当超过100%'; +$lang->programplan->error->percentOver = '相同父阶段的子阶段工作量占比之和不超过100%'; $lang->programplan->error->createdTask = '已分解任务,不可添加子阶段'; $lang->programplan->error->parentWorkload = '子阶段的工作量之和不能大于父阶段的工作量:%s'; $lang->programplan->error->parentDuration = '子阶段计划开始、计划完成不能超过父阶段'; @@ -119,6 +119,7 @@ $lang->programplan->error->sameCode = '阶段代号不能相同!'; $lang->programplan->error->taskDrag = '%s的任务不可以拖动'; $lang->programplan->error->planDrag = '%s的阶段不可以拖动'; $lang->programplan->error->notStage = $lang->executionCommon . '/看板不支持创建子阶段'; +$lang->programplan->error->sameType = '父阶段类型为"%s",阶段类型需与父阶段一致'; $lang->programplan->ganttBrowseType['gantt'] = '按阶段分组'; $lang->programplan->ganttBrowseType['assignedTo'] = '按指派给分组'; diff --git a/module/project/control.php b/module/project/control.php index 617d7b6cd6..c6d9d53c0a 100755 --- a/module/project/control.php +++ b/module/project/control.php @@ -167,10 +167,16 @@ class project extends control public function ajaxGetCopyProjects() { $data = fixer::input('post')->get(); + + $model = $data->model; + if($data->model == 'agileplus') $model = array('scrum', 'agileplus'); + if($data->model == 'waterfallplus') $model = array('waterfall', 'waterfallplus'); + $projectPairs = $this->dao->select('id, name')->from(TABLE_PROJECT) ->where('type')->eq('project') ->andWhere('deleted')->eq(0) ->andWhere('vision')->eq($this->config->vision) + ->andWhere('model')->in($model) ->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->projects)->fi() ->beginIF(trim($data->name))->andWhere('name')->like("%$data->name%")->fi() ->fetchPairs(); @@ -545,14 +551,14 @@ class project extends control } } + $extra = str_replace(array(',', ' '), array('&', ''), $extra); + parse_str($extra, $output); + if($this->app->tab == 'program' and $programID) $this->loadModel('program')->setMenu($programID); if($this->app->tab == 'product' and !empty($output['productID'])) $this->loadModel('product')->setMenu($output['productID']); if($this->app->tab == 'doc') unset($this->lang->doc->menu->project['subMenu']); $this->session->set('projectModel', $model); - $extra = str_replace(array(',', ' '), array('&', ''), $extra); - parse_str($extra, $output); - $name = ''; $code = ''; $team = ''; diff --git a/module/project/lang/de.php b/module/project/lang/de.php index dfd375a94d..91198d2690 100644 --- a/module/project/lang/de.php +++ b/module/project/lang/de.php @@ -272,7 +272,7 @@ $lang->project->modelList['scrum'] = "Scrum"; if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfall'] = "CMMI"; $lang->project->modelList['kanban'] = "Kanban"; $lang->project->modelList['agileplus'] = "Agile +"; -if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfallplus'] = "Waterfall +"; +if(helper::hasFeature('waterfallplus')) $lang->project->modelList['waterfallplus'] = "Waterfall +"; $lang->project->featureBar['browse']['all'] = 'All'; $lang->project->featureBar['browse']['undone'] = 'Unfinished'; diff --git a/module/project/lang/en.php b/module/project/lang/en.php index d25999685f..5092070e59 100644 --- a/module/project/lang/en.php +++ b/module/project/lang/en.php @@ -272,7 +272,7 @@ $lang->project->modelList['scrum'] = "Scrum"; if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfall'] = "CMMI"; $lang->project->modelList['kanban'] = "Kanban"; $lang->project->modelList['agileplus'] = "Agile +"; -if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfallplus'] = "Waterfall +"; +if(helper::hasFeature('waterfallplus')) $lang->project->modelList['waterfallplus'] = "Waterfall +"; $lang->project->featureBar['browse']['all'] = 'All'; $lang->project->featureBar['browse']['undone'] = 'Unfinished'; diff --git a/module/project/lang/fr.php b/module/project/lang/fr.php index 5e82bde244..73c3749268 100644 --- a/module/project/lang/fr.php +++ b/module/project/lang/fr.php @@ -272,7 +272,7 @@ $lang->project->modelList['scrum'] = "Scrum"; if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfall'] = "CMMI"; $lang->project->modelList['kanban'] = "Kanban"; $lang->project->modelList['agileplus'] = "Agile +"; -if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfallplus'] = "Waterfall +"; +if(helper::hasFeature('waterfallplus')) $lang->project->modelList['waterfallplus'] = "Waterfall +"; $lang->project->featureBar['browse']['all'] = 'All'; $lang->project->featureBar['browse']['undone'] = 'Non Terminées'; diff --git a/module/project/lang/zh-cn.php b/module/project/lang/zh-cn.php index be8f261079..6721e62b8c 100644 --- a/module/project/lang/zh-cn.php +++ b/module/project/lang/zh-cn.php @@ -272,7 +272,7 @@ $lang->project->modelList['scrum'] = "Scrum"; if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfall'] = "瀑布"; $lang->project->modelList['kanban'] = "看板"; $lang->project->modelList['agileplus'] = "融合敏捷"; -if(helper::hasFeature('waterfall')) $lang->project->modelList['waterfallplus'] = "融合瀑布"; +if(helper::hasFeature('waterfallplus')) $lang->project->modelList['waterfallplus'] = "融合瀑布"; $lang->project->featureBar['browse']['all'] = '全部'; $lang->project->featureBar['browse']['undone'] = '未完成'; diff --git a/module/project/model.php b/module/project/model.php index 10892907d5..cd23ccc3d0 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -818,13 +818,13 @@ class projectModel extends model /** * Get project pairs by programID. * - * @param int $programID - * @param status $status all|wait|doing|suspended|closed|noclosed - * @param bool $isQueryAll - * @param string $orderBy - * @param string $excludedModel - * @param string $model - * @param string $param multiple|product + * @param int $programID + * @param status $status all|wait|doing|suspended|closed|noclosed + * @param bool $isQueryAll + * @param string $orderBy + * @param string $excludedModel + * @param string|array $model + * @param string $param multiple|product * @access public * @return object */ @@ -839,7 +839,7 @@ class projectModel extends model ->beginIF($programID === 0)->andWhere('parent')->eq(0)->fi() ->beginIF($status != 'all' and $status != 'noclosed')->andWhere('status')->eq($status)->fi() ->beginIF($excludedModel)->andWhere('model')->ne($excludedModel)->fi() - ->beginIF($model)->andWhere('model')->eq($model)->fi() + ->beginIF($model)->andWhere('model')->in($model)->fi() ->beginIF(strpos($param, 'multiple') !== false)->andWhere('multiple')->eq(1)->fi() ->beginIF(strpos($param, 'product') !== false)->andWhere('hasProduct')->eq(1)->fi() ->beginIF($status == 'noclosed')->andWhere('status')->ne('closed')->fi() diff --git a/module/project/view/ajaxgetdropmenu.html.php b/module/project/view/ajaxgetdropmenu.html.php index 6c51b4d224..b21bb7acc5 100644 --- a/module/project/view/ajaxgetdropmenu.html.php +++ b/module/project/view/ajaxgetdropmenu.html.php @@ -80,19 +80,19 @@ foreach($projects as $programID => $programProjects) { $link = $indexLink; } - elseif($project->model == 'scrum' and + elseif((in_array($project->model, array('scrum', 'agileplus'))) and ( - (in_array($module, array('issue', 'risk', 'meeting')) and !helper::hasFeature("scrum_{$module}")) or - ($module == 'report' and $method == 'projectsummary' and !helper::hasFeature("scrum_measrecord")) + (in_array($module, array('issue', 'risk', 'meeting')) and !helper::hasFeature("{$project->model}_{$module}")) or + ($module == 'report' and $method == 'projectsummary' and !helper::hasFeature("{$project->model}_measrecord")) )) { $link = $indexLink; } - elseif($project->model == 'waterfall' and + elseif(in_array($project->model, array('waterfall', 'waterfallplus')) and ( - (in_array($module, array('issue', 'risk', 'opportunity', 'measrecord', 'auditplan', 'meeting')) and !helper::hasFeature("waterfall_{$module}")) or - ($module == 'pssp' and !helper::hasFeature("waterfall_process")) or - ($module == 'report' and $method == 'projectsummary' and !helper::hasFeature("scrum_measrecord")) + (in_array($module, array('issue', 'risk', 'opportunity', 'measrecord', 'auditplan', 'meeting')) and !helper::hasFeature("{$project->model}_{$module}")) or + ($module == 'pssp' and !helper::hasFeature("{$project->model}_process")) or + ($module == 'report' and $method == 'projectsummary' and !helper::hasFeature("{$project->model}_measrecord")) )) { $link = $indexLink; diff --git a/module/project/view/createguide.html.php b/module/project/view/createguide.html.php index 14a5710c35..83a4e2912a 100644 --- a/module/project/view/createguide.html.php +++ b/module/project/view/createguide.html.php @@ -29,7 +29,9 @@ tab; if($tab == 'product') $tab = 'project'; - $hasWaterfall = helper::hasFeature('waterfall'); + + $hasWaterfall = helper::hasFeature('waterfall'); + $hasWaterfallPlus = helper::hasFeature('waterfallplus'); ?>
createLink("project", "create", "model=scrum&programID=$programID©ProjectID=0&extra=productID=$productID,branchID=$branchID"), "", '', "data-app='{$tab}' class='createButton'")?> @@ -60,7 +62,7 @@

project->agileplusTitle;?>

- +
createLink("project", "create", "model=waterfallplus&programID=$programID©ProjectID=0&extra=productID=$productID,branchID=$branchID"), "", '', "data-app='{$tab}' class='createButton'")?> diff --git a/module/stage/control.php b/module/stage/control.php index 1012136791..fe00fe1b34 100644 --- a/module/stage/control.php +++ b/module/stage/control.php @@ -15,13 +15,19 @@ class stage extends control * Browse stages. * * @param string $orderBy + * @param string $type * @access public * @return void */ - public function browse($orderBy = "id_asc") + public function browse($orderBy = "id_asc", $type = 'waterfall') { - $this->view->stages = $this->stage->getStages($orderBy); + if($type == 'waterfallplus') $this->locate($this->createLink('stage', 'plusBrowse', "orderBy=$orderBy&type=waterfallplus")); + + $this->stage->setMenu($type); + + $this->view->stages = $this->stage->getStages($orderBy, 0, $type); $this->view->orderBy = $orderBy; + $this->view->type = $type; $this->view->title = $this->lang->stage->common . $this->lang->colon . $this->lang->stage->browse; $this->view->position[] = $this->lang->stage->common; $this->view->position[] = $this->lang->stage->browse; @@ -30,16 +36,41 @@ class stage extends control } /** - * Create a stage. + * Browse stages. * + * @param string $orderBy * @access public * @return void */ - public function create() + public function plusBrowse($orderBy = "id_asc", $type = 'waterfallplus') { + if($type == 'waterfall') $this->locate($this->createLink('stage', 'browse', "orderBy=$orderBy&type=waterfall")); + + $this->stage->setMenu($type); + + $this->view->stages = $this->stage->getStages($orderBy, 0, $type); + $this->view->orderBy = $orderBy; + $this->view->type = $type; + $this->view->title = $this->lang->stage->common . $this->lang->colon . $this->lang->stage->browse; + $this->view->position[] = $this->lang->stage->common; + $this->view->position[] = $this->lang->stage->browse; + + $this->display('stage', 'browse'); + } + + /** + * Create a stage. + * + * @param string $type + * @access public + * @return void + */ + public function create($type = 'waterfall') + { + $this->stage->setMenu($type); if($_POST) { - $stageID = $this->stage->create(); + $stageID = $this->stage->create($type); if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); $response['result'] = 'success'; @@ -52,7 +83,7 @@ class stage extends control } $this->loadModel('action')->create('stage', $stageID, 'Opened'); - $response['locate'] = inlink('browse'); + $response['locate'] = inlink($type == 'waterfall' ? 'browse' : 'plusBrowse', "orderBy=id_asc&type=$type"); return $this->send($response); } @@ -66,14 +97,16 @@ class stage extends control /** * Batch create stages. * + * @param string $type * @access public * @return void */ - public function batchCreate() + public function batchCreate($type = 'waterfall') { + $this->stage->setMenu($type); if($_POST) { - $this->stage->batchCreate(); + $this->stage->batchCreate($type); $response['result'] = 'success'; $response['message'] = $this->lang->saveSuccess; @@ -84,7 +117,7 @@ class stage extends control return $this->send($response); } - $response['locate'] = inlink('browse'); + $response['locate'] = inlink($type == 'waterfall' ? 'browse' : 'plusBrowse', "orderBy=id_asc&type=$type"); return $this->send($response); } @@ -105,6 +138,7 @@ class stage extends control public function edit($stageID = 0) { $stage = $this->stage->getByID($stageID); + $this->stage->setMenu($stage->projectType); if($_POST) { $changes = $this->stage->update($stageID); @@ -120,7 +154,7 @@ class stage extends control $actionID = $this->loadModel('action')->create('stage', $stageID, 'Edited'); if(!empty($changes)) $this->action->logHistory($actionID, $changes); - $response['locate'] = inlink('browse'); + $response['locate'] = inlink($type == 'waterfall' ? 'browse' : 'plusBrowse', "orderBy=id_asc&type=$stage->projectType"); return $this->send($response); } diff --git a/module/stage/lang/de.php b/module/stage/lang/de.php index e2f736148b..7af6a877ca 100644 --- a/module/stage/lang/de.php +++ b/module/stage/lang/de.php @@ -10,12 +10,13 @@ * @link http://www.zentao.net */ /* Actions. */ -$lang->stage->browse = 'Stage List'; +$lang->stage->browse = 'Waterfall Stage List'; $lang->stage->create = 'Create Stage'; $lang->stage->batchCreate = 'Batch Create'; $lang->stage->edit = 'Edit'; $lang->stage->delete = 'Delete'; $lang->stage->view = 'Details'; +$lang->stage->plusBrowse = 'Waterfall Plus Stage List'; /* Fields. */ $lang->stage->id = 'ID'; diff --git a/module/stage/lang/en.php b/module/stage/lang/en.php index e2f736148b..7af6a877ca 100644 --- a/module/stage/lang/en.php +++ b/module/stage/lang/en.php @@ -10,12 +10,13 @@ * @link http://www.zentao.net */ /* Actions. */ -$lang->stage->browse = 'Stage List'; +$lang->stage->browse = 'Waterfall Stage List'; $lang->stage->create = 'Create Stage'; $lang->stage->batchCreate = 'Batch Create'; $lang->stage->edit = 'Edit'; $lang->stage->delete = 'Delete'; $lang->stage->view = 'Details'; +$lang->stage->plusBrowse = 'Waterfall Plus Stage List'; /* Fields. */ $lang->stage->id = 'ID'; diff --git a/module/stage/lang/fr.php b/module/stage/lang/fr.php index e2f736148b..7af6a877ca 100644 --- a/module/stage/lang/fr.php +++ b/module/stage/lang/fr.php @@ -10,12 +10,13 @@ * @link http://www.zentao.net */ /* Actions. */ -$lang->stage->browse = 'Stage List'; +$lang->stage->browse = 'Waterfall Stage List'; $lang->stage->create = 'Create Stage'; $lang->stage->batchCreate = 'Batch Create'; $lang->stage->edit = 'Edit'; $lang->stage->delete = 'Delete'; $lang->stage->view = 'Details'; +$lang->stage->plusBrowse = 'Waterfall Plus Stage List'; /* Fields. */ $lang->stage->id = 'ID'; diff --git a/module/stage/lang/zh-cn.php b/module/stage/lang/zh-cn.php index 8016239070..74db4344db 100644 --- a/module/stage/lang/zh-cn.php +++ b/module/stage/lang/zh-cn.php @@ -10,12 +10,13 @@ * @link http://www.zentao.net */ /* Actions. */ -$lang->stage->browse = '阶段列表'; +$lang->stage->browse = '瀑布阶段列表'; $lang->stage->create = '新建'; $lang->stage->batchCreate = '批量新建'; $lang->stage->edit = '编辑'; $lang->stage->delete = '删除'; $lang->stage->view = '阶段详情'; +$lang->stage->plusBrowse = '融合瀑布阶段列表'; /* Fields. */ $lang->stage->id = '编号'; diff --git a/module/stage/model.php b/module/stage/model.php index b4e616d0fe..78e1ce28c6 100644 --- a/module/stage/model.php +++ b/module/stage/model.php @@ -19,14 +19,15 @@ class stageModel extends model * @access public * @return int|bool */ - public function create() + public function create($type = 'waterfall') { $stage = fixer::input('post') + ->setDefault('projectType', $type) ->add('createdBy', $this->app->user->account) ->add('createdDate', helper::today()) ->get(); - $totalPercent = $this->getTotalPercent(); + $totalPercent = $this->getTotalPercent($type); if(!is_numeric($stage->percent)) return dao::$errors['message'][] = $this->lang->stage->error->notNum; if(round($totalPercent + $stage->percent) > 100) return dao::$errors['message'][] = $this->lang->stage->error->percentOver; @@ -48,11 +49,11 @@ class stageModel extends model * @access public * @return bool */ - public function batchCreate() + public function batchCreate($type = 'waterfall') { $data = fixer::input('post')->get(); - $totalPercent = $this->getTotalPercent(); + $totalPercent = $this->getTotalPercent($type); if(round($totalPercent + array_sum($data->percent)) > 100) return dao::$errors['message'][] = $this->lang->stage->error->percentOver; @@ -65,6 +66,7 @@ class stageModel extends model $stage->name = $name; $stage->percent = $data->percent[$i]; $stage->type = $data->type[$i]; + $stage->projectType = $type; $stage->createdBy = $this->app->user->account; $stage->createdDate = helper::today(); @@ -98,7 +100,7 @@ class stageModel extends model ->add('editedDate', helper::today()) ->get(); - $totalPercent = $this->getTotalPercent(); + $totalPercent = $this->getTotalPercent($oldStage->projectType); if(round($totalPercent + $stage->percent - $oldStage->percent) > 100) return dao::$errors['message'][] = $this->lang->stage->error->percentOver; @@ -118,10 +120,11 @@ class stageModel extends model * * @param string $orderBy * @param int $projectID + * @param string $type * @access public * @return array */ - public function getStages($orderBy = 'id_desc', $projectID = 0) + public function getStages($orderBy = 'id_desc', $projectID = 0, $type = '') { if($projectID) { @@ -137,7 +140,7 @@ class stageModel extends model } else { - return $this->dao->select('*')->from(TABLE_STAGE)->where('deleted')->eq(0)->orderBy($orderBy)->fetchAll('id'); + return $this->dao->select('*')->from(TABLE_STAGE)->where('deleted')->eq(0)->andWhere('projectType')->eq($type)->orderBy($orderBy)->fetchAll('id'); } } @@ -175,10 +178,41 @@ class stageModel extends model /** * Get stage total percent * - * return string + * @param string $type + * @return string */ - public function getTotalPercent() + public function getTotalPercent($type) { - return $this->dao->select('sum(percent) as total')->from(TABLE_STAGE)->where('deleted')->eq('0')->fetch('total'); + return $this->dao->select('sum(percent) as total')->from(TABLE_STAGE)->where('deleted')->eq('0')->andWhere('projectType')->eq($type)->fetch('total'); + } + + /** + * Set menu. + * + * @param string $type + * @access public + * @return void + */ + public function setMenu($type) + { + $this->app->loadLang('admin'); + $moduleName = $this->app->rawModule; + $methodName = $this->app->rawMethod; + if(!isset($this->lang->admin->menuList->model['subMenu']['waterfall']['exclude'])) $this->lang->admin->menuList->model['subMenu']['waterfall']['exclude'] = ''; + if(!isset($this->lang->admin->menuList->model['subMenu']['waterfallplus']['exclude'])) $this->lang->admin->menuList->model['subMenu']['agileplus']['exclude'] = ''; + if($type == 'waterfall') + { + $this->lang->admin->menuList->model['subMenu']['waterfallplus']['exclude'] .= ",{$moduleName}-{$methodName}"; + unset($this->lang->admin->menuList->model['subMenu']['scrum']['subModule']); + unset($this->lang->admin->menuList->model['subMenu']['scrumplus']['subModule']); + unset($this->lang->admin->menuList->model['subMenu']['waterfallplus']['subModule']); + } + if($type == 'waterfallplus') + { + $this->lang->admin->menuList->model['subMenu']['waterfall']['exclude'] .= ",{$moduleName}-{$methodName}"; + unset($this->lang->admin->menuList->model['subMenu']['scrum']['subModule']); + unset($this->lang->admin->menuList->model['subMenu']['waterfall']['subModule']); + unset($this->lang->admin->menuList->model['subMenu']['scrumplus']['subModule']); + } } } diff --git a/module/stage/view/browse.html.php b/module/stage/view/browse.html.php index 266234a805..32d8a50a9c 100644 --- a/module/stage/view/browse.html.php +++ b/module/stage/view/browse.html.php @@ -17,40 +17,30 @@

stage->noStage;?> - createLink('stage', 'create'), " " . $lang->stage->create, '', "class='btn btn-info'");?> + createLink('stage', 'create', "type={$type}"), " " . $lang->stage->create, '', "class='btn btn-info'");?>

-
-
-
-
- stage->setType);?> - stage->browse, '', "class='selected'");?> -
-
-
-
- + - + @@ -63,7 +53,7 @@ diff --git a/module/stage/view/settype.html.php b/module/stage/view/settype.html.php index 4dd7d72696..86f5e6fb03 100644 --- a/module/stage/view/settype.html.php +++ b/module/stage/view/settype.html.php @@ -29,16 +29,6 @@ EOT; ?>
-
-
-
-
- stage->setType, '', "class='selected'");?> - stage->browse);?> -
-
-
-
stage->id);?> stage->name);?> stage->percent);?> stage->type);?>actions;?>actions;?>
id", "", "list"); - common::printIcon('stage', 'delete', "stageID=$stage->id", "", "list", '', 'hiddenwin'); + common::printIcon('stage', 'delete', "stageID=$stage->id", "", "list", 'trash', 'hiddenwin'); ?>
diff --git a/test/class/custom.class.php b/test/class/custom.class.php index ed38ded606..8cdf495085 100644 --- a/test/class/custom.class.php +++ b/test/class/custom.class.php @@ -334,4 +334,25 @@ class customTest return $objects; } + + /** + * Check for waterfallplus project data.. + * + * @param string $param deleteproject + * @access public + * @return int + */ + public function hasWaterfallplusDataTest($param = '') + { + if($param == 'deleteproject') + { + global $tester; + $tester->dao->update(TABLE_PROJECT) + ->set('deleted')->eq(1) + ->where('type')->eq('project') + ->andWhere('model')->eq('waterfallplus') + ->exec(); + } + return $this->objectModel->hasWaterfallplusData(); + } } diff --git a/test/model/custom/haswaterfallplusdata.php b/test/model/custom/haswaterfallplusdata.php new file mode 100644 index 0000000000..de02c5d720 --- /dev/null +++ b/test/model/custom/haswaterfallplusdata.php @@ -0,0 +1,34 @@ +#!/usr/bin/env php +gen(5); +su('admin'); + +$project = zdTable('project'); +$project->id->range('1-3'); +$project->name->range('项目集1,融合瀑布项目1,瀑布项目1'); +$project->type->range('program,project{2}'); +$project->parent->range('0,1{2}'); +$project->status->range('wait'); +$project->model->range('[],waterfallplus,waterfall'); +$project->openedBy->range('admin,user1'); +$project->begin->range('20220112 000000:0')->type('timestamp')->format('YY/MM/DD'); +$project->end->range('20220212 000000:0')->type('timestamp')->format('YY/MM/DD'); +$project->gen(3); + +/** + +title=测试projectModel->hasWaterfallplusData(); +cid=1 +pid=1 + +检查获取所有未删除的融合瀑布项目的数量 >> 1 +检查删除所有融合瀑布模型项目后,获取融合瀑布项目的数量 >> 0 + +*/ + +$customTester = new customTest(); +r($customTester->hasWaterfallplusDataTest()) && p() && e('1'); // 检查获取所有未删除的融合瀑布项目的数量 +r($customTester->hasWaterfallplusDataTest('deleteproject')) && p() && e('0'); // 检查删除所有融合瀑布模型项目后,获取融合瀑布项目的数量