diff --git a/config/filter.php b/config/filter.php index f989ee42c3..c5f8611a90 100644 --- a/config/filter.php +++ b/config/filter.php @@ -141,7 +141,8 @@ $filter->product->export->cookie['checkedItem'] = 'reg::checked'; $filter->program->browse->cookie['programType'] = 'code'; $filter->program->browse->cookie['mine'] = 'code'; -$filter->program->export->cookie['checkedItem'] = 'reg::checked'; +$filter->program->prjbrowse->cookie['PRJMine'] = 'code'; +$filter->program->export->cookie['checkedItem'] = 'reg::checked'; $filter->project->default->cookie['lastProject'] = 'int'; $filter->project->default->cookie['projectMode'] = 'code'; diff --git a/module/program/config.php b/module/program/config.php index a4d539cf2e..fd2425e388 100644 --- a/module/program/config.php +++ b/module/program/config.php @@ -9,6 +9,9 @@ $config->program->editor->pgmactivate = array('id' => 'comment', 'tools' => 'sim $config->program->editor->pgmfinish = array('id' => 'comment', 'tools' => 'simpleTools'); $config->program->editor->pgmsuspend = array('id' => 'comment', 'tools' => 'simpleTools'); +$config->program->editor->prjcreate = array('id' => 'desc', 'tools' => 'simpleTools'); +$config->program->editor->prjedit = array('id' => 'desc', 'tools' => 'simpleTools'); + $config->program->list = new stdclass(); $config->program->list->exportFields = 'id,name,code,template,category,status,begin,end,budget,PM,end,desc'; @@ -16,3 +19,8 @@ $config->program->PGMCreate = new stdclass(); $config->program->PGMEdit = new stdclass(); $config->program->PGMCreate->requiredFields = 'name,code,begin,end'; $config->program->PGMEdit->requiredFields = 'name,code,begin,end'; + +$config->program->PRJCreate = new stdclass(); +$config->program->PRJEdit = new stdclass(); +$config->program->PRJCreate->requiredFields = 'name,code,begin,end'; +$config->program->PRJEdit->requiredFields = 'name,code,begin,end'; diff --git a/module/program/control.php b/module/program/control.php index d12f7a66af..793c478e0a 100644 --- a/module/program/control.php +++ b/module/program/control.php @@ -836,15 +836,74 @@ class program extends control } /** - * Delete a project. + * Create a project. * - * @param int $projectID - * @param varchar $confirm + * @param string $template + * @param int $programID + * @param int $parentProgramID + * @param int $copyProgramID * @access public * @return void */ - public function PRJDelete($projectID, $confirm = 'no') + public function PRJCreate($template = 'waterfall', $programID = 0, $parentProgramID = 0, $copyProgramID = '') { - die(js::reload('parent')); + if($_POST) + { + $projectID = $this->program->PRJCreate(); + if(dao::isError()) $this->send(array('result' => 'fail', 'message' => $this->processErrors(dao::getError()))); + + $this->loadModel('action')->create('project', $projectID, 'opened'); + $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('PRJBrowse', array('programID' => $programID, 'browseType' => 'doing')))); + } + + $name = ''; + $code = ''; + $team = ''; + $whitelist = ''; + $acl = 'open'; + $privway = 'extend'; + + if($parentProgramID) + { + $parentProgram = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($parentProgramID)->fetch(); + if($this->program->checkHasContent($parentProgramID)) + { + echo js::alert($this->lang->program->cannotCreateChild); + die(js::locate('back')); + } + + if(empty($template)) $template = $parentProgram->template; + } + + if($copyProgramID) + { + $copyProgram = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($copyProgramID)->fetch(); + $name = $copyProgram->name; + $code = $copyProgram->code; + $team = $copyProgram->team; + $acl = $copyProgram->acl; + $privway = $copyProgram->privway; + $whitelist = $copyProgram->whitelist; + if(empty($template)) $template = $copyProgram->template; + } + + + $this->view->title = $this->lang->program->PRJCreate; + $this->view->position[] = $this->lang->program->PRJCreate; + $this->view->groups = $this->loadModel('group')->getPairs(); + $this->view->pmUsers = $this->loadModel('user')->getPairs('noclosed|nodeleted|pmfirst'); + $this->view->programs = array('' => '') + $this->program->getPairsByTemplate($template); + $this->view->template = $template; + $this->view->name = $name; + $this->view->code = $code; + $this->view->team = $team; + $this->view->acl = $acl; + $this->view->privway = $privway; + $this->view->whitelist = $whitelist; + $this->view->parentProgram = $parentProgramID ? $parentProgram : ''; + $this->view->copyProgramID = $copyProgramID; + $this->view->programID = $programID; + $this->view->programList = $this->program->getParentPairs(); + $this->display(); } } diff --git a/module/program/css/prjbrowse.css b/module/program/css/prjbrowse.css index 8f8f16d480..a5093fea02 100644 --- a/module/program/css/prjbrowse.css +++ b/module/program/css/prjbrowse.css @@ -33,3 +33,12 @@ #projectTree ul > li.item-meas a.selected{color: #0c64eb;} .side-col {padding-right: 20px; width: 18%} #sidebar>.cell {width: 100%;} + +#guideDialog h2 {margin: 10px 0 30px 0; font-size: 16px; font-weight: normal} +#guideDialog h3 {margin: 5px 0; font-size: 20px;} +#guideDialog .modal-footer {border-top: none; text-align: center; padding-top: 10px; padding-bottom: 40px;} +#guideDialog .modal-footer .btn + .btn {margin-left: 20px} +#guideDialog .program-type {padding: 0 40px} +#guideDialog .program-type-img {width: 280px; border: 1px solid #CBD0DB; border-radius: 2px; margin-bottom: 10px; cursor: pointer; margin-top: 1px} +#guideDialog .program-type-img:hover {border-color: #006AF1; box-shadow: 0 0 10px 0 rgba(0,0,0,.25);} +#guideDialog .program-type.active img {border-color: #006AF1; border-width: 2px; margin-top: 0} diff --git a/module/program/js/prjbrowse.js b/module/program/js/prjbrowse.js new file mode 100644 index 0000000000..c9f432a89f --- /dev/null +++ b/module/program/js/prjbrowse.js @@ -0,0 +1,12 @@ +$(function() +{ + $('#PRJMine1').click(function() + { + var PRJMine = $(this).is(':checked') ? 1 : 0; + $.cookie('PRJMine', PRJMine, {expires:config.cookieLife, path:config.webRoot}); + window.location.reload(); + }); +}); + +$('#project').addClass('active'); +$(".tree .active").parent('li').addClass('active'); diff --git a/module/program/lang/zh-cn.php b/module/program/lang/zh-cn.php index 79a0eb8fb7..da669c78e5 100644 --- a/module/program/lang/zh-cn.php +++ b/module/program/lang/zh-cn.php @@ -152,8 +152,8 @@ $lang->program->PRJParentBeginEnd = "父项目起止时间:%s ~ %s"; $lang->program->PRJParentBudget = "父项目预算:%s"; $lang->program->PRJBeginLetterParent = "父项目的开始日期:%s,开始日期不能小于父项目的开始日期"; $lang->program->PRJEndGreaterParent = "父项目的完成日期:%s,完成日期不能大于父项目的完成日期"; -$lang->program->PRJBeginGreateChild = "子项目的最小开始日期:%s,父项目的开始日期不能大于子项目的最小开始日期"; -$lang->program->PRJEndLetterChild = "子项目的最大完成日期:%s,父项目的完成日期不能小于子项目的最大完成日期"; +$lang->program->PRJBeginGreateChild = "项目的最小开始日期:%s,项目集的开始日期不能大于项目的最小开始日期"; +$lang->program->PRJEndLetterChild = "项目的最大完成日期:%s,项目集的完成日期不能小于项目的最大完成日期"; $lang->program->PRJChildLongTime = "子项目中有长期项目,父项目也应该是长期项目"; /* Actions. */ diff --git a/module/program/model.php b/module/program/model.php index 761724ed0b..48af0545bb 100644 --- a/module/program/model.php +++ b/module/program/model.php @@ -828,12 +828,25 @@ class programModel extends model * @access public * @return bool */ - public function getPRJList($programID = 0, $browseType = 'all', $queryID = 0, $orderBy = 'id_desc', $pager = null, $moduleStatus = 0) + public function getPRJList($programID = 0, $browseType = 'all', $queryID = 0, $orderBy = 'id_desc', $pager = null, $moduleStatus = 0, $PRJMine = 0) { + $path = ''; + if($programID) + { + $program = $this->getPRJByID($programID); + $path = $program->path; + } + $projectList = $this->dao->select('*')->from(TABLE_PROJECT) ->where('type')->eq('project') ->beginIF($browseType != 'all')->andWhere('status')->eq($browseType)->fi() - ->beginIF($programID)->andWhere('program')->eq($programID)->fi() + ->beginIF($path)->andWhere('path')->like($path . '%')->fi() + ->beginIF(!$this->app->user->admin)->andWhere('id')->in($this->app->user->view->programs)->fi() + ->beginIF($this->cookie->PRJMine or $PRJMine) + ->andWhere('openedBy', true)->eq($this->app->user->account) + ->orWhere('PM')->eq($this->app->user->account) + ->markRight(1) + ->fi() ->andWhere('deleted')->eq('0') ->orderBy($orderBy) ->page($pager) @@ -962,4 +975,106 @@ class programModel extends model $icon = $project->type == 'program' ? ' ' : ' '; return html::a($link, $icon . $project->name, '_self', "id=project{$project->id} title='{$project->name}' class='text-ellipsis'"); } + + /** + * Create a project. + * + * @access public + * @return void + */ + public function PRJCreate() + { + $project = fixer::input('post') + ->setDefault('status', 'wait') + ->add('type', 'project') + ->setIF($this->post->acl != 'custom', 'whitelist', '') + ->setDefault('openedBy', $this->app->user->account) + ->setDefault('end', '') + ->setDefault('openedDate', helper::now()) + ->setDefault('team', substr($this->post->name, 0, 30)) + ->join('whitelist', ',') + ->cleanInt('budget') + ->stripTags($this->config->program->editor->prjcreate['id'], $this->config->allowedTags) + ->get(); + + if($project->parent) + { + $parentProgram = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->eq($project->parent)->fetch(); + if($parentProgram) + { + /* Child project begin cannot less than parent. */ + if($project->begin < $parentProgram->begin) dao::$errors['begin'] = sprintf($this->lang->program->PRJBeginGreateChild, $parentProgram->begin); + + /* When parent set end then child project end cannot greater than parent. */ + if($parentProgram->end != '0000-00-00' and $project->end > $parentProgram->end) dao::$errors['end'] = sprintf($this->lang->program->PRJEndLetterChild, $parentProgram->end); + + if(dao::isError()) return false; + } + } + + $project = $this->loadModel('file')->processImgURL($project, $this->config->program->editor->prjcreate['id'], $this->post->uid); + $this->dao->insert(TABLE_PROJECT)->data($project) + ->autoCheck() + ->batchcheck($this->config->program->PRJCreate->requiredFields, 'notempty') + ->check('name', 'unique', "deleted='0'") + ->check('code', 'unique', "deleted='0'") + ->exec(); + + /* Add the creater to the team. */ + if(!dao::isError()) + { + $projectID = $this->dao->lastInsertId(); + $today = helper::today(); + if($project->acl != 'open') $this->loadModel('user')->updateUserView($projectID, 'project'); + + /* Save order. */ + $this->dao->update(TABLE_PROJECT)->set('`order`')->eq($projectID * 5)->where('id')->eq($projectID)->exec(); + $this->file->updateObjectID($this->post->uid, $projectID, 'project'); + $this->setTreePath($projectID); + + /* Add project admin. */ + $groupPriv = $this->dao->select('t1.*')->from(TABLE_USERGROUP)->alias('t1') + ->leftJoin(TABLE_GROUP)->alias('t2')->on('t1.group = t2.id') + ->where('t1.account')->eq($this->app->user->account) + ->andWhere('t2.role')->eq('PRJadmin') + ->fetch(); + + if(!empty($groupPriv)) + { + $newProject = $groupPriv->PRJ . ",$projectID"; + $this->dao->update(TABLE_USERGROUP)->set('PRJ')->eq($newProject)->where('account')->eq($groupPriv->account)->andWhere('`group`')->eq($groupPriv->group)->exec(); + } + else + { + $PRJAdminID = $this->dao->select('id')->from(TABLE_GROUP)->where('role')->eq('PRJadmin')->fetch('id'); + $groupPriv = new stdclass(); + $groupPriv->account = $this->app->user->account; + $groupPriv->group = $PRJAdminID; + $groupPriv->PRJ = $projectID; + $this->dao->insert(TABLE_USERGROUP)->data($groupPriv)->exec(); + } + + if($project->template == 'waterfall') + { + $product = new stdclass(); + $product->name = $project->name; + $product->PRJ = $projectID; + $product->status = 'normal'; + $product->createdBy = $this->app->user->account; + $product->createdDate = helper::now(); + + $this->dao->insert(TABLE_PRODUCT)->data($product)->exec(); + + $productID = $this->dao->lastInsertId(); + $this->dao->update(TABLE_PRODUCT)->set('`order`')->eq($productID * 5)->where('id')->eq($productID)->exec(); + + $data = new stdclass(); + $data->project = $projectID; + $data->product = $productID; + $this->dao->insert(TABLE_PROJECTPRODUCT)->data($data)->exec(); + } + + return $projectID; + } + } } diff --git a/module/program/view/createguide.html.php b/module/program/view/createguide.html.php index 06df7e7bcf..acbd8976f6 100644 --- a/module/program/view/createguide.html.php +++ b/module/program/view/createguide.html.php @@ -1,4 +1,4 @@ -