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  442f4639d7431faf43478b7b02b8396dcfb8c09a (commit)
       via  ebf064ce09092d41504d4f124699c9c91a1e2b2b (commit)
      from  270b74de901d50acdd6b7bfbb10d4cf8b33c6837 (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=442f4639d7431faf43478b7b02b8396dcfb8c09a

commit 442f4639d7431faf43478b7b02b8396dcfb8c09a
Author: Stéphane-Eymeric Bredthauer <[email protected]>
Date:   Sun May 22 18:17:29 2016 +0200

    Tracker: Add description (help text) for custom fields

diff --git a/src/common/tracker/ArtifactExtraField.class.php 
b/src/common/tracker/ArtifactExtraField.class.php
index 54bfa02..3a44197 100644
--- a/src/common/tracker/ArtifactExtraField.class.php
+++ b/src/common/tracker/ArtifactExtraField.class.php
@@ -5,6 +5,7 @@
  * Copyright 2004, Anthony J. Pugliese
  * Copyright 2009, Roland Mas
  * Copyright 2014, Franck Villaume - TrivialDev
+ * Copyright 2016, Stéphane-Eymeric Bredthauer - TrivialDev
  *
  * This file is part of FusionForge. FusionForge is free software;
  * you can redistribute it and/or modify it under the terms of the
@@ -102,7 +103,7 @@ class ArtifactExtraField extends FFError {
         * @param       string  $show100label   The label used for the 100 
value if displayed
         * @return      bool    true on success / false on failure.
         */
-       function create($name, $field_type, $attribute1, $attribute2, 
$is_required = 0, $alias = '', $show100 = true, $show100label = 'none') {
+       function create($name, $field_type, $attribute1, $attribute2, 
$is_required = 0, $alias = '', $show100 = true, $show100label = 'none', 
$description = '') {
                //
                //      data validation
                //
@@ -155,17 +156,18 @@ class ArtifactExtraField extends FFError {
                }
 
                db_begin();
-               $result = db_query_params ('INSERT INTO 
artifact_extra_field_list (group_artifact_id, field_name, field_type, 
attribute1, attribute2, is_required, alias, show100, show100label)
-                       VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9)',
+               $result = db_query_params ('INSERT INTO 
artifact_extra_field_list (group_artifact_id, field_name, field_type, 
attribute1, attribute2, is_required, alias, show100, show100label, description)
+                       VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10)',
                                           array ($this->ArtifactType->getID(),
-                                                 htmlspecialchars($name),
-                                                 $field_type,
-                                                 $attribute1,
-                                                 $attribute2,
-                                                 $is_required,
-                                                 $alias,
-                                                 $show100,
-                                                 $show100label));
+                                                         
htmlspecialchars($name),
+                                                         $field_type,
+                                                         $attribute1,
+                                                         $attribute2,
+                                                         $is_required,
+                                                         $alias,
+                                                         $show100,
+                                                         $show100label,
+                                                         $description));
 
                if ($result && db_affected_rows($result) > 0) {
                        $this->clearError();
@@ -275,6 +277,15 @@ class ArtifactExtraField extends FFError {
        }
 
        /**
+        * getDescription - get the description.
+        *
+        * @return      string  The description.
+        */
+       function getDescription() {
+               return $this->data_array['description'];
+       }
+
+       /**
         * getAttribute1 - get the attribute1 field.
         *
         * @return      int     The first attribute.
@@ -395,7 +406,7 @@ class ArtifactExtraField extends FFError {
         * @param       string  $show100label   The label used for the 100 
value if displayed
         * @return      bool    success.
         */
-       function update($name, $attribute1, $attribute2, $is_required = 0, 
$alias = "", $show100 = true, $show100label = 'none') {
+       function update($name, $attribute1, $attribute2, $is_required = 0, 
$alias = "", $show100 = true, $show100label = 'none', $description = '') {
                if (!forge_check_perm ('tracker_admin', 
$this->ArtifactType->Group->getID())) {
                        $this->setPermissionDeniedError();
                        return false;
@@ -428,23 +439,25 @@ class ArtifactExtraField extends FFError {
 
                $result = db_query_params ('UPDATE artifact_extra_field_list
                        SET field_name = $1,
-                       attribute1 = $2,
-                       attribute2 = $3,
-                       is_required = $4,
-                       alias = $5,
-                       show100 = $6,
-                       show100label = $7
-                       WHERE extra_field_id = $8
-                       AND group_artifact_id = $9',
+                       description = $2,
+                       attribute1 = $3,
+                       attribute2 = $4,
+                       is_required = $5,
+                       alias = $6,
+                       show100 = $7,
+                       show100label = $8
+                       WHERE extra_field_id = $9
+                       AND group_artifact_id = $10',
                                           array (htmlspecialchars($name),
-                                                 $attribute1,
-                                                 $attribute2,
-                                                 $is_required,
-                                                 $alias,
-                                                 $show100,
-                                                 $show100label,
-                                                 $this->getID(),
-                                                 
$this->ArtifactType->getID())) ;
+                                                         $description,
+                                                         $attribute1,
+                                                         $attribute2,
+                                                         $is_required,
+                                                         $alias,
+                                                         $show100,
+                                                         $show100label,
+                                                         $this->getID(),
+                                                         
$this->ArtifactType->getID())) ;
                if ($result && db_affected_rows($result) > 0) {
                        return true;
                } else {
diff --git a/src/common/tracker/ArtifactType.class.php 
b/src/common/tracker/ArtifactType.class.php
index 5b10f5c..2069db2 100644
--- a/src/common/tracker/ArtifactType.class.php
+++ b/src/common/tracker/ArtifactType.class.php
@@ -659,7 +659,7 @@ class ArtifactType extends FFError {
                                        $current_ef_todelete->delete(true,true);
                                }
                        }
-                       if 
(!$nef->create(util_unconvert_htmlspecialchars($ef['field_name']), 
$ef['field_type'], $ef['attribute1'], $ef['attribute2'], $ef['is_required'], 
$ef['alias'])) {
+                       if 
(!$nef->create(util_unconvert_htmlspecialchars($ef['field_name']), 
$ef['field_type'], $ef['attribute1'], $ef['attribute2'], $ef['is_required'], 
$ef['alias'], $ef['description'])) {
                                $this->setError('Error Creating New Extra 
Field: '.$nef->getErrorMessage());
                                db_rollback();
                                return false;
diff --git a/src/common/tracker/actions/admin-updates.php 
b/src/common/tracker/actions/admin-updates.php
index 99f84e8..cd65668 100644
--- a/src/common/tracker/actions/admin-updates.php
+++ b/src/common/tracker/actions/admin-updates.php
@@ -5,6 +5,7 @@
  * Copyright 2010 (c) FusionForge Team
  * Copyright 2010 (c) Franck Villaume - Capgemini
  * Copyright 2012-2014, Franck Villaume - TrivialDev
+ * Copyright 2016, Stéphane-Eymeric Bredthauer - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -34,6 +35,7 @@ global $atid;
 //
 if (getStringFromRequest('add_extrafield')) {
        $name = getStringFromRequest('name');
+       $description = getStringFromRequest('description');
        $field_type = getStringFromRequest('field_type');
        $attribute1 = getStringFromRequest('attribute1');
        $attribute2 = getStringFromRequest('attribute2');
@@ -54,7 +56,7 @@ if (getStringFromRequest('add_extrafield')) {
                } else {
                        $show100 = 1;
                }
-               if (!$ab->create($name, $field_type, $attribute1, $attribute2, 
$is_required, $alias, $show100, $show100label)) {
+               if (!$ab->create($name, $field_type, $attribute1, $attribute2, 
$is_required, $alias, $show100, $show100label, $description)) {
                        $error_msg .= _('Error inserting a custom field')._(': 
').$ab->getErrorMessage();
                        $ab->clearError();
                } else {
@@ -227,6 +229,7 @@ if (getStringFromRequest('add_extrafield')) {
 } elseif (getStringFromRequest('update_box')) {
        $id = getStringFromRequest('id');
        $name = getStringFromRequest('name');
+       $description = getStringFromRequest('description');
        $attribute1 = getStringFromRequest('attribute1');
        $attribute2 = getStringFromRequest('attribute2');
        $is_required = getStringFromRequest('is_required');
@@ -245,7 +248,7 @@ if (getStringFromRequest('add_extrafield')) {
                } else {
                        $show100 = 1;
                }
-               if (!$ac->update($name, $attribute1, $attribute2, $is_required, 
$alias, $show100, $show100label)) {
+               if (!$ac->update($name, $attribute1, $attribute2, $is_required, 
$alias, $show100, $show100label, $description)) {
                        $error_msg .= _('Update failed')._(': 
').$ac->getErrorMessage();
                        $ac->clearError();
                } else {
diff --git a/src/common/tracker/include/ArtifactTypeHtml.class.php 
b/src/common/tracker/include/ArtifactTypeHtml.class.php
index eec2e68..aea1696 100644
--- a/src/common/tracker/include/ArtifactTypeHtml.class.php
+++ b/src/common/tracker/include/ArtifactTypeHtml.class.php
@@ -236,6 +236,14 @@ class ArtifactTypeHtml extends ArtifactType {
                        $i = $keys[$k];
                        $post_name = '';
 
+                       $attrs = array();
+                       if (!empty($efarr[$i]['description'])) {
+                               $attrs['title'] = $efarr[$i]['description'];
+                       }
+                       if ($efarr[$i]['is_required'] == 1) {
+                               $attrs['required'] = 'required';
+                       }
+
                        if (!isset($selected[$efarr[$i]['extra_field_id']]))
                                $selected[$efarr[$i]['extra_field_id']] = '';
 
@@ -244,41 +252,41 @@ class ArtifactTypeHtml extends ArtifactType {
                        }
 
                        if ($efarr[$i]['field_type'] == 
ARTIFACT_EXTRAFIELDTYPE_SELECT) {
-                               $str = 
$this->renderSelect($efarr[$i]['extra_field_id'],$selected[$efarr[$i]['extra_field_id']],$efarr[$i]['show100'],$efarr[$i]['show100label'],$show_any,$text_any);
+                               $str = 
$this->renderSelect($efarr[$i]['extra_field_id'],$selected[$efarr[$i]['extra_field_id']],$efarr[$i]['show100'],$efarr[$i]['show100label'],$show_any,$text_any,false,
 $attrs);
 
                        } elseif ($efarr[$i]['field_type'] == 
ARTIFACT_EXTRAFIELDTYPE_CHECKBOX) {
 
-                               $str = 
$this->renderCheckbox($efarr[$i]['extra_field_id'],$selected[$efarr[$i]['extra_field_id']],$efarr[$i]['show100'],$efarr[$i]['show100label']);
+                               $str = 
$this->renderCheckbox($efarr[$i]['extra_field_id'],$selected[$efarr[$i]['extra_field_id']],$efarr[$i]['show100'],$efarr[$i]['show100label'],
 $attrs);
 
                        } elseif ($efarr[$i]['field_type'] == 
ARTIFACT_EXTRAFIELDTYPE_RADIO) {
 
-                               $str = 
$this->renderRadio($efarr[$i]['extra_field_id'],$selected[$efarr[$i]['extra_field_id']],$efarr[$i]['show100'],$efarr[$i]['show100label'],$show_any,$text_any);
+                               $str = 
$this->renderRadio($efarr[$i]['extra_field_id'],$selected[$efarr[$i]['extra_field_id']],$efarr[$i]['show100'],$efarr[$i]['show100label'],$show_any,$text_any,
 $attrs);
 
                        } elseif ($efarr[$i]['field_type'] == 
ARTIFACT_EXTRAFIELDTYPE_TEXT ||
                                        $efarr[$i]['field_type'] == 
ARTIFACT_EXTRAFIELDTYPE_INTEGER) {
 
-                               $str = 
$this->renderTextField($efarr[$i]['extra_field_id'],$selected[$efarr[$i]['extra_field_id']],$efarr[$i]['attribute1'],$efarr[$i]['attribute2']);
+                               $str = 
$this->renderTextField($efarr[$i]['extra_field_id'],$selected[$efarr[$i]['extra_field_id']],$efarr[$i]['attribute1'],$efarr[$i]['attribute2'],
 $attrs);
                                if ($mode == 'QUERY') {
                                        $post_name =  ' <i>'._('(%% for 
wildcards)').'</i>&nbsp;&nbsp;&nbsp;';
                                }
 
                        } elseif ($efarr[$i]['field_type'] == 
ARTIFACT_EXTRAFIELDTYPE_TEXTAREA) {
 
-                               $str = 
$this->renderTextArea($efarr[$i]['extra_field_id'],$selected[$efarr[$i]['extra_field_id']],$efarr[$i]['attribute1'],$efarr[$i]['attribute2']);
+                               $str = 
$this->renderTextArea($efarr[$i]['extra_field_id'],$selected[$efarr[$i]['extra_field_id']],$efarr[$i]['attribute1'],$efarr[$i]['attribute2'],
 $attrs);
                                if ($mode == 'QUERY') {
                                        $post_name =  ' <i>'._('(%% for 
wildcards)').'</i>';
                                }
 
                        } elseif ($efarr[$i]['field_type'] == 
ARTIFACT_EXTRAFIELDTYPE_MULTISELECT) {
 
-                               $str = $this->renderMultiSelectBox 
($efarr[$i]['extra_field_id'],$selected[$efarr[$i]['extra_field_id']],$efarr[$i]['show100'],$efarr[$i]['show100label']);
+                               $str = $this->renderMultiSelectBox 
($efarr[$i]['extra_field_id'],$selected[$efarr[$i]['extra_field_id']],$efarr[$i]['show100'],$efarr[$i]['show100label'],
 $attrs);
 
                        } elseif ($efarr[$i]['field_type'] == 
ARTIFACT_EXTRAFIELDTYPE_STATUS) {
 
                                // Get the allowed values from the workflow.
                                $atw = new ArtifactWorkflow($this, 
$efarr[$i]['extra_field_id']);
 
-                               // Special treatement for the initial step 
(Submit).
+                               // Special treatment for the initial step 
(Submit).
                                // In this case, the initial value is the first 
value.
                                if ($selected === true) {
                                        $selected_node = 100;
@@ -290,11 +298,11 @@ class ArtifactTypeHtml extends ArtifactType {
 
                                $allowed = $atw->getNextNodes($selected_node);
                                $allowed[] = $selected_node;
-                               $str = 
$this->renderSelect($efarr[$i]['extra_field_id'],$selected_node,$status_show_100,$text_100,$show_any,$text_any,
 $allowed);
+                               $str = 
$this->renderSelect($efarr[$i]['extra_field_id'],$selected_node,$status_show_100,$text_100,$show_any,$text_any,
 $allowed, $attrs);
 
                        } elseif ($efarr[$i]['field_type'] == 
ARTIFACT_EXTRAFIELDTYPE_RELATION) {
 
-                               $str = 
$this->renderRelationField($efarr[$i]['extra_field_id'],$selected[$efarr[$i]['extra_field_id']],$efarr[$i]['attribute1'],$efarr[$i]['attribute2']);
+                               $str = 
$this->renderRelationField($efarr[$i]['extra_field_id'],$selected[$efarr[$i]['extra_field_id']],$efarr[$i]['attribute1'],$efarr[$i]['attribute2'],
 $attrs);
                                if ($mode == 'UPDATE') {
                                        $post_name = 
html_image('ic/forum_edit.gif','37','15',array('title'=>"Click to edit", 
'alt'=>"Click to edit", 'onclick'=>"switch2edit(this, 'show$i', 'edit$i')"));
                                }
@@ -545,9 +553,10 @@ class ArtifactTypeHtml extends ArtifactType {
         * @param       bool            $show_any
         * @param       string          $text_any
         * @param       bool            $allowed
+        * @param       array           $attrs
         * @return string HTML code for the box and choices
         */
-       function renderSelect 
($extra_field_id,$checked='xzxz',$show_100=false,$text_100='none',$show_any=false,$text_any='Any',
 $allowed=false) {
+       function renderSelect 
($extra_field_id,$checked='xzxz',$show_100=false,$text_100='none',$show_any=false,$text_any='Any',
 $allowed=false, $attrs = array ()) {
                if ($text_100 == 'none'){
                        $text_100=_('None');
                }
@@ -558,7 +567,7 @@ class ArtifactTypeHtml extends ArtifactType {
                        $keys[$i]=$arr[$i]['element_id'];
                        $vals[$i]=$arr[$i]['element_name'];
                }
-               return html_build_select_box_from_arrays 
($keys,$vals,'extra_fields['.$extra_field_id.']',$checked,$show_100,$text_100,$show_any,$text_any,
 $allowed);
+               return html_build_select_box_from_arrays 
($keys,$vals,'extra_fields['.$extra_field_id.']',$checked,$show_100,$text_100,$show_any,$text_any,
 $allowed, $attrs);
        }
 
        /**
@@ -570,9 +579,10 @@ class ArtifactTypeHtml extends ArtifactType {
         * @param       string  $text_100       What $string to call the '100 
row'
         * @param       bool    $show_any
         * @param       string  $text_any
+        * @param       array   $attrs          Array of other attributes
         * @return      string  HTML code using radio buttons
         */
-       function renderRadio 
($extra_field_id,$checked='xzxz',$show_100=false,$text_100='none',$show_any=false,$text_any='Any')
 {
+       function renderRadio 
($extra_field_id,$checked='xzxz',$show_100=false,$text_100='none',$show_any=false,$text_any='Any',
 $attrs = array()) {
                $arr = $this->getExtraFieldElements($extra_field_id);
                $keys = array();
                $vals = array();
@@ -580,7 +590,7 @@ class ArtifactTypeHtml extends ArtifactType {
                        $keys[$i]=$arr[$i]['element_id'];
                        $vals[$i]=$arr[$i]['element_name'];
                }
-               return html_build_radio_buttons_from_arrays 
($keys,$vals,'extra_fields['.$extra_field_id.']',$checked,$show_100,$text_100,$show_any,$text_any);
+               return html_build_radio_buttons_from_arrays 
($keys,$vals,'extra_fields['.$extra_field_id.']',$checked,$show_100,$text_100,$show_any,$text_any,$attrs);
        }
 
        /**
@@ -590,26 +600,38 @@ class ArtifactTypeHtml extends ArtifactType {
         * @param       array           $checked        The items that should 
be checked
         * @param       bool|string     $show_100       Whether to show the 
'100 row'
         * @param       string          $text_100       What to call the '100 
row'
+        * @param       array           $attrs          Array of other 
attributes
         * @return string radio buttons
         */
-       function renderCheckbox 
($extra_field_id,$checked=array(),$show_100=false,$text_100='none') {
+       function renderCheckbox 
($extra_field_id,$checked=array(),$show_100=false,$text_100='none', $attrs = 
array()) {
                if ($text_100 == 'none'){
                        $text_100=_('None');
                }
                if (!$checked || !is_array($checked)) {
                        $checked=array();
                }
+               if (!empty($attrs['title'])) {
+                       $attrs['title'] = util_html_secure($attrs['title']);
+               }
                $arr = $this->getExtraFieldElements($extra_field_id);
                $return = '';
                if ($show_100) {
-                       $return .= '
-                               <input type="checkbox" 
name="extra_fields['.$extra_field_id.'][]" value="100" '.
-                       ((in_array(100,$checked)) ? 'checked="checked"' : 
'').'/> '.$text_100.'<br />';
+                       $chk_attrs = array('type'=>'checkbox', 
'name'=>'extra_fields['.$extra_field_id.'][]', 'id'=>'extra_fields100', 
'value'=>'100');
+                       if (in_array('100', $checked)) {
+                               $chk_attrs['checked']='checked';
+                       }
+                       $return .= html_e('input', 
array_merge($attrs,$chk_attrs));
+                       $return .= html_e('label', 
array_merge(array('for'=>'extra_fields100'), (empty($attrs['title']) ? array() 
: array('title'=>$attrs['title']))), $text_100);
+                       $return .= html_e('br');
                }
                for ($i=0; $i<count($arr); $i++) {
-                       $return .= '
-                               <input type="checkbox" 
name="extra_fields['.$extra_field_id.'][]" value="'.$arr[$i]['element_id'].'" '.
-                       ((in_array($arr[$i]['element_id'],$checked)) ? 
'checked="checked"' : '').'/> '.$arr[$i]['element_name'].'<br />';
+                       $chk_attrs = array('type'=>'checkbox', 
'name'=>'extra_fields['.$extra_field_id.'][]', 
'id'=>'extra_fields'.$arr[$i]['element_id'], 'value'=>$arr[$i]['element_id']);
+                       if (in_array($arr[$i]['element_id'],$checked)) {
+                               $chk_attrs['checked']='checked';
+                       }
+                       $return .= html_e('input', 
array_merge($attrs,$chk_attrs));
+                       $return .= html_e('label', 
array_merge(array('for'=>'extra_fields'.$arr[$i]['element_id']), 
(empty($attrs['title']) ? array() : array('title'=>$attrs['title']))), 
$arr[$i]['element_name']);
+                       $return .= html_e('br');
                }
                return $return;
        }
@@ -621,9 +643,10 @@ class ArtifactTypeHtml extends ArtifactType {
         * @param       array           $checked        The items that should 
be checked
         * @param       bool|string     $show_100       Whether to show the 
'100 row'
         * @param       string          $text_100       What to call the '100 
row'
+        * @param       array           $attrs          Array of other 
attributes
         * @return      string          radio multiselectbox
         */
-       function renderMultiSelectBox 
($extra_field_id,$checked=array(),$show_100=false,$text_100='none') {
+       function renderMultiSelectBox 
($extra_field_id,$checked=array(),$show_100=false,$text_100='none', $attrs = 
array()) {
                if (!$checked) {
                        $checked=array();
                }
@@ -638,7 +661,7 @@ class ArtifactTypeHtml extends ArtifactType {
                        $vals[]=$arr[$i]['element_name'];
                }
                $size = min( count($arr)+1, 15);
-                       return 
html_build_multiple_select_box_from_arrays($keys,$vals,"extra_fields[$extra_field_id][]",$checked,$size,$show_100,$text_100);
+                       return 
html_build_multiple_select_box_from_arrays($keys,$vals,"extra_fields[$extra_field_id][]",$checked,$size,$show_100,$text_100,
 $attrs);
        }
 
        /**
@@ -648,23 +671,24 @@ class ArtifactTypeHtml extends ArtifactType {
         * @param       string  $contents       The data for this field.
         * @param       string  $size
         * @param       string  $maxlength
+        * @param       array   $attrs          Array of other attributes
         * @return      string  HTML code of corresponding input tag.
         */
-       function renderTextField ($extra_field_id, $contents, $size, 
$maxlength) {
-               return '
-                       <input type="text" 
name="extra_fields['.$extra_field_id.']" value="'.$contents.'" size="'.$size.'" 
maxlength="'.$maxlength.'"/>';
+       function renderTextField ($extra_field_id, $contents, $size, 
$maxlength, $attrs = array()) {
+               return html_e('input', array_merge(array( 'type'=>'text', 
'name'=>'extra_fields['.$extra_field_id.']', 'value'=>$contents, 'size'=>$size, 
'maxlength'=>$maxlength)));
        }
 
-       /**
+       /**()
         * renderRelationField - this function builds a relation field.
         *
         * @param       int     $extra_field_id The ID of this field.
         * @param       string  $contents       The data for this field.
         * @param       string  $size
         * @param       string  $maxlength
+        * @param       array   $attrs          Array of other attributes
         * @return      string  text area and data.
         */
-       function renderRelationField 
($extra_field_id,$contents,$size,$maxlength) {
+       function renderRelationField 
($extra_field_id,$contents,$size,$maxlength, $attrs = array()) {
                $arr = $this->getExtraFieldElements($extra_field_id);
                for ($i=0; $i<count($arr); $i++) {
                        $keys[$i]=$arr[$i]['element_id'];
@@ -673,9 +697,9 @@ class ArtifactTypeHtml extends ArtifactType {
                // 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);
-               return '
-                       <div id="edit'.$extra_field_id.'" style="display: 
none;" title="'._('Tip: Enter a space-separated list of artifact ids ([#NNN] 
also accepted)').'" >'.$edit_contents.'</div>
-                       <div id="show'.$extra_field_id.'" style="display: 
block;">'.$html_contents.'</div>';
+               $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);
+               $return .=html_e('div',array_merge(array( 
'id'=>'show'.$extra_field_id, 'style'=>'display: block'), $attrs), 
$html_contents);
+               return $return;
        }
 
        /**
@@ -685,11 +709,11 @@ class ArtifactTypeHtml extends ArtifactType {
         * @param       string  $contents       The data for this field.
         * @param       string  $rows
         * @param       string  $cols
+        * @param       array   $attrs          Array of other attributes
         * @return      string  text area and data.
         */
-       function renderTextArea ($extra_field_id,$contents,$rows,$cols) {
-               return '
-                       <textarea name="extra_fields['.$extra_field_id.']" 
rows="'.$rows.'" cols="'.$cols.'">'.$contents.'</textarea>';
+       function renderTextArea ($extra_field_id,$contents,$rows,$cols, $attrs 
= array()) {
+               return html_e('textarea', 
array_merge(array('name'=>'extra_fields['.$extra_field_id.']', 'rows'=>$rows, 
'cols'=>$cols), $attrs), $contents);
        }
 
        function technicianBox 
($name='assigned_to[]',$checked='xzxz',$show_100=true,$text_100='none',$extra_id='-1',$extra_name='',$multiple=false)
 {
diff --git a/src/common/tracker/views/form-addextrafield.php 
b/src/common/tracker/views/form-addextrafield.php
index 6db5f28..1d97446 100644
--- a/src/common/tracker/views/form-addextrafield.php
+++ b/src/common/tracker/views/form-addextrafield.php
@@ -4,6 +4,7 @@
  *
  * Copyright 2010 (c) FusionForge Team
  * Copyright 2014-2015, Franck Villaume - TrivialDev
+ * Copyright 2016, Stéphane-Eymeric Bredthauer - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -96,55 +97,71 @@ if ($rows > 0) {
 
 echo "<h2>"._('Add New Custom Field')."</h2>";
 echo $HTML->openForm(array('action' => 
'/tracker/admin/?group_id='.$group_id.'&atid='.$ath->getID(), 'method' => 
'post'));
-?>
-<p>
-<input type="hidden" name="add_extrafield" value="y" />
-<strong><?php echo _('Custom Field Name').utils_requiredField()._(':'); 
?></strong><br />
-<input type="text" name="name" value="" size="15" maxlength="30" 
required="required" />
-</p>
-<p>
-<strong><?php echo _('Field alias')._(':'); ?></strong><br />
-<input type="text" name="alias" value="" size="15" maxlength="30" />
-</p>
-
-<p>
-<strong><?php  echo _('Type of custom field')._(':'); ?></strong><br />
-<input type="radio" name="field_type" value="1" required="required" /> <?php 
echo _('Select Box'); ?><br />
-<input type="radio" name="field_type" value="2" /> <?php echo _('Check Box'); 
?><br />
-<input type="radio" name="field_type" value="3" /> <?php echo _('Radio 
Buttons'); ?><br />
-<input type="radio" name="field_type" value="4" /> <?php echo _('Text Field'); 
?><br />
-<input type="radio" name="field_type" value="5" /> <?php echo _('Multi-Select 
Box'); ?><br />
-<input type="radio" name="field_type" value="6" /> <?php echo _('Text Area'); 
?><br />
-<?php if (!$ath->usesCustomStatuses()) { ?>
-<input type="radio" name="field_type" value="7" /> <?php echo _('Status'); 
?><br />
-<?php } ?>
-<!--<input type="radio" name="field_type" value="8" /> <?php echo _('Box type 
technician'); ?><br />-->
-<input type="radio" name="field_type" value="9" /> <?php echo _('Relation 
between artifacts'); ?><br />
-<p>
-<?php echo _('Text Fields and Text Areas need to have Size/Maxlength and 
Rows/Cols defined, respectively.'); ?><br />
-<?php echo _('Text Field Size/Text Area Rows'); ?>
-       <input type="text" name="attribute1" value="20" size="2" maxlength="2" 
/><br />
-<?php echo _('Text Field Maxlength/Text Area Columns'); ?>
-       <input type="text" name="attribute2" value="80" size="2" maxlength="2" 
/><br />
-<?php echo _('Hide the default none value'); ?>
-       <input type="checkbox" name="hide100" /><br />
-<?php echo _('Label for the none value'); ?>
-       <input type="text" name="show100label" size="30" value="<?php echo 
_('none') ?>" /><br />
-</p>
-<?php
+echo html_ao('p');
+echo html_e('input', array('type'=>'hidden', 'name'=>'add_extrafield', 
'value'=>'y')); 
+
+echo html_e('strong', array(), _('Custom Field 
Name').utils_requiredField()._(':')).html_e('br');
+echo html_e('input', array('type'=>'text', 'name'=>'name', 'value'=>'', 
size=>'15', 'maxlength'=>'30', 'required'=>'required'));
+echo html_ac(html_ap() - 1);
+
+echo html_ao('p');
+echo html_e('strong', array(), _('Field alias')._(':')).html_e('br');
+echo html_e('input', array('type'=>'text', 'name'=>'alias', 'value'=>'', 
size=>'15', 'maxlength'=>'30'));
+echo html_ac(html_ap() - 1);
+
+echo html_ao('p');
+echo html_e('strong', array(), _('Description')._(':')).html_e('br');
+echo html_e('input', array('type'=>'text', 'name'=>'description', 'value'=>'', 
size=>'50', 'maxlength'=>'255'));
+echo html_ac(html_ap() - 1);
+
+echo html_ao('p');
+echo html_e('strong', array(), _('Type of custom 
field').utils_requiredField()._(':')).html_e('br');
+
+$vals = array(ARTIFACT_EXTRAFIELDTYPE_SELECT , 
ARTIFACT_EXTRAFIELDTYPE_CHECKBOX, ARTIFACT_EXTRAFIELDTYPE_RADIO, 
ARTIFACT_EXTRAFIELDTYPE_TEXT, ARTIFACT_EXTRAFIELDTYPE_MULTISELECT, 
ARTIFACT_EXTRAFIELDTYPE_TEXTAREA, ARTIFACT_EXTRAFIELDTYPE_STATUS, 8, 
ARTIFACT_EXTRAFIELDTYPE_RELATION);
+// 8 = ARTIFACT_EXTRAFIELDTYPE_ASSIGNEE
+// ARTIFACT_EXTRAFIELDTYPE_INTEGER, ARTIFACT_EXTRAFIELDTYPE_FORMULA, 
ARTIFACT_EXTRAFIELDTYPE_DATETIME, ARTIFACT_EXTRAFIELDTYPE_USER
+$texts = array( _('Select Box'), _('Check Box'), _('Radio Buttons'), _('Text 
Field'), _('Multi-Select Box'), _('Text Area'), _('Status'), _('Box type 
technician'), _('Relation between artifacts'));
+
+// ARTIFACT_EXTRAFIELDTYPE_ASSIGNEE not used
+unset($vals[7]);
+unset($texts[7]);
+
+if ($ath->usesCustomStatuses()) {
+       unset($vals[ARTIFACT_EXTRAFIELDTYPE_STATUS-1]);
+       unset($texts[ARTIFACT_EXTRAFIELDTYPE_STATUS-1]);
+}
+// re-index
+$vals = array_values($vals);
+$texts = array_values($texts);
+
+echo html_build_radio_buttons_from_arrays( $vals, $texts, 'field_type', '', 
false, '', false ,'', array('required'=>'required') );
+echo html_ac(html_ap() - 1);
+
+echo html_ao('p');
+echo _('Text Fields and Text Areas need to have Size/Maxlength and Rows/Cols 
defined, respectively.').html_e('br');
+echo _('Text Field Size/Text Area Rows');
+echo html_e('input', array('type'=>'text', 'name'=>'attribute1', 
'value'=>'20', size=>'2', 'maxlength'=>'2')).html_e('br');
+echo _('Text Field Maxlength/Text Area Columns');
+echo html_e('input', array('type'=>'text', 'name'=>'attribute2', 
'value'=>'80', size=>'2', 'maxlength'=>'2')).html_e('br');
+echo _('Hide the default none value');
+echo html_build_checkbox('hide100','',false).html_e('br');
+echo _('Label for the none value');
+echo html_e('input', array('type'=>'text', 'name'=>'show100label', 
'value'=>_('none'), size=>'30')).html_e('br');
+echo html_ac(html_ap() - 1);
+
 echo $HTML->warning_msg(_('Warning: this add new custom field'));
-?>
-<p>
-<input type="submit" name="post_changes" value="<?php echo _('Add Custom 
Field') ?>" />
-</p>
-<?php
+
+echo html_ao('p');
+echo html_e('input', array('type'=>'submit', 'name'=>'post_changes', 
'value'=>_('Add Custom Field')));
+echo html_ac(html_ap() - 1);
+
 echo $HTML->closeForm();
-echo "<h2>"._('Custom Field Rendering Template')."</h2>";
 
-echo "<p>";
-echo 
util_make_link('/tracker/admin/?edittemplate=1&group_id='.$group_id.'&atid='.$ath->getID(),
 _('Edit template')).'<br />';
+echo html_e('h2', array(), _('Custom Field Rendering Template'));
+echo html_ao('p');
+echo 
util_make_link('/tracker/admin/?edittemplate=1&group_id='.$group_id.'&atid='.$ath->getID(),
 _('Edit template')).html_e('br');
 echo 
util_make_link('/tracker/admin/?deletetemplate=1&group_id='.$group_id.'&atid='.$ath->getID(),
 _('Delete template'));
-echo "</p>";
+echo html_ac(html_ap() - 1);
 
 $ath->footer();
 
diff --git a/src/common/tracker/views/form-updateextrafield.php 
b/src/common/tracker/views/form-updateextrafield.php
index ee000da..94550fd 100644
--- a/src/common/tracker/views/form-updateextrafield.php
+++ b/src/common/tracker/views/form-updateextrafield.php
@@ -40,76 +40,66 @@ if (!$ac || !is_object($ac)) {
 } elseif ($ac->isError()) {
        $error_msg .= $ac->getErrorMessage();
 } else {
-       ?>
-       <p>
-       <strong><?php echo _('Type of custom field')._(': 
').$ac->getTypeName(); ?></strong></p>
-       <?php
+       echo html_ao('p');
+       echo html_e('strong', array(), _('Type of custom field')._(': 
').$ac->getTypeName());
+       echo html_ac(html_ap() - 1);
        echo $HTML->openForm(array('action' => 
'/tracker/admin/?group_id='.$group_id.'&id='.$id.'&atid='.$ath->getID(), 
'method' => 'post'));
-       ?>
-       <input type="hidden" name="update_box" value="y" />
-       <input type="hidden" name="id" value="<?php echo $ac->getID(); ?>" />
-       <p>
-               <label for="name">
-               <strong><?php echo _('Custom Field Name')._(':'); 
?></strong><br />
-               </label>
-               <input id="name" type="text" name="name" value="<?php echo 
$ac->getName(); ?>" required="required" />
-       </p>
-       <p>
-               <?php if ($ac->getType() == ARTIFACT_EXTRAFIELDTYPE_TEXTAREA) { 
?>
-               <label for="attribute1">
-               <b><?php echo _('Text Area Rows'); ?></b><br />
-               </label>
-               <input id="attribute1" type="text" name="attribute1" 
value="<?php echo $ac->getAttribute1(); ?>" size="2" maxlength="2" />
-       </p>
-       <p>
-               <label for="attribute2">
-               <b><?php echo _('Text Area Columns'); ?></b><br />
-               </label>
-               <input id="attribute2" type="text" name="attribute2" 
value="<?php echo $ac->getAttribute2(); ?>" size="2" maxlength="2" />
-               <?php } elseif ($ac->getType() == ARTIFACT_EXTRAFIELDTYPE_TEXT 
||
-                                       $ac->getType() == 
ARTIFACT_EXTRAFIELDTYPE_RELATION) {?>
-               <label for="attribute1">
-               <b><?php echo _('Text Field Size'); ?></b><br />
-               </label>
-               <input id="attribute1" type="text" name="attribute1" 
value="<?php echo $ac->getAttribute1(); ?>" size="2" maxlength="2" />
-               </p>
-               <p>
-               <label for="attribute2">
-               <b><?php echo _('Text Field Maxlength'); ?></b><br />
-               <input id="attribute2" type="text" name="attribute2" 
value="<?php echo $ac->getAttribute2(); ?>" size="2" maxlength="2" />
-               <?php } else { ?>
-               <input type="hidden" name="attribute1" value="0" />
-               <input type="hidden" name="attribute2" value="0" />
-               <label for="hide100">
-               <b><?php echo _('Hide the default none value'); ?></b><br />
-               </label>
-               <input type="checkbox" name="hide100" <?php if 
(!$ac->getShow100()) { echo 'checked="checked" '; } ?>/>
-               </p>
-               <p>
-               <label for="show100label">
-               <b><?php echo _('Label for the none value'); ?></b><br />
-               <input type="text" name="show100label" size="30" value="<?php 
$ac->getShow100label() ?>" />
-               </p>
-               <?php } ?>
-       </p>
-       <p>
-               <label for="alias">
-               <strong><?php echo _('Field alias')._(':'); ?></strong><br />
-               </label>
-               <input id="alias" type="text" name="alias" value="<?php echo 
$ac->getAlias(); ?>" />
-       </p>
-       <p><input id="is_required" type="checkbox" name="is_required" <?php if 
($ac->isRequired()) echo 'checked="checked"'; ?> />
-       <?php echo _('Field is mandatory')?></p>
-       <label for="is_required">
-       <?php
+
+       echo html_e('input', array('type'=>'hidden', 'name'=>'update_box', 
'value'=>'y'));
+       echo html_e('input', array('type'=>'hidden', 'name'=>'id', 'value'=> 
$ac->getID()));
+
+       echo html_ao('p');
+       echo html_e('label', array('for'=>'name'), html_e('strong', array(), 
_('Custom Field Name')._(':')).html_e('br'));
+       echo html_e('input', array('type'=>'text', 'id'=>'name', 
'name'=>'name', 'value'=>$ac->getName(), size=>'15', 'maxlength'=>'30', 
'required'=>'required'));
+       echo html_ac(html_ap() - 1);
+
+       echo html_ao('p');
+       echo html_e('label', array('for'=>'description'), html_e('strong', 
array(), _('Description')._(':')).html_e('br'));
+       echo html_e('input', array('type'=>'text', 'name'=>'description', 
'value'=>$ac->getDescription(), size=>'50', 'maxlength'=>'255'));
+       echo html_ac(html_ap() - 1);
+
+       echo html_ao('p');
+       if ($ac->getType() == ARTIFACT_EXTRAFIELDTYPE_TEXTAREA) {
+               echo html_e('label', array('for'=>'attribute1'), html_e('b', 
array(), _('Text Area Columns')).html_e('br'));
+               echo html_e('input', array('type'=>'text', 'id'=>'attribute1', 
'name'=>'attribute1', 'value'=>$ac->getAttribute1(), size=>'2', 
'maxlength'=>'2'));
+               echo html_ac(html_ap() - 1);
+               echo html_ao('p');
+               echo html_e('label', array('for'=>'attribute2'), html_e('b', 
array(), _('Text Area Columns')).html_e('br'));
+               echo html_e('input', array('type'=>'text', 'id'=>'attribute2', 
'name'=>'attribute2', 'value'=>$ac->getAttribute2(), size=>'2', 
'maxlength'=>'2'));
+       } elseif ($ac->getType() == ARTIFACT_EXTRAFIELDTYPE_TEXT || 
$ac->getType() == ARTIFACT_EXTRAFIELDTYPE_RELATION) {
+               echo html_e('label', array('for'=>'attribute1'), html_e('b', 
array(), _('Text Field Size')).html_e('br'));
+               echo html_e('input', array('type'=>'text', 'id'=>'attribute1', 
'name'=>'attribute1', 'value'=>$ac->getAttribute1(), size=>'2', 
'maxlength'=>'2'));
+               echo html_ac(html_ap() - 1);
+               echo html_ao('p');
+               echo html_e('label', array('for'=>'attribute2'), html_e('b', 
array(), _('Text Field Maxlength')).html_e('br'));
+               echo html_e('input', array('type'=>'text', 'id'=>'attribute2', 
'name'=>'attribute2', 'value'=>$ac->getAttribute2(), size=>'2', 
'maxlength'=>'2'));
+       } else {
+               echo html_e('input', array('type'=>'hidden', 
'name'=>'attribute1', 'value'=>'0'));
+               echo html_e('input', array('type'=>'hidden', 
'name'=>'attribute2', 'value'=>'0'));
+               echo html_e('label', array('for'=>'hide100'), html_e('b', 
array(), _('Hide the default none value')).html_e('br'));
+               echo html_build_checkbox('hide100','',!$ac->getShow100());
+               echo html_ac(html_ap() - 1);
+               echo html_ao('p');
+               echo html_e('label', array('for'=>'show100label'), html_e('b', 
array(), _('Label for the none value')).html_e('br'));
+               echo html_e('input', array('type'=>'text', 
'name'=>'show100label', 'value'=>$ac->getShow100label(), size=>'30'));
+       }
+       echo html_ac(html_ap() - 1);
+
+       echo html_ao('p');
+       echo html_e('label', array('for'=>'alias'), html_e('strong', array(), 
_('Field alias')._(':')).html_e('br'));
+       echo html_e('input', array('type'=>'text', 'id'=>'alias', 
'name'=>'alias', 'value'=>$ac->getAlias(),  size=>'15', 'maxlength'=>'30'));
+       echo html_ac(html_ap() - 1);
+
+       echo html_ao('p');
+       echo html_build_checkbox('is_required','',$ac->isRequired());
+       echo html_e('label', array('for'=>'is_required'), _('Field is 
mandatory'));
+       echo html_ac(html_ap() - 1);
+
        echo $HTML->warning_msg(_('It is not recommended that you change the 
custom field name because other things are dependent upon it. When you change 
the custom field name, all related items will be changed to the new name.'));
-       ?>
-       </label>
-       </p>
-       <p>
-       <input type="submit" name="post_changes" value="<?php echo _('Submit') 
?>" />
-       </p>
-       <?php
+
+       echo html_ao('p');
+       echo html_e('input', array('type'=>'submit', 'name'=>'post_changes', 
'value'=>_('Submit')));
+       echo html_ac(html_ap() - 1);
        echo $HTML->closeForm();
 }
 
diff --git a/src/db/20160519-artifact_extra_field_list-description.sql 
b/src/db/20160519-artifact_extra_field_list-description.sql
new file mode 100644
index 0000000..5dbded8
--- /dev/null
+++ b/src/db/20160519-artifact_extra_field_list-description.sql
@@ -0,0 +1,2 @@
+ALTER TABLE artifact_extra_field_list
+   ADD COLUMN description text NOT NULL DEFAULT '';
\ No newline at end of file
diff --git a/src/www/tracker/admin/index.php b/src/www/tracker/admin/index.php
index 144f90a..63addd6 100644
--- a/src/www/tracker/admin/index.php
+++ b/src/www/tracker/admin/index.php
@@ -6,6 +6,7 @@
  * Copyright 2010, FusionForge Team
  * Copyright (C) 2012 Alain Peyrat - Alcatel-Lucent
  * Copyright 2013-2014, Franck Villaume - TrivialDev
+ * Copyright 2016, Stéphane-Eymeric Bredthauer - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -24,6 +25,8 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+
+
 require_once '../../env.inc.php';
 require_once $gfcommon.'include/pre.php';
 require_once $gfcommon.'tracker/Artifact.class.php';

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

commit ebf064ce09092d41504d4f124699c9c91a1e2b2b
Author: Stéphane-Eymeric Bredthauer <[email protected]>
Date:   Sun May 22 17:59:34 2016 +0200

    html utils: Add 'extra attributs' parameter to all html_build_ functions

diff --git a/src/www/include/html.php b/src/www/include/html.php
index fb8b07c..acfcd1b 100644
--- a/src/www/include/html.php
+++ b/src/www/include/html.php
@@ -9,6 +9,7 @@
  * Copyright 2011-2016, Franck Villaume - TrivialDev
  * Copyright © 2011, 2012
  *     Thorsten “mirabilos” Glaser <[email protected]>
+ * Copyright 2016, Stéphane-Eymeric Bredthauer - TrivalDev
  *
  * This file is part of FusionForge. FusionForge is free software;
  * you can redistribute it and/or modify it under the terms of the
@@ -240,19 +241,19 @@ function html_get_timezone_popup($title = 'timezone', 
$selected = 'xzxz') {
 /**
  * html_build_select_box_from_assoc() - Takes one assoc array and returns a 
pop-up box.
  *
- * @param      array           $arr            An array of items to use.
+ * @param      array           $arr                    An array of items to 
use.
  * @param      string          $select_name    The name you want assigned to 
this form element.
  * @param      string          $checked_val    The value of the item that 
should be checked.
- * @param      bool            $swap           Whether we should swap the keys 
/ names.
- * @param      bool            $show_100       Whether or not to show the '100 
row'.
- * @param      string          $text_100       What to call the '100 row' 
defaults to none.
- * @param      bool            $show_any       Whether or not to show the 'Any 
row'.
- * @param      string          $text_any       What to call the 'Any row' 
defaults to any.
- * @param      bool|array      $allowed        Array of all allowed values 
from the full list.
- * @param      array           $html_params    Array of other html param for 
an element.
+ * @param      bool            $swap                   Whether we should swap 
the keys / names.
+ * @param      bool            $show_100               Whether or not to show 
the '100 row'.
+ * @param      string          $text_100               What to call the '100 
row' defaults to none.
+ * @param      bool            $show_any               Whether or not to show 
the 'Any row'.
+ * @param      string          $text_any               What to call the 'Any 
row' defaults to any.
+ * @param      bool|array      $allowed                Array of all allowed 
values from the full list.
+ * @param      array           $attrs                  Array of other 
attributes for this select element.
  * @return     string
  */
-function html_build_select_box_from_assoc($arr, $select_name, $checked_val = 
'xzxz', $swap = false, $show_100 = false, $text_100 = 'None', $show_any = 
false, $text_any = 'any', $allowed = false, $html_params = array()) {
+function html_build_select_box_from_assoc($arr, $select_name, $checked_val = 
'xzxz', $swap = false, $show_100 = false, $text_100 = 'None', $show_any = 
false, $text_any = 'any', $allowed = false, $attrs = array()) {
        if ($swap) {
                $keys = array_values($arr);
                $vals = array_keys($arr);
@@ -260,43 +261,31 @@ function html_build_select_box_from_assoc($arr, 
$select_name, $checked_val = 'xz
                $vals = array_values($arr);
                $keys = array_keys($arr);
        }
-       return html_build_select_box_from_arrays($keys, $vals, $select_name, 
$checked_val, $show_100, $text_100, $show_any, $text_any, $allowed, 
$html_params);
+       return html_build_select_box_from_arrays($keys, $vals, $select_name, 
$checked_val, $show_100, $text_100, $show_any, $text_any, $allowed, $attrs);
 }
 
 /**
  * html_build_select_box_from_array() - Takes one array, with the first array 
being the "id"
  * or value and the array being the text you want displayed.
  *
- * @param      array   $vals           An array of items to use.
+ * @param      array   $vals                   An array of items to use.
  * @param      string  $select_name    The name you want assigned to this form 
element.
  * @param      string  $checked_val    The value of the item that should be 
checked.
- * @param      int     $samevals
+ * @param      int             $samevals
+ * @param      array   $attrs                  Array of other attributes for 
this select element.
  * @return     string
  */
-function html_build_select_box_from_array($vals, $select_name, $checked_val = 
'xzxz', $samevals = 0) {
-       $return = '
-               <select name="'.$select_name.'">';
+function html_build_select_box_from_array($vals, $select_name, $checked_val = 
'xzxz', $samevals = 0, $attrs = array()) {
 
-       $rows = count($vals);
-
-       for ($i = 0; $i < $rows; $i++) {
-               if ($samevals) {
-                       $return .= "\n\t\t<option value=\"".$vals[$i]."\"";
-                       if ($vals[$i] == $checked_val) {
-                               $return .= ' selected="selected"';
-                       }
-               } else {
-                       $return .= "\n\t\t<option value=\"".$i.'"';
-                       if ($i == $checked_val) {
-                               $return .= ' selected="selected"';
-                       }
-               }
-               $return .= '>'.htmlspecialchars($vals[$i]).'</option>';
+       if ($samevals) {
+               $values = array_values($vals);
+               $texts =  array_values($vals);
+       } else {
+               $values = array_keys($vals);
+               $texts =  array_values($vals);
        }
-       $return .= '
-               </select>';
 
-       return $return;
+       return html_build_select_box_from_arrays($values, $texts, $select_name, 
$checked_val, false, '', false, '', false, $attrs);
 }
 
 /**
@@ -316,10 +305,16 @@ function html_build_select_box_from_array($vals, 
$select_name, $checked_val = 'x
  * @param      string  $text_100       What to call the '100 row' defaults to 
none
  * @param      bool    $show_any       Whether or not to show the 'Any row'
  * @param      string  $text_any       What to call the 'Any row' defaults to 
any
+ * @param      array   $attrs          Array of other attributes
  * @return     string
  */
 function html_build_radio_buttons_from_arrays($vals, $texts, $select_name, 
$checked_val = 'xzxz',
-                                                                               
          $show_100 = true, $text_100 = 'none', $show_any = false, $text_any = 
'any') {
+                                                                               
          $show_100 = true, $text_100 = 'none', $show_any = false,
+                                                                               
          $text_any = 'any', $attrs = array()) {
+
+       $attrs['type'] = 'radio';
+       $attrs['name'] = $select_name;
+
        if ($text_100 == 'none') {
                $text_100 = _('None');
        }
@@ -332,13 +327,23 @@ function html_build_radio_buttons_from_arrays($vals, 
$texts, $select_name, $chec
 
        //we don't always want the default Any row shown
        if ($show_any) {
-               $return .= '
-               <input type="radio" name="'.$select_name.'" 
value=""'.(($checked_val == '')? ' checked="checked"' : '').' 
/>&nbsp;'.$text_any.'<br />';
+               $radio_attrs = $attrs;
+               $radio_attrs['value'] = '';
+               $radio_attrs['id'] = $select_name.'_any';
+               if ($checked_val == '') {
+                       $radio_attrs ['checked'] = 'checked';
+               }
+               $return .= html_e('input', 
$radio_attrs).html_e('label',array('for'=>$select_name.'_any'), 
$text_any).html_e('br');
        }
        //we don't always want the default 100 row shown
        if ($show_100) {
-               $return .= '
-               <input type="radio" name="'.$select_name.'" 
value="100"'.(($checked_val == 100)? ' checked="checked"' : '').' 
/>&nbsp;'.$text_100.'<br />';
+               $radio_attrs = $attrs;
+               $radio_attrs['value'] = '100';
+               $radio_attrs['id'] = $select_name.'_100';
+               if ($checked_val == '100') {
+                       $radio_attrs ['checked'] = 'checked';
+               }
+               $return .= html_e('input', 
$radio_attrs).html_e('label',array('for'=>$select_name.'_100'), 
$text_100).html_e('br');
        }
 
        $checked_found = false;
@@ -347,13 +352,15 @@ function html_build_radio_buttons_from_arrays($vals, 
$texts, $select_name, $chec
                //  uggh - sorry - don't show the 100 row
                //  if it was shown above, otherwise do show it
                if (($vals[$i] != '100') || ($vals[$i] == '100' && !$show_100)) 
{
-                       $return .= '
-                               <input type="radio" 
id="'.$select_name.'_'.$vals[$i].'" name="'.$select_name.'" 
value="'.$vals[$i].'"';
+                       $radio_attrs = $attrs;
+                       $radio_attrs['value'] = $vals[$i];
+                       $radio_attrs['id'] = $select_name.'_'.$vals[$i];
                        if ((string)$vals[$i] == (string)$checked_val) {
                                $checked_found = true;
-                               $return .= ' checked="checked"';
+                               //$return .= ' checked="checked"';
+                               $radio_attrs ['checked'] = 'checked';
                        }
-                       $return .= ' 
/>&nbsp;'.htmlspecialchars($texts[$i]).'<br />';
+                               $return .= html_e('input', 
$radio_attrs).html_e('label',array('for'=>$select_name.'_'.$vals[$i]), 
htmlspecialchars($texts[$i])).html_e('br');
                }
        }
        //
@@ -361,8 +368,11 @@ function html_build_radio_buttons_from_arrays($vals, 
$texts, $select_name, $chec
        //      we want to preserve that value UNLESS that value was 'xzxz', 
the default value
        //
        if (!$checked_found && $checked_val != 'xzxz' && $checked_val && 
$checked_val != 100) {
-               $return .= '
-               <input type="radio" value="'.$checked_val.'" checked="checked" 
/>&nbsp;'._('No Change').'<br />';
+               $radio_attrs = $attrs;
+               $radio_attrs['value'] = $checked_val;
+               $radio_attrs['id'] = $select_name.'_no_change';
+               $radio_attrs ['checked'] = 'checked';
+               $return .= html_e('input', 
$radio_attrs).html_e('label',array('for'=>$select_name.'_no_change'), _('No 
Change')).html_e('br');
        }
 
        return $return;
@@ -537,21 +547,25 @@ function html_use_jquerybrowser() {
  * row is 100, so almost every pop-up box has 100 as the default
  * Most tables in the database should therefore have a row with an id of 100 
in it so that joins are successful
  *
- * @param      array           $vals           The ID or value
- * @param      array           $texts          Text to be displayed
+ * @param      array           $vals                   The ID or value
+ * @param      array           $texts                  Text to be displayed
  * @param      string          $select_name    Name to assign to this form 
element
  * @param      string          $checked_val    The item that should be checked
- * @param      bool            $show_100       Whether or not to show the '100 
row'
- * @param      string          $text_100       What to call the '100 row' 
defaults to none
- * @param      bool            $show_any       Whether or not to show the 'Any 
row'
- * @param      string          $text_any       What to call the 'Any row' 
defaults to any
- * @param      bool|array      $allowed        Array of all allowed values 
from the full list.
- * @param      array           $html_params    Array of other html param for 
an element
+ * @param      bool            $show_100               Whether or not to show 
the '100 row'
+ * @param      string          $text_100               What to call the '100 
row' defaults to none
+ * @param      bool            $show_any               Whether or not to show 
the 'Any row'
+ * @param      string          $text_any               What to call the 'Any 
row' defaults to any
+ * @param      bool|array      $allowed                Array of all allowed 
values from the full list.
+ * @param      array           $attrs                  Array of other 
attributes for this select element
  * @return     string
  */
 function html_build_select_box_from_arrays($vals, $texts, $select_name, 
$checked_val = 'xzxz',
-                                          $show_100 = true, $text_100 = 'none',
-                                          $show_any = false, $text_any = 
'any', $allowed = false, $html_params = array()) {
+                                                                               
   $show_100 = true, $text_100 = 'none',
+                                                                               
   $show_any = false, $text_any = 'any',
+                                                                               
   $allowed = false, $attrs = array()) {
+       if ($text_100 == 'none') {
+               $text_100 = _('None');
+       }
        $have_a_subelement = false;
        $return = '';
 
@@ -560,28 +574,32 @@ function html_build_select_box_from_arrays($vals, $texts, 
$select_name, $checked
                $return .= _('Error: uneven row counts');
        }
 
-       //TODO: remove this ugly ack to get something more generic...
-       $title = html_get_tooltip_description($select_name);
-       if (isset($html_params['id'])) {
-               $id = $html_params['id'];
+       if (!is_array($attrs)) {
+               $attrs = array();
+       }
+
+       if (empty($attrs['title'])) {
+               //TODO: remove this ugly ack to get something more generic...
+               $attrs['title'] = 
util_html_secure(html_get_tooltip_description($select_name));
        } else {
-               $id = '';
+               $attrs['title'] = util_html_secure($attrs['title']);
        }
-       if ($title) {
-               $id = 'tracker-'.$select_name.'"';
-               if (preg_match('/\[\]/', $id)) {
-                       $id = '';
+
+       if (!empty($attrs['title'])) {
+               $attrs['id'] = 'tracker-'.$select_name.'"';
+               if (preg_match('/\[\]/', $attrs['id'])) {
+                       unset($attrs['id']);
                }
        }
-
-       $return .= html_ao('select', array('id' => $id, 'name' => $select_name, 
'title' => util_html_secure($title)));
+       $attrs['name'] = $select_name;
+       $return .= html_ao('select', $attrs);
 
        //we don't always want the default Any row shown
        if ($show_any) {
-               $attrs = array('value' => '');
+               $opt_attrs = array('value' => '');
                if ($checked_val)
-                       $attrs['selected'] = 'selected';
-               $return .= html_e('option', $attrs, 
util_html_secure($text_any), false);
+                       $opt_attrs['selected'] = 'selected';
+               $return .= html_e('option', $opt_attrs, 
util_html_secure($text_any), false);
                $have_a_subelement = true;
        }
        //we don't always want the default 100 row shown
@@ -589,10 +607,10 @@ function html_build_select_box_from_arrays($vals, $texts, 
$select_name, $checked
                if ($text_100 == 'none') {
                        $text_100 = _('None');
                }
-               $attrs = array('value' => 100);
+               $opt_attrs = array('value' => 100);
                if ($checked_val)
-                       $attrs['selected'] = 'selected';
-               $return .= html_e('option', $attrs, 
util_html_secure($text_100), false);
+                       $opt_attrs['selected'] = 'selected';
+               $return .= html_e('option', $opt_attrs, 
util_html_secure($text_100), false);
                $have_a_subelement = true;
        }
 
@@ -602,17 +620,17 @@ function html_build_select_box_from_arrays($vals, $texts, 
$select_name, $checked
                //  uggh - sorry - don't show the 100 row
                //  if it was shown above, otherwise do show it
                if (($vals[$i] != '100') || ($vals[$i] == '100' && !$show_100)) 
{
-                       $attrs = array();
-                       $attrs['value'] = util_html_secure($vals[$i]);
+                       $opt_attrs = array();
+                       $opt_attrs['value'] = util_html_secure($vals[$i]);
                        if ((string)$vals[$i] == (string)$checked_val) {
                                $checked_found = true;
-                               $attrs['selected'] = 'selected';
+                               $opt_attrs['selected'] = 'selected';
                        }
                        if (is_array($allowed) && !in_array($vals[$i], 
$allowed)) {
-                               $attrs['disabled'] = 'disabled';
-                               $attrs['class'] = 'option_disabled';
+                               $opt_attrs['disabled'] = 'disabled';
+                               $opt_attrs['class'] = 'option_disabled';
                        }
-                       $return .= html_e('option', $attrs, 
util_html_secure($texts[$i]));
+                       $return .= html_e('option', $opt_attrs, 
util_html_secure($texts[$i]));
                        $have_a_subelement = true;
                }
        }
@@ -650,7 +668,7 @@ function html_build_select_box_from_arrays($vals, $texts, 
$select_name, $checked
  * @return     string
  */
 function html_build_select_box($result, $name, $checked_val = "xzxz", 
$show_100 = true, $text_100 = 'none',
-                                                          $show_any = false, 
$text_any = 'Select One', $allowed = false) {
+                                                          $show_any = false, 
$text_any = 'Select One', $allowed = false, $attrs = array()) {
        if ($text_100 == 'none') {
                $text_100 = _('None');
        }
@@ -659,7 +677,8 @@ function html_build_select_box($result, $name, $checked_val 
= "xzxz", $show_100
        }
        return 
html_build_select_box_from_arrays(util_result_column_to_array($result, 0),
                                                                                
         util_result_column_to_array($result, 1),
-                                                                               
         $name, $checked_val, $show_100, $text_100, $show_any, $text_any);
+                                                                               
         $name, $checked_val, $show_100, $text_100,
+                                                                               
         $show_any, $text_any, $allowed, $attrs);
 }
 
 /**
@@ -673,14 +692,20 @@ function html_build_select_box($result, $name, 
$checked_val = "xzxz", $show_100
  * @param      string  $text_100       What to call the '100 row'.  Defaults 
to none.
  * @return     string
  */
-function html_build_select_box_sorted($result, $name, $checked_val = "xzxz", 
$show_100 = true, $text_100 = 'none') {
+function html_build_select_box_sorted($result, $name, $checked_val = "xzxz", 
$show_100 = true, $text_100 = 'none',
+                                                          $show_any = false, 
$text_any = 'Select One', $allowed = false, $attrs = array()) {
        if ($text_100 == 'none') {
                $text_100 = _('None');
        }
+       if ($text_any == 'Select One') {
+               $text_any = _('Select One');
+       }
+
        $vals = util_result_column_to_array($result, 0);
        $texts = util_result_column_to_array($result, 1);
        array_multisort($texts, SORT_ASC, SORT_STRING, $vals);
-       return html_build_select_box_from_arrays ($vals, $texts, $name, 
$checked_val, $show_100, $text_100);
+       return html_build_select_box_from_arrays ($vals, $texts, $name, 
$checked_val, $show_100, $text_100,
+                                                                               
          $show_any, $text_any, $allowed, $attrs);
 }
 
 /**
@@ -690,49 +715,21 @@ function html_build_select_box_sorted($result, $name, 
$checked_val = "xzxz", $sh
  * @param      resource        $result         The result set
  * @param      string          $name           Text to be displayed
  * @param      string          $checked_array  The item that should be checked
- * @param      int             $size           The size of this box
+ * @param      int                     $size           The size of this box
  * @param      bool            $show_100       Whether or not to show the '100 
row'
  * @param      string          $text_100       The displayed text of the '100 
row'
+ * @param      array           $attrs          Array of other attributes for 
this select element
  * @return     string
  */
-function html_build_multiple_select_box($result, $name, $checked_array, $size 
= 8, $show_100 = true, $text_100 = 'none') {
-       $checked_count = count($checked_array);
-       $return = html_ao('select', array('name' => $name, 'multiple' => 
'multiple', 'size' => $size));
-       if ($show_100) {
-               if ($text_100 == 'none') {
-                       $text_100 = _('None');
-               }
-               /*
-                       Put in the default NONE box
-               */
-               $attrs = array('value' => 100);
-               for ($j = 0; $j < $checked_count; $j++) {
-                       if ($checked_array[$j] == '100') {
-                               $attrs['selected'] = 'selected';
-                       }
-               }
-               $return .= html_e('option', $attrs, $text_100, false);
-       }
-
+function html_build_multiple_select_box($result, $name, $checked_array, $size 
= 8, $show_100 = true, $text_100 = 'none', $attrs = array()) {
+       $vals = array();
+       $texts = array();
        $rows = db_numrows($result);
        for ($i = 0; $i < $rows; $i++) {
-               if ((db_result($result, $i, 0) != '100') || (db_result($result, 
$i, 0) == '100' && !$show_100)) {
-                       $attrs = array();
-                       $attrs = array('value' => db_result($result, $i, 0));
-                       /*
-                               Determine if it's checked
-                       */
-                       $val = db_result($result, $i, 0);
-                       for ($j = 0; $j < $checked_count; $j++) {
-                               if ($val == $checked_array[$j]) {
-                                       $attrs['selected'] = 'selected';
-                               }
-                       }
-                       $return .= html_e('option', $attrs, 
substr(db_result($result, $i, 1), 0, 35), false);
-               }
+               $vals = db_result($result, $i, 0);
+               $texts = substr(db_result($result, $i, 1), 0, 35);
        }
-       $return .= html_ac(html_ap() -1);
-       return $return;
+       return html_build_multiple_select_box_from_arrays($vals, $texts, $name, 
$checked_array, $size, $show_100, $text_100, $attrs);
 }
 
 /**
@@ -745,9 +742,10 @@ function html_build_multiple_select_box($result, $name, 
$checked_array, $size =
  * @param      int     $size           The size of this box
  * @param      bool    $show_100       Whether or not to show the '100 row'
  * @param      string  $text_100       What to call the '100 row' defaults to 
none.
+ * @param      array   $attrs          Array of other attributes for this 
select element
  * @return     string
  */
-function html_build_multiple_select_box_from_arrays($ids, $texts, $name, 
$checked_array, $size = 8, $show_100 = true, $text_100 = 'none') {
+function html_build_multiple_select_box_from_arrays($vals, $texts, $name, 
$checked_array, $size = 8, $show_100 = true, $text_100 = 'none', $attrs = 
array()) {
        $checked_count = count($checked_array);
        $return = html_ao('select', array('name' => $name, 'multiple' => 
'multiple', 'size' => $size));
        if ($show_100) {
@@ -757,30 +755,30 @@ function html_build_multiple_select_box_from_arrays($ids, 
$texts, $name, $checke
                /*
                        Put in the default NONE box
                */
-               $attrs = array('value' => 100);
+               $opt_attrs = array('value' => 100);
                for ($j = 0; $j < $checked_count; $j++) {
                        if ($checked_array[$j] == '100') {
-                               $attrs['selected'] = 'selected';
+                               $opt_attrs['selected'] = 'selected';
                        }
                }
-               $return .= html_e('option', $attrs, $text_100, false);
+               $return .= html_e('option', $opt_attrs, $text_100, false);
        }
 
-       $rows = count($ids);
+       $rows = count($vals);
        for ($i = 0; $i < $rows; $i++) {
-               if (($ids[$i] != '100') || ($ids[$i] == '100' && !$show_100)) {
-                       $attrs = array();
-                       $attrs = array('value' => $ids[$i]);
+               if (($vals[$i] != '100') || ($vals[$i] == '100' && !$show_100)) 
{
+                       $opt_attrs = array();
+                       $opt_attrs = array('value' => $vals[$i]);
                        /*
                                Determine if it's checked
                        */
-                       $val = $ids[$i];
+                       $val = $vals[$i];
                        for ($j = 0; $j < $checked_count; $j++) {
                                if ($val == $checked_array[$j]) {
-                                       $attrs['selected'] = 'selected';
+                                       $opt_attrs['selected'] = 'selected';
                                }
                        }
-                       $return .= html_e('option', $attrs, $texts[$i], false);
+                       $return .= html_e('option', $opt_attrs, $texts[$i], 
false);
                }
        }
        $return .= html_ac(html_ap() -1);
@@ -793,10 +791,11 @@ function html_build_multiple_select_box_from_arrays($ids, 
$texts, $name, $checke
  * @param      string  $name           name of control
  * @param      string  $value          value of control
  * @param      bool    $checked        true if control should be checked
+ * @param      array   $attrs          Array of other attributes for this 
element
  * @return     html code for checkbox control
  */
-function html_build_checkbox($name, $value, $checked) {
-       $attrs = array('id' => $name, 'name' => $name, 'value' => $value, 
'type' => 'checkbox');
+function html_build_checkbox($name, $value, $checked, $attrs=array()) {
+       $attrs = array_merge(array('id' => $name, 'name' => $name, 'value' => 
$value, 'type' => 'checkbox'), $attrs);
        if ($checked) {
                $attrs['checked'] = 'checked';
        }
@@ -808,8 +807,8 @@ function html_build_checkbox($name, $value, $checked) {
  *
  * @see html_build_priority_select_box()
  */
-function build_priority_select_box($name = 'priority', $checked_val = '3', 
$nochange = false) {
-       echo html_build_priority_select_box($name, $checked_val, $nochange);
+function build_priority_select_box($name = 'priority', $checked_val = '3', 
$nochange = false, $attrs = array()) {
+       echo html_build_priority_select_box($name, $checked_val, $nochange, 
$attrs);
 }
 
 /**
@@ -819,23 +818,26 @@ function build_priority_select_box($name = 'priority', 
$checked_val = '3', $noch
  * @param      string  $name           Name of the select box
  * @param      string  $checked_val    The value to be checked
  * @param      bool    $nochange       Whether to make 'No Change' selected.
+ * @param      bool|array      $attrs                  Array of other 
attributes for this select element
  * @return string
  */
-function html_build_priority_select_box($name = 'priority', $checked_val = 
'3', $nochange = false) {
-       $html = '<select id="tracker-'.$name.'" name="'.$name.'" 
title="'.util_html_secure(html_get_tooltip_description($name)).'">';
-       if ($nochange) {
-               $html .= '<option value="100" selected="selected" >'._('No 
Change').'</option>';
+function html_build_priority_select_box($name = 'priority', $checked_val = 
'3', $nochange = false, $attrs = array()) {
+       if (empty($attrs['title'])) {
+               $attrs['title'] = 
util_html_secure(html_get_tooltip_description($name));
+       } else {
+               $attrs['title'] = util_html_secure($attrs['title']);
        }
-       $labelOption = array('1 - '._('Lowest'), '2', '3', '4', '5 - 
'._('Highest'));
-       for ($i = 1; $i <= 5; $i++) {
-               $html .= '<option value="'.$i.'" ';
-               if ($checked_val == $i) {
-                       $html .= 'selected="selected" ';
-               }
-               $html .= '>'.$labelOption[$i -1].'</option>';
+       $vals = array('1', '2', '3', '4', '5');
+       $texts = array('1 - '._('Lowest'), '2', '3', '4', '5 - '._('Highest'));
+       if ($nochange) {
+               $show_100 = true;
+               $text_100 = _('No Change');
+               $checked_val = 100;
+       } else {
+               $show_100 = false;
+               $text_100 = '';
        }
-       $html .= '</select>';
-       return $html;
+       return html_build_select_box_from_arrays($vals, $texts, $name, 
$checked_val, $show_100, $text_100, false, '', false, $attrs);
 }
 
 /**

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

Summary of changes:
 src/common/tracker/ArtifactExtraField.class.php    |  69 +++--
 src/common/tracker/ArtifactType.class.php          |   2 +-
 src/common/tracker/actions/admin-updates.php       |   7 +-
 .../tracker/include/ArtifactTypeHtml.class.php     |  90 ++++---
 src/common/tracker/views/form-addextrafield.php    | 107 ++++----
 src/common/tracker/views/form-updateextrafield.php | 126 ++++-----
 ...60519-artifact_extra_field_list-description.sql |   2 +
 src/www/include/html.php                           | 292 +++++++++++----------
 src/www/tracker/admin/index.php                    |   3 +
 9 files changed, 376 insertions(+), 322 deletions(-)
 create mode 100644 src/db/20160519-artifact_extra_field_list-description.sql


hooks/post-receive
-- 
FusionForge

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

Reply via email to