diff --git a/module/projectrelease/control.php b/module/projectrelease/control.php index 836240b2bd..936f704b05 100644 --- a/module/projectrelease/control.php +++ b/module/projectrelease/control.php @@ -132,7 +132,7 @@ class projectrelease extends control $this->commonAction($projectID); /* Get the builds that can select. */ - $builds = $this->build->getBuildPairs(array_keys($this->products), 'all', 'notrunk,withbranch', $projectID, 'project'); + $builds = $this->build->getBuildPairs($this->view->product->id, $this->view->branch, 'notrunk,withbranch', $projectID, 'project'); $releasedBuilds = $this->projectrelease->getReleasedBuilds($projectID); foreach($releasedBuilds as $build) unset($builds[$build]); unset($builds['trunk']); @@ -183,25 +183,29 @@ class projectrelease extends control /* Get release and build. */ $release = $this->projectrelease->getById((int)$releaseID); - $this->commonAction($release->project, $release->product, $release->branch); - $build = $this->build->getById($release->build); + if(!$this->session->project) $this->session->set('project', explode(',', trim($release->project, ','))[0], 'project'); + + $this->commonAction($this->session->project, $release->product, $release->branch); + $bindBuilds = $this->build->getByList($release->build); /* Get the builds that can select. */ - $builds = $this->build->getBuildPairs($release->product, $release->branch, 'notrunk|withbranch', $release->project, 'project', '', false); - $releasedBuilds = $this->projectrelease->getReleasedBuilds($release->project); + $builds = $this->build->getBuildPairs($release->product, $release->branch, 'notrunk|withbranch', $this->session->project, 'project', '', false); + $releasedBuilds = $this->projectrelease->getReleasedBuilds($this->session->project); foreach($releasedBuilds as $releasedBuild) { - if($releasedBuild != $build->id) unset($builds[$releasedBuild]); + foreach(explode(',', trim($releasedBuild, ',')) as $bindBuildID) + { + if(!isset($bindBuilds[$bindBuildID])) unset($builds[$bindBuildID]); + } } unset($builds['trunk']); /* Set project menu. */ - $this->project->setMenu($release->project); + $this->project->setMenu($this->session->project); $this->view->title = $this->view->product->name . $this->lang->colon . $this->lang->release->edit; $this->view->position[] = $this->lang->release->edit; $this->view->release = $release; - $this->view->build = $build; $this->view->builds = $builds; $this->view->users = $this->loadModel('user')->getPairs('noclosed'); @@ -772,4 +776,23 @@ class projectrelease extends control $actionID = $this->loadModel('action')->create('release', $releaseID, 'changestatus', '', $status); return print(js::reload('parent')); } + + /** + * Ajax load builds. + * + * @param int $projectID + * @param int $productID + * @param int $branch + * @access public + * @return void + */ + public function ajaxLoadBuilds($projectID, $productID, $branch = 0) + { + $builds = $this->loadModel('build')->getBuildPairs($productID, $branch, 'notrunk,withbranch', $projectID, 'project'); + $releasedBuilds = $this->projectrelease->getReleasedBuilds($projectID); + foreach($releasedBuilds as $build) unset($builds[$build]); + unset($builds['trunk']); + + return print(html::select('build[]', $builds, '', "class='form-control chosen' multiple")); + } } diff --git a/module/projectrelease/js/common.js b/module/projectrelease/js/common.js index 2b067af8df..1f3ddf85b3 100644 --- a/module/projectrelease/js/common.js +++ b/module/projectrelease/js/common.js @@ -2,41 +2,3 @@ $(document).ready(function() { $("a.preview").modalTrigger({width:1000, type:'iframe'}); }) - -/** - * Determined whether to show the productis. - * - * @param int $build - * @access public - * @return void - */ -function showProducts(build) -{ - if(build) $('#productBox').hide(); - if(!build) $('#productBox').show(); -} - -/** - * Flush the branch when switching products. - * - * @param int $productID - * @access public - * @return void - */ -function loadBranches(productID) -{ - $('#branch').remove(); - $('#branch_chosen').remove(); - $.get(createLink('branch', 'ajaxGetBranches', "productID=" + productID + '&oldBranch=0¶ms=active&projectID=' + projectID), function(data) - { - var $product = $('#product'); - var $inputGroup = $product.closest('.input-group'); - $inputGroup.find('.input-group-addon').toggleClass('hidden', !data); - if(data) - { - $inputGroup.append(data); - $('#branch').css('width', '120px').chosen(); - } - $inputGroup.fixInputGroup(); - }) -} diff --git a/module/projectrelease/js/create.js b/module/projectrelease/js/create.js index 41e0964444..36e9089d4b 100644 --- a/module/projectrelease/js/create.js +++ b/module/projectrelease/js/create.js @@ -12,3 +12,42 @@ $('#submit').click(function() }); $('[data-toggle="popover"]').popover(); + +/** + * Ajax load unlinked builds with project and product. + * + * @access public + * @return void + */ +function loadBuilds() +{ + var productID = $('#product').val(); + var branch = $('#branch').length == 0 ? 0 : $('#branch').val(); + $('#buildBox').load(createLink('projectrelease', 'ajaxLoadBuilds', "projectID=" + projectID + "&productID=" + productID + "&branch=" + branch), function(){$('#build').chosen();}); +} + +/** + * Flush the branch when switching products. + * + * @param int $productID + * @access public + * @return void + */ +function loadBranches(productID) +{ + $('#branch').remove(); + $('#branch_chosen').remove(); + $.get(createLink('branch', 'ajaxGetBranches', "productID=" + productID + '&oldBranch=0¶ms=active&projectID=' + projectID), function(data) + { + var $product = $('#product'); + var $inputGroup = $product.closest('.input-group'); + $inputGroup.find('.input-group-addon').toggleClass('hidden', !data); + if(data) + { + $inputGroup.append(data); + $('#branch').css('width', '120px').chosen(); + loadBuilds(); + } + $inputGroup.fixInputGroup(); + }) +} diff --git a/module/projectrelease/model.php b/module/projectrelease/model.php index a976dbebc6..1493ef5f0b 100644 --- a/module/projectrelease/model.php +++ b/module/projectrelease/model.php @@ -74,8 +74,10 @@ class projectreleaseModel extends model */ public function getLast($projectID) { + $project = (int)$projectID; return $this->dao->select('id, name')->from(TABLE_RELEASE) - ->where('project')->eq((int)$projectID) + ->where('deleted')->eq(0) + ->andWhere("FIND_IN_SET($projectID, project)") ->orderBy('date DESC') ->limit(1) ->fetch(); @@ -92,9 +94,12 @@ class projectreleaseModel extends model { $releases = $this->dao->select('build')->from(TABLE_RELEASE) ->where('deleted')->eq(0) - ->andWhere('project')->eq($projectID) - ->fetchAll('build'); - return array_keys($releases); + ->andWhere("FIND_IN_SET($projectID, project)") + ->fetchAll(); + + $buildIdList = array(); + foreach($releases as $release) $buildIdList = array_merge($buildIdList, explode(',', trim($release->build, ','))); + return $buildIdList; } /** @@ -109,14 +114,13 @@ class projectreleaseModel extends model /* Init vars. */ $releaseID = (int)$releaseID; $oldRelease = $this->dao->select('*')->from(TABLE_RELEASE)->where('id')->eq($releaseID)->fetch(); - $branch = $this->dao->select('branch')->from(TABLE_BUILD)->where('id')->eq((int)$this->post->build)->fetch('branch'); /* Check build if build is required. */ if(strpos($this->config->release->edit->requiredFields, 'build') !== false and $this->post->build == false) return dao::$errors['build'] = sprintf($this->lang->error->notempty, $this->lang->release->build); $release = fixer::input('post')->stripTags($this->config->release->editor->edit['id'], $this->config->allowedTags) - ->add('branch', (int)$branch) ->setDefault('mailto', '') + ->join('build', ',') ->join('mailto', ',') ->setIF(!$this->post->marker, 'marker', 0) ->cleanInt('product') @@ -127,7 +131,7 @@ class projectreleaseModel extends model $this->dao->update(TABLE_RELEASE)->data($release) ->autoCheck() ->batchCheck($this->config->release->edit->requiredFields, 'notempty') - ->check('name', 'unique', "id != '$releaseID' AND product = '{$release->product}' AND branch = '$branch' AND deleted = '0'") + ->check('name', 'unique', "id != '$releaseID' AND product = '{$oldRelease->product}' AND branch = '{$oldRelease->branch}' AND deleted = '0'") ->where('id')->eq((int)$releaseID) ->exec(); if(!dao::isError()) diff --git a/module/projectrelease/view/create.html.php b/module/projectrelease/view/create.html.php index 7e12384694..8477a26cfd 100644 --- a/module/projectrelease/view/create.html.php +++ b/module/projectrelease/view/create.html.php @@ -34,22 +34,22 @@ - release->build;?> - - - - - - hasProduct) echo "class='hide'";?> > release->product;?>
- - type != 'normal') echo html::select('branch', $branches, $branch, "class='form-control chosen control-branch'");?> + id, "onchange='loadBranches(this.value)' class='form-control chosen'");?> + type != 'normal') echo html::select('branch', $branches, $branch, "class='form-control chosen control-branch' onchange='loadBuilds()'");?>
+ + release->build;?> + + + + + release->date;?> diff --git a/module/projectrelease/view/edit.html.php b/module/projectrelease/view/edit.html.php index d453b11af0..2d287d373a 100644 --- a/module/projectrelease/view/edit.html.php +++ b/module/projectrelease/view/edit.html.php @@ -37,7 +37,7 @@ release->build;?> - build, "class='form-control chosen' required"); ?> + build, "class='form-control chosen' multiple required"); ?> release->date;?> diff --git a/module/release/model.php b/module/release/model.php index a374d22fbe..672abf75f8 100644 --- a/module/release/model.php +++ b/module/release/model.php @@ -212,8 +212,10 @@ class releaseModel extends model if($this->post->sync == 'true') { - $release->stories .= $build->stories; - $release->bugs .= $build->bugs; + $build->stories = trim($build->stories, ','); + $build->bugs = trim($build->bugs, ','); + if($build->stories) $release->stories .= ',' . $build->stories; + if($build->bugs) $release->bugs .= ',' . $build->bugs; } }