This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "FusionForge".

The branch, master has been updated
       via  d5019eb8511917a50bf5fcf622597b72593c3001 (commit)
      from  f737f582ed96ef2d325f2428a93ecbe383b1faaf (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://scm.fusionforge.org/anonscm/gitweb/?p=fusionforge/fusionforge.git;a=commitdiff;h=d5019eb8511917a50bf5fcf622597b72593c3001

commit d5019eb8511917a50bf5fcf622597b72593c3001
Author: Stéphane-Eymeric Bredthauer <[email protected]>
Date:   Tue May 30 15:08:55 2017 +0200

    Tracker: Artifacts dependencies, part 4

diff --git a/src/common/tracker/Artifact.class.php 
b/src/common/tracker/Artifact.class.php
index 25097a5..08a178c 100644
--- a/src/common/tracker/Artifact.class.php
+++ b/src/common/tracker/Artifact.class.php
@@ -1466,6 +1466,7 @@ class Artifact extends FFObject {
                                $this->setError(sprintf(_("Field %s doesn't 
match the pattern."), $ef[$efid]['field_name']));
                                return false;
                        }
+
 //
 //     Force each field to have some value if it is a numeric field
 //     text fields will just be purged and skipped
@@ -1563,18 +1564,26 @@ class Artifact extends FFObject {
                                $new = '';
                                foreach (explode(' ',$value) as $id) {
                                        if (preg_match('/^(\d+)$/', $id)) {
+                                               if ($id == $this->getID) {
+                                                       
$this->setError('Illegal id '.$id.', self reference for field: 
'.$ef[$efid]['field_name'].'.'); // @todo: lang
+                                                       return false;
+                                               }
                                                // Control that the id is 
present in the db
-
                                                $res = db_query_params ('SELECT 
artifact_id FROM artifact WHERE artifact_id=$1',
                                                                        
array($id));
                                                if (db_numrows($res) == 1) {
                                                        $new .= $id.' ';
                                                } else {
-                                                       
$this->setError('Illegal id '.$id.', it\'s not a valid tracker id for field: 
'.$ef[$efid]['field_name'].'.'); // @todo: lang
+                                                       
$this->setError('Illegal id '.$id.', it\'s not a valid artifact id for field: 
'.$ef[$efid]['field_name'].'.'); // @todo: lang
+                                                       return false;
+                                               }
+                                               $progeny = $this->getProgeny();
+                                               if (in_array($id, $progeny)) {
+                                                       
$this->setError('Illegal id '.$id.', circular dependency for field: 
'.$ef[$efid]['field_name'].'.'); // @todo: lang
                                                        return false;
                                                }
                                        } else {
-                                               $this->setError('Illegal value 
'.$id.', only trackers id are allowed for field: 
'.$ef[$efid]['field_name'].'.'); // @todo: lang
+                                               $this->setError('Illegal value 
'.$id.', only artifact id are allowed for field: 
'.$ef[$efid]['field_name'].'.'); // @todo: lang
                                                return false;
                                        }
                                }
@@ -2263,7 +2272,7 @@ class Artifact extends FFObject {
                if (!isset($this->parent)) {
                        $res = db_query_params ('SELECT field_data FROM
                                                                                
artifact_extra_field_data
-                                                                               
NATURAL INNER JOIN artifact_extra_field_list
+                                                                               
INNER JOIN artifact_extra_field_list USING (extra_field_id)
                                                                        WHERE
                                                                                
field_type = $1
                                                                                
        AND artifact_id = $2',
@@ -2280,6 +2289,22 @@ class Artifact extends FFObject {
                return $this->parent;
        }
 
+       function getProgeny() {
+               $return = array();
+               $childrenArr = $this->getChildren();
+               if (is_array($childrenArr)) {
+                       $at = $this->ArtifactType;
+                       foreach ($childrenArr as $child) {
+                               $return[] = $child['artifact_id'];
+                               $childObj = new 
Artifact($at,$child['artifact_id']);
+                               $childProgenyArr = $childObj->getProgeny();
+                               if (is_array($childProgenyArr)) {
+                                       $return = array_merge($return, 
$childProgenyArr);
+                               }
+                       }
+               }
+               return $return;
+       }
 
        function getPermalink() {
                return '/tracker/a_follow.php/'.$this->getID();
diff --git a/src/common/tracker/ArtifactExtraField.class.php 
b/src/common/tracker/ArtifactExtraField.class.php
index 47615f9..e0d9fbe 100644
--- a/src/common/tracker/ArtifactExtraField.class.php
+++ b/src/common/tracker/ArtifactExtraField.class.php
@@ -848,7 +848,8 @@ class ArtifactExtraField extends FFError {
                if ($parentId=='100') {
                        return false;
                }
-               if ($this->getType() != ARTIFACT_EXTRAFIELDTYPE_SELECT &&
+               if ($this->getType() != ARTIFACT_EXTRAFIELDTYPE_STATUS &&
+                               $this->getType() != 
ARTIFACT_EXTRAFIELDTYPE_SELECT &&
                                $this->getType() != 
ARTIFACT_EXTRAFIELDTYPE_MULTISELECT &&
                                $this->getType() != 
ARTIFACT_EXTRAFIELDTYPE_RADIO &&
                                $this->getType() != 
ARTIFACT_EXTRAFIELDTYPE_CHECKBOX) {
@@ -1279,23 +1280,22 @@ class ArtifactExtraField extends FFError {
         * @return      array   rules.
         */
        function getAvailableAggregationRules() {
-               $return= 
array(ARTIFACT_EXTRAFIELD_AGGREGATION_RULE_NO_AGGREGATION => _('Parent value is 
not depending on children\'s values'));
+               $return = array();
+               $return[ARTIFACT_EXTRAFIELD_AGGREGATION_RULE_NO_AGGREGATION] = 
_('Parent value is not depending on children\'s values');
                $type = $this->getType();
 
                if ($type == ARTIFACT_EXTRAFIELDTYPE_EFFORT) {
-                       $return = array_merge($return, 
array(ARTIFACT_EXTRAFIELD_AGGREGATION_RULE_SUM => _('Parent value is the sum of 
children\'s values')));
+                       $return[ARTIFACT_EXTRAFIELD_AGGREGATION_RULE_SUM] = 
_('Parent value is the sum of children\'s values');
                }
 
                if ($type == ARTIFACT_EXTRAFIELDTYPE_INTEGER) {
-                       $return = array_merge($return, 
array(ARTIFACT_EXTRAFIELD_AGGREGATION_RULE_SUM => _('Parent value is the sum of 
children\'s values')));
+                       $return[ARTIFACT_EXTRAFIELD_AGGREGATION_RULE_SUM] = 
_('Parent value is the sum of children\'s values');
                }
 
-//             if ($type == ARTIFACT_EXTRAFIELDTYPE_STATUS) {
-//                     $return = array_merge($return, array(
-//                                                                             
                        
ARTIFACT_EXTRAFIELD_AGGREGATION_RULE_STATUS_CLOSE_RESTRICTED => _('Deny closing 
the parent, as long as not all children have been closed'),
-//                                                                             
                        
ARTIFACT_EXTRAFIELD_AGGREGATION_RULE_STATUS_CLOSE_UPWARDS => _('Close the 
parent, after the last child has been closed')
-//                                                             ));
-//             }
+               if ($type == ARTIFACT_EXTRAFIELDTYPE_STATUS) {
+                       
$return[ARTIFACT_EXTRAFIELD_AGGREGATION_RULE_STATUS_CLOSE_RESTRICTED] = _('Deny 
closing the parent, as long as not all children have been closed');
+                       
//$return[ARTIFACT_EXTRAFIELD_AGGREGATION_RULE_STATUS_CLOSE_UPWARDS] = _('Close 
the parent, after the last child has been closed');
+               }
 
                if (count($return)==1) {
                        $return = array();
@@ -1313,11 +1313,12 @@ class ArtifactExtraField extends FFError {
        * @return       array   rules.
        */
        function getAvailableDistributionRules() {
-               $return= 
array(ARTIFACT_EXTRAFIELD_DISTRIBUTION_RULE_NO_DISTRIBUTION => _('Parent value 
is not depending on children\'s values'));
+               $return = array();
+               $return[ARTIFACT_EXTRAFIELD_DISTRIBUTION_RULE_NO_DISTRIBUTION] 
= _('Parent value is not depending on children\'s values');
                $type = $this->getType();
 
                if ($type == ARTIFACT_EXTRAFIELDTYPE_STATUS) {
-                       $return = array_merge($return, 
array(ARTIFACT_EXTRAFIELD_DISTRIBUTION_RULE_STATUS_CLOSE_RECURSIVELY => 
_('Closure of parent involves recursive closure of children')));
+                       
$return[ARTIFACT_EXTRAFIELD_DISTRIBUTION_RULE_STATUS_CLOSE_RECURSIVELY] = 
_('Closure of parent involves recursive closure of children');
                }
 
                if (count($return)==1) {
diff --git a/src/common/tracker/actions/detail.php 
b/src/common/tracker/actions/detail.php
index eec9623..ea38857 100644
--- a/src/common/tracker/actions/detail.php
+++ b/src/common/tracker/actions/detail.php
@@ -165,10 +165,11 @@ $nbh = $count? ' ('.$count.')' : '';
        <li><a href="#tabber-relations"><?php echo _('Relations').$nbr; 
?></a></li>
        <?php } ?>
        <?php if (forge_get_config('use_artefacts_dependencies')) {
-               $count=$ah->hasChildren();
-               $nbc = $count? ' ('.$count.')' : '';
+               $countC=$ah->hasChildren()?$ah->hasChildren():0;
+               $countP=$ah->hasParent()?1:0;
+               $nbd = $countC+$countP? ' ('.$countP.'/'.$countC.')' : '';
        ?>
-       <li><a href="#tabber-children"><?php echo _('Children').$nbc; 
?></a></li>
+       <li><a href="#tabber-dependencies"><?php echo _('Dependencies').$nbd; 
?></a></li>
        <?php } ?>
        <?php if (forge_get_config('use_object_associations')) {
                $anf = '';
@@ -250,8 +251,13 @@ if ($group->usesPM()) {
        <?php echo $ah->showRelations(); ?>
        </div><?php
        if (forge_get_config('use_artefacts_dependencies')) { ?>
-               <div id="tabber-children" class="tabbertab">
-                       <?php echo $ah->showChildren(); ?>
+               <div id="tabber-dependencies" class="tabbertab">
+                       <?php
+                               echo '<strong>'._('Parent').'</strong><br>';
+                               echo $ah->showParent().'<br>';
+                               echo '<strong>'._('Children').'</strong><br>';
+                               echo $ah->showChildren();
+                       ?>
                </div><?php
        }
        if (forge_get_config('use_object_associations')) { ?>
diff --git a/src/common/tracker/actions/mod-limited.php 
b/src/common/tracker/actions/mod-limited.php
index 7437b01..ec68ede 100644
--- a/src/common/tracker/actions/mod-limited.php
+++ b/src/common/tracker/actions/mod-limited.php
@@ -204,10 +204,11 @@ $nbh = $count? ' ('.$count.')' : '';
        <li><a href="#tabber-relations"><?php echo _('Relations').$nbr; 
?></a></li>
        <?php } ?>
        <?php if (forge_get_config('use_artefacts_dependencies')) {
-               $count=$ah->hasChildren();
-               $nbc = $count? ' ('.$count.')' : '';
+               $countC=$ah->hasChildren()?$ah->hasChildren():0;
+               $countP=$ah->hasParent()?1:0;
+               $nbd = $countC+$countP? ' ('.$countP.'/'.$countC.')' : '';
        ?>
-       <li><a href="#tabber-children"><?php echo _('Children').$nbc; 
?></a></li>
+       <li><a href="#tabber-dependencies"><?php echo _('Dependencies').$nbd; 
?></a></li>
        <?php } ?>
        <?php if (forge_get_config('use_object_associations')) {
                $anf = '';
@@ -275,8 +276,13 @@ echo $ath->renderFiles($group_id, $ah);
        <?php echo $ah->showRelations(); ?>
 </div><?php
 if (forge_get_config('use_artefacts_dependencies')) { ?>
-       <div id="tabber-children" class="tabbertab">
-               <?php echo $ah->showChildren(); ?>
+       <div id="tabber-dependencies" class="tabbertab">
+               <?php
+                       echo '<strong>'._('Parent').'</strong><br>';
+                       echo $ah->showParent().'<br>';
+                       echo '<strong>'._('Children').'</strong><br>';
+                       echo $ah->showChildren();
+               ?>
        </div><?php
 }
 if (forge_get_config('use_object_associations')) { ?>
diff --git a/src/common/tracker/actions/mod.php 
b/src/common/tracker/actions/mod.php
index 31e2ffd..637b9d4 100644
--- a/src/common/tracker/actions/mod.php
+++ b/src/common/tracker/actions/mod.php
@@ -261,10 +261,11 @@ $nbh = $count? ' ('.$count.')' : '';
        <li><a href="#tabber-relations"><?php echo _('Relations').$nbr; 
?></a></li>
        <?php } ?>
        <?php if (forge_get_config('use_artefacts_dependencies')) {
-               $count=$ah->hasChildren();
-               $nbc = $count? ' ('.$count.')' : '';
+               $countC=$ah->hasChildren()?$ah->hasChildren():0;
+               $countP=$ah->hasParent()?1:0;
+               $nbd = $countC+$countP? ' ('.$countP.'/'.$countC.')' : '';
        ?>
-       <li><a href="#tabber-children"><?php echo _('Children').$nbc; 
?></a></li>
+       <li><a href="#tabber-dependencies"><?php echo _('Dependencies').$nbd; 
?></a></li>
        <?php } ?>
        <?php if (forge_get_config('use_object_associations')) {
                $anf = '';
@@ -353,8 +354,13 @@ echo $ath->renderFiles($group_id, $ah);
        <?php echo $ah->showRelations(); ?>
 </div><?php
 if (forge_get_config('use_artefacts_dependencies')) { ?>
-       <div id="tabber-children" class="tabbertab">
-               <?php echo $ah->showChildren(); ?>
+       <div id="tabber-dependencies" class="tabbertab">
+               <?php
+                       echo '<strong>'._('Parent').'</strong><br>';
+                       echo $ah->showParent().'<br>';
+                       echo '<strong>'._('Children').'</strong><br>';
+                       echo $ah->showChildren();
+               ?>
        </div><?php
 }
 if (forge_get_config('use_object_associations')) { ?>
diff --git a/src/common/tracker/include/ArtifactHtml.class.php 
b/src/common/tracker/include/ArtifactHtml.class.php
index c5813b7..6bc9c67 100644
--- a/src/common/tracker/include/ArtifactHtml.class.php
+++ b/src/common/tracker/include/ArtifactHtml.class.php
@@ -249,7 +249,7 @@ function hide_edit_button(id) {
                                                $arg['class'] = 
'artifact_closed';
                                        }
                                        $return .= '<br/>&nbsp;&nbsp;&nbsp;';
-                                       $return .= util_make_link($url, $text, 
$arg).' '.util_make_link($url, $arr['summary']).' <i>('._('Parent')._(': 
').$arr['field_name'].')</i>';
+                                       $return .= util_make_link($url, $text, 
$arg).' '.util_make_link($url, $arr['summary']);
                                }
                        }
                        $return .= '</td>
@@ -258,6 +258,36 @@ function hide_edit_button(id) {
                }
                return $return;
        }
+
+       function showParent() {
+               $parentId = $this->getParent();
+               $return = '';
+               if ($parentId){
+                       $parent = artifact_get_object($parentId);
+                       $return = '     <table class="fullwidth">
+                                                       <tr>
+                                                               <td 
colspan="2">';
+                       $parentAt = $parent->getArtifactType();
+                       if (forge_check_perm('tracker', $parentAt->getID(), 
'read')) {
+                               $parentG = $parentAt->getGroup();
+                               $title = $parentG->getPublicName()._(': 
').$parentAt->getName();
+                               $return .= '<strong>'.$title.'</strong>';
+                               $text = '[#'.$parent->getID().']';
+                               $url = 
'/tracker/?func=detail&aid='.$parent->getID().'&group_id='.$parentG->getID().'&atid='.$parentAt->getID();
+                               $arg['title'] = 
util_html_secure($parent->getSummary());
+                               if ($parent->getStatusID() == 2) {
+                                       $arg['class'] = 'artifact_closed';
+                               }
+                               $return .= '<br/>&nbsp;&nbsp;&nbsp;';
+                               $return .= util_make_link($url, $text, $arg).' 
'.util_make_link($url, $parent->getSummary());
+                       }
+                       $return .= '</td>
+                               </tr>
+                               </table>';
+               }
+               return $return;
+       }
+
 }
 
 // Local Variables:
diff --git a/src/common/tracker/include/ArtifactTypeHtml.class.php 
b/src/common/tracker/include/ArtifactTypeHtml.class.php
index 352f3ff..517e747 100644
--- a/src/common/tracker/include/ArtifactTypeHtml.class.php
+++ b/src/common/tracker/include/ArtifactTypeHtml.class.php
@@ -156,14 +156,14 @@ class ArtifactTypeHtml extends ArtifactType {
        /**
         * renderExtraFields - ???
         *
-        * @param       array   $selected
-        * @param       bool    $show_100               Display the specific 
'100' value. Default is false.
-        * @param       string  $text_100               Label displayed for the 
'100' value. Default is 'none'
-        * @param       bool    $show_any
-        * @param       string  $text_any
-        * @param       array   $types
-        * @param       bool    $status_show_100        Force display of the 
'100' value if needed. Default is false.
-        * @param       string  $mode                   QUERY, DISPLAY, UPDATE, 
NEW
+        * @param       array                   $selected
+        * @param       bool                    $show_100                       
Display the specific '100' value. Default is false.
+        * @param       string                  $text_100                       
Label displayed for the '100' value. Default is 'none'
+        * @param       bool                    $show_any
+        * @param       string                  $text_any
+        * @param       array                   $types
+        * @param       bool                    $status_show_100        Force 
display of the '100' value if needed. Default is false.
+        * @param       string                  $mode                           
QUERY, DISPLAY, UPDATE, NEW
         */
        function renderExtraFields($selected = array(),
                                $show_100 = false, $text_100 = 'none',
@@ -172,6 +172,8 @@ class ArtifactTypeHtml extends ArtifactType {
                                $status_show_100 = false,
                                $mode = '') {
                global $HTML;
+               global $ah;
+
                if ($mode == 'NEW') {
                        $efarr = $this->getExtraFields($types, false, false);
                } else {
@@ -304,11 +306,12 @@ class ArtifactTypeHtml extends ArtifactType {
                                $efarr[$i]['show100'] = $status_show_100;
                        }
 
+                       $allowed=false;
+
                        if ($efarr[$i]['field_type'] == 
ARTIFACT_EXTRAFIELDTYPE_SELECT ||
                                        $efarr[$i]['field_type'] == 
ARTIFACT_EXTRAFIELDTYPE_CHECKBOX ||
                                        $efarr[$i]['field_type'] == 
ARTIFACT_EXTRAFIELDTYPE_RADIO ||
                                        $efarr[$i]['field_type'] == 
ARTIFACT_EXTRAFIELDTYPE_MULTISELECT) {
-                               $allowed=false;
                                if (!is_null($efarr[$i]['parent']) && 
!empty($efarr[$i]['parent']) && $efarr[$i]['parent']!='100') {
                                        $aefParentId = $efarr[$i]['parent'];
                                        $selectedElmnts = 
(isset($selected[$aefParentId]) ? $selected[$aefParentId] : '');
@@ -355,6 +358,34 @@ class ArtifactTypeHtml extends ArtifactType {
                                $str = 
$this->renderMultiSelectBox($efarr[$i]['extra_field_id'], 
$selected[$efarr[$i]['extra_field_id']], $efarr[$i]['show100'], 
$efarr[$i]['show100label'], $allowed, $attrs);
 
                        } elseif ($efarr[$i]['field_type'] == 
ARTIFACT_EXTRAFIELDTYPE_STATUS) {
+                               // parent artifact can't be close if a child is 
still open
+                               if ($mode == 'UPDATE' &&
+                                               $efarr[$i]['aggregation_rule'] 
== ARTIFACT_EXTRAFIELD_AGGREGATION_RULE_STATUS_CLOSE_RESTRICTED &&
+                                               $ah->hasChildren()) {
+                                       $children = $ah->getChildren();
+                                       $childOpen = false;
+                                       foreach ($children as $child) {
+                                               if ($child['status_id'] == 1) {
+                                                       $childOpen = true;
+                                                       break;
+                                               }
+                                       }
+                                       if ($childOpen) {
+                                               $aef = new 
ArtifactExtraField($this, $efarr[$i]['extra_field_id']);
+                                               $statusArr = 
$aef->getAvailableValues();
+                                               $openStatus = array();
+                                               foreach ($statusArr as $status) 
{
+                                                       if 
($status['status_id']==1) {
+                                                               $openStatus[] = 
$status['element_id'];
+                                                       }
+                                               }
+                                               if ($allowed) {
+                                                       $allowed = 
array_intersect($allowed, $openStatus);
+                                               } else {
+                                                       $allowed = $openStatus;
+                                               }
+                                       }
+                               }
 
                                // Get the allowed values from the workflow.
                                $atw = new ArtifactWorkflow($this, 
$efarr[$i]['extra_field_id']);
@@ -365,9 +396,15 @@ class ArtifactTypeHtml extends ArtifactType {
                                        $selected_node = 
$selected[$efarr[$i]['extra_field_id']];
                                } else {
                                        $selected_node = 100;
+
                                }
 
-                               $allowed = $atw->getNextNodes($selected_node);
+                               $allowedWF = $atw->getNextNodes($selected_node);
+                               if ($allowed) {
+                                       $allowed = array_intersect($allowed, 
$allowedWF);
+                               } else {
+                                       $allowed = $allowedWF;
+                               }
                                $allowed[] = $selected_node;
                                $str = 
$this->renderSelect($efarr[$i]['extra_field_id'], $selected_node, 
$status_show_100, $text_100, $show_any, $text_any, $allowed, $attrs);
 
@@ -1093,7 +1130,6 @@ class ArtifactTypeHtml extends ArtifactType {
                        $keys[$i]=$arr[$i]['element_id'];
                        $vals[$i]=$arr[$i]['element_name'];
                }
-               $attrs['pattern']='^\d+(\s+\d+)*$';
                // Convert artifact id to links.
                $html_contents = preg_replace_callback('/\b(\d+)\b/', 
create_function('$matches', 'return _artifactid2url($matches[1], \'title\');'), 
$contents);
                $edit_contents = $this->renderTextField ($extra_field_id, 
$contents, $size, $maxlength);
@@ -1112,15 +1148,21 @@ class ArtifactTypeHtml extends ArtifactType {
         * @return      string  text area and data.
         */
        function renderParentField($extra_field_id, $contents, $size, 
$maxlength, $attrs = array()) {
+               global $ah;
                $arr = $this->getExtraFieldElements($extra_field_id);
                for ($i=0; $i<count($arr); $i++) {
                        $keys[$i]=$arr[$i]['element_id'];
                        $vals[$i]=$arr[$i]['element_name'];
                }
-               $attrs['pattern']='^\d*$';
+               $attrsTxt = array();
+               if (is_object($ah)) {
+                       $attrsTxt['pattern']='^(?!'.$ah->getID().'$)\d*$';
+               } else {
+                       $attrsTxt['pattern']='^\d*$';
+               }
                // Convert artifact id to links.
                $html_contents = preg_replace_callback('/\b(\d+)\b/', 
create_function('$matches', 'return _artifactid2url($matches[1], \'title\');'), 
$contents);
-               $edit_contents = $this->renderTextField ($extra_field_id, 
$contents, $size, $maxlength);
+               $edit_contents = $this->renderTextField ($extra_field_id, 
$contents, $size, $maxlength, $attrsTxt);
                return 
html_e('div',array_merge(array('id'=>'edit'.$extra_field_id, 'style'=>'display: 
none', 'title'=>_('Tip: Enter a space-separated list of artifact ids ([#NNN] 
also accepted)')), $attrs), $edit_contents)
                .html_e('div',array_merge(array('id'=>'show'.$extra_field_id, 
'style'=>'display: block'), $attrs), $html_contents);
        }
diff --git a/src/common/widget/Widget_TrackerComment.class.php 
b/src/common/widget/Widget_TrackerComment.class.php
index 6f4ebbb..ad11ddc 100644
--- a/src/common/widget/Widget_TrackerComment.class.php
+++ b/src/common/widget/Widget_TrackerComment.class.php
@@ -96,12 +96,13 @@ class Widget_TrackerComment extends Widget {
                                $elementsLi[] = array('content' => 
util_make_link('#tabber-relations', _('Relations').$nbr, false, true));
                        }
                        if (forge_get_config('use_artefacts_dependencies')) {
-                               $tabTitle = _('Children');
-                               $nbChildren = $ah->hasChildren();
-                               if ($nbChildren) {
-                                       $tabTitle .= ' ('.$nbChildren.')';
+                               $tabTitle = _('Dependencies');
+                               $nbChildren = 
$ah->hasChildren()?$ah->hasChildren():0;
+                               $nbParent = $ah->hasParent()?1:0;
+                               if ($nbChildren+$nbParent) {
+                                       $tabTitle .= ' 
('.$nbParent.'/'.$nbChildren.')';
                                }
-                               $elementsLi[] = array('content' => 
util_make_link('#tabber-children', $tabTitle, false, true));
+                               $elementsLi[] = array('content' => 
util_make_link('#tabber-dependencies', $tabTitle, false, true));
                        }
                        if (forge_get_config('use_object_associations')) {
                                $tabTitle = _('Associations');
@@ -170,7 +171,10 @@ class Widget_TrackerComment extends Widget {
                        $tabberContent .= html_e('div', array('id' => 
'tabber-relations', 'class' => 'tabbertab'),
                                                $ah->showRelations());
                        if (forge_get_config('use_artefacts_dependencies')) {
-                               $tabberContent .= html_e('div', array('id' => 
'tabber-children', 'class' => 'tabbertab'),
+                               $tabberContent .= html_e('div', array('id' => 
'tabber-dependencies', 'class' => 'tabbertab'),
+                                               
html_e('strong',array(),_('Parent')).html_e('br').
+                                               $ah->showParent().html_e('br').
+                                               
html_e('strong',array(),_('Children')).html_e('br').
                                                $ah->showChildren());
                        }
                        if (forge_get_config('use_object_associations')) {
diff --git a/src/common/widget/Widget_TrackerContent.class.php 
b/src/common/widget/Widget_TrackerContent.class.php
index ef0203e..b3cf017 100644
--- a/src/common/widget/Widget_TrackerContent.class.php
+++ b/src/common/widget/Widget_TrackerContent.class.php
@@ -523,13 +523,47 @@ EOS;
                                                                                
}
                                                                                
$cellContent .= $value;
                                                                        } else {
+                                                                               
// parent artifact can't be close if a child is still open
+                                                                               
if ( $func != "add" &&
+                                                                               
                $extrafieldObject->getAggregationRule() == 
ARTIFACT_EXTRAFIELD_AGGREGATION_RULE_STATUS_CLOSE_RESTRICTED &&
+                                                                               
                $ah->hasChildren()) {
+                                                                               
        $children = $ah->getChildren();
+                                                                               
        $childOpen = false;
+                                                                               
        foreach ($children as $child) {
+                                                                               
                if ($child['status_id'] == 1) {
+                                                                               
                        $childOpen = true;
+                                                                               
                        break;
+                                                                               
                }
+                                                                               
        }
+                                                                               
        if ($childOpen) {
+                                                                               
                $extrafieldObject = new ArtifactExtraField($ath, $keys[0]);
+                                                                               
                //$aef = new ArtifactExtraField($this, 
$efarr[$i]['extra_field_id']);
+                                                                               
                $statusArr = $extrafieldObject->getAvailableValues();
+                                                                               
                $openStatus = array();
+                                                                               
                foreach ($statusArr as $status) {
+                                                                               
                        if ($child['status_id'] == 1) {
+                                                                               
                                $openStatus[] = $status['element_id'];
+                                                                               
                        }
+                                                                               
                }
+                                                                               
                if ($allowed) {
+                                                                               
                        $allowed = array_intersect($allowed, $openStatus);
+                                                                               
                } else {
+                                                                               
                        $allowed = $openStatus;
+                                                                               
                }
+                                                                               
        }
+                                                                               
}
                                                                                
$atw = new ArtifactWorkflow($ath, $keys[0]);
                                                                                
// Special treatment for the initial step (Submit). In this case, the initial 
value is the first value.
                                                                                
if (!$value) {
                                                                                
        $value = 100;
                                                                                
}
-                                                                               
$allowed = $atw->getNextNodes($value);
-                                                                               
$allowed[] = $value;
+                                                                               
$allowedWF = $atw->getNextNodes($value);
+                                                                               
if ($allowed) {
+                                                                               
        $allowed = array_intersect($allowed, $allowedWF);
+                                                                               
} else {
+                                                                               
        $allowed = $allowedWF;
+                                                                               
}
+                                                                               
$allowed[] = $selected_node;
                                                                                
$cellContent .= $ath->renderSelect($keys[0], $value, false, 
$extrafieldObject->getShow100label(), false, false, $allowed, $attrs);
                                                                        }
                                                                        break;

-----------------------------------------------------------------------

Summary of changes:
 src/common/tracker/Artifact.class.php              | 33 +++++++++--
 src/common/tracker/ArtifactExtraField.class.php    | 25 ++++----
 src/common/tracker/actions/detail.php              | 16 +++--
 src/common/tracker/actions/mod-limited.php         | 16 +++--
 src/common/tracker/actions/mod.php                 | 16 +++--
 src/common/tracker/include/ArtifactHtml.class.php  | 32 +++++++++-
 .../tracker/include/ArtifactTypeHtml.class.php     | 68 +++++++++++++++++-----
 src/common/widget/Widget_TrackerComment.class.php  | 16 +++--
 src/common/widget/Widget_TrackerContent.class.php  | 38 +++++++++++-
 9 files changed, 207 insertions(+), 53 deletions(-)


hooks/post-receive
-- 
FusionForge

_______________________________________________
Fusionforge-commits mailing list
[email protected]
http://lists.fusionforge.org/cgi-bin/mailman/listinfo/fusionforge-commits

Reply via email to