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  21f38cacee4f87f783b7e98926db7e332771e03a (commit)
      from  f54f11ea5d46f7340595a04cdf5295bc8c91f0bc (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=21f38cacee4f87f783b7e98926db7e332771e03a

commit 21f38cacee4f87f783b7e98926db7e332771e03a
Author: Stéphane-Eymeric Bredthauer <[email protected]>
Date:   Fri Nov 25 11:56:52 2016 +0100

    Tracker: query with datetime type

diff --git a/src/common/tracker/ArtifactExtraField.class.php 
b/src/common/tracker/ArtifactExtraField.class.php
index 79195d1..ae5478f 100644
--- a/src/common/tracker/ArtifactExtraField.class.php
+++ b/src/common/tracker/ArtifactExtraField.class.php
@@ -40,12 +40,15 @@ define('ARTIFACT_EXTRAFIELDTYPE_INTEGER',10);
 define('ARTIFACT_EXTRAFIELDTYPE_FORMULA',11);
 /* reserved for Evolvis extension, for merge into FusionForge */
 define('ARTIFACT_EXTRAFIELDTYPE_DATETIME',12);
-/* 12: reserved DATETIME*/
 /* 13: reserved SLA */
 define('ARTIFACT_EXTRAFIELDTYPE_SLA',13);
 define('ARTIFACT_EXTRAFIELDTYPE_USER',14);
-/* 15: reserved MULTIUSER */
+define('ARTIFACT_EXTRAFIELDTYPE_MULTIUSER',15);
 define('ARTIFACT_EXTRAFIELDTYPE_RELEASE',16);
+define('ARTIFACT_EXTRAFIELDTYPE_MULTIRELEASE',17);
+define('ARTIFACT_EXTRAFIELDTYPE_DATE',18);
+define('ARTIFACT_EXTRAFIELDTYPE_DATETIMERANGE', 19);
+define('ARTIFACT_EXTRAFIELDTYPE_DATERANGE', 20);
 
 define ("ARTIFACT_EXTRAFIELDTYPEGROUP_SINGLECHOICE", serialize (array 
(ARTIFACT_EXTRAFIELDTYPE_SELECT, ARTIFACT_EXTRAFIELDTYPE_RADIO, 
ARTIFACT_EXTRAFIELDTYPE_STATUS)));
 define ("ARTIFACT_EXTRAFIELDTYPEGROUP_MULTICHOICE", serialize (array 
(ARTIFACT_EXTRAFIELDTYPE_CHECKBOX, ARTIFACT_EXTRAFIELDTYPE_MULTISELECT)));
diff --git a/src/common/tracker/ArtifactFactory.class.php 
b/src/common/tracker/ArtifactFactory.class.php
index 7b0f2ad..3c584c7 100644
--- a/src/common/tracker/ArtifactFactory.class.php
+++ b/src/common/tracker/ArtifactFactory.class.php
@@ -320,6 +320,14 @@ class ArtifactFactory extends FFError {
                                if ($type == ARTIFACT_EXTRAFIELDTYPE_TEXT or 
$type == ARTIFACT_EXTRAFIELDTYPE_TEXTAREA) {
                                        $wheresql .= ' AND 
aefd'.$i.'.field_data LIKE $'.$paramcount++ ;
                                        $params[] = $vals[$i];
+                               } elseif ($type == ARTIFACT_EXTRAFIELDTYPE_DATE 
|| $type == ARTIFACT_EXTRAFIELDTYPE_DATETIME) {
+                                       
preg_match('/([0-9]{4}-[0-9]{2}-[0-9]{2}) ([0-9]{4}-[0-9]{2}-[0-9]{2})/', 
$vals[$i], $matches);
+                                       $strartDate = 
DateTime::createFromFormat('!Y-m-d', $matches[1]);
+                                       $endDate = 
DateTime::createFromFormat('!Y-m-d', $matches[2]);
+                                       $wheresql .= ' AND 
cast(aefd'.$i.'.field_data AS BIGINT) BETWEEN $'.$paramcount++;
+                                       $params[] = $strartDate->format('U');
+                                       $wheresql .= ' AND $'.$paramcount++;
+                                       $params[] = $endDate->format('U');
                                } else {
                                        if (is_array($vals[$i])) {
                                                $wheresql .= ' AND 
aefd'.$i.'.field_data = ANY ($'.$paramcount++ .')' ;
diff --git a/src/common/tracker/include/ArtifactTypeHtml.class.php 
b/src/common/tracker/include/ArtifactTypeHtml.class.php
index 58dc480..7641bb1 100644
--- a/src/common/tracker/include/ArtifactTypeHtml.class.php
+++ b/src/common/tracker/include/ArtifactTypeHtml.class.php
@@ -185,11 +185,20 @@ class ArtifactTypeHtml extends ArtifactType {
                                $i=$keys[$k];
                                $type = $efarr[$i]['field_type'];
                                if ($type == ARTIFACT_EXTRAFIELDTYPE_SELECT ||
-                                       $type == 
ARTIFACT_EXTRAFIELDTYPE_CHECKBOX ||
-                                       $type == ARTIFACT_EXTRAFIELDTYPE_RADIO 
||
-                                       $type == ARTIFACT_EXTRAFIELDTYPE_STATUS 
||
-                                       $type == 
ARTIFACT_EXTRAFIELDTYPE_MULTISELECT) {
+                                               $type == 
ARTIFACT_EXTRAFIELDTYPE_CHECKBOX ||
+                                               $type == 
ARTIFACT_EXTRAFIELDTYPE_RADIO ||
+                                               $type == 
ARTIFACT_EXTRAFIELDTYPE_STATUS ||
+                                               $type == 
ARTIFACT_EXTRAFIELDTYPE_MULTISELECT) {
                                        $efarr[$i]['field_type'] = 
ARTIFACT_EXTRAFIELDTYPE_MULTISELECT;
+                               } elseif ($type == ARTIFACT_EXTRAFIELDTYPE_USER 
||
+                                               $type == 
ARTIFACT_EXTRAFIELDTYPE_MULTIUSER) {
+                                       $efarr[$i]['field_type'] = 
ARTIFACT_EXTRAFIELDTYPE_MULTIUSER;
+                               } elseif ($type == 
ARTIFACT_EXTRAFIELDTYPE_RELEASE ||
+                                               $type == 
ARTIFACT_EXTRAFIELDTYPE_MULTIRELEASE) {
+                                       $efarr[$i]['field_type'] = 
ARTIFACT_EXTRAFIELDTYPE_MULTIRELEASE;
+                               } elseif ($type == 
ARTIFACT_EXTRAFIELDTYPE_DATETIME ||
+                                               $type == 
ARTIFACT_EXTRAFIELDTYPE_DATE) {
+                                       $efarr[$i]['field_type'] = 
ARTIFACT_EXTRAFIELDTYPE_DATERANGE;
                                } else {
                                        $efarr[$i]['field_type'] = 
ARTIFACT_EXTRAFIELDTYPE_TEXT;
                                }
@@ -345,8 +354,17 @@ class ArtifactTypeHtml extends ArtifactType {
                                $str = 
$this->renderDatetime($efarr[$i]['extra_field_id'],$selected[$efarr[$i]['extra_field_id']],
 $attrs);
                        } elseif ($efarr[$i]['field_type'] == 
ARTIFACT_EXTRAFIELDTYPE_USER) {
                                $str = 
$this->renderUserField($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_RELEASE) {
+                       } elseif ($efarr[$i]['field_type'] == 
ARTIFACT_EXTRAFIELDTYPE_MULTIUSER) {
+                               $str = 
$this->renderMultiUserField($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_RELEASE) {
                                $str = 
$this->renderReleaseField($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_MULTIRELEASE) {
+                               $str = 
$this->renderMultiReleaseField($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_DATERANGE) {
+                               if ($mode == 'QUERY') {
+                                       $post_name =  ' <i>'._('(YYYY-MM-DD 
YYYY-MM-DD Format)').'</i>';
+                               }
+                               $str = 
$this->renderDateRange($efarr[$i]['extra_field_id'],$selected[$efarr[$i]['extra_field_id']],
 $attrs);
                        }
                        $template = 
str_replace('{$PostName:'.$efarr[$i]['field_name'].'}',$post_name,$template);
                        $template = 
str_replace('{$'.$efarr[$i]['field_name'].'}',$str,$template);
@@ -673,6 +691,57 @@ class ArtifactTypeHtml extends ArtifactType {
        }
 
        /**
+        * renderMultiUserField - this function builds pop up box with users.
+        *
+        * @param       int             $extra_field_id The ID of this field.
+        * @param       string          $checked        The item 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       bool            $show_any
+        * @param       string          $text_any
+        * @param       bool            $allowed
+        * @param       array           $attrs
+        * @return      string          HTML code for the box and choices
+        */
+       function renderMultiUserField 
($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 == 'nobody'){
+                       $text_100=_('Nobody');
+               }
+
+               if (!$checked) {
+                       $checked=array();
+               }
+               if (!is_array($checked)) {
+                       $checked = explode(',',$checked);
+               }
+
+               $arr = $this->getExtraFieldElements($extra_field_id);
+               $selectedRolesId = array();
+               for ($i=0; $i<count($arr); $i++) {
+                       $selectedRolesId[$i]=$arr[$i]['element_name'];
+               }
+               $roles = $this->getGroup()->getRoles();
+               $userArray = array();
+               foreach ($roles as $role) {
+                       if (in_array($role->getID(), $selectedRolesId)) {
+                               foreach ($role->getUsers() as $user) {
+                                       $userArray[$user->getID()] = 
$user->getRealName().(($user->getStatus()=='S') ? ' '._('[SUSPENDED]') : '');
+                               }
+                       }
+               }
+               if (is_integer($checked) && !isset($userArray[$checked])) {
+                       $checkedUser = user_get_object($checked);
+                       $userArray[$checkedUser->getID()] = 
$checkedUser->getRealName().' '._('[DELETED]');
+               }
+               asort($userArray,SORT_FLAG_CASE | SORT_STRING);
+               $size = min( count($userArray)+1, 15);
+               $keys = array_keys($userArray);
+               $vals = array_values($userArray);
+
+               return html_build_multiple_select_box_from_arrays 
($keys,$vals,'extra_fields['.$extra_field_id.'][]',$checked,$size, 
$show_100,$text_100,$allowed, $attrs);
+       }
+
+       /**
         * renderReleaseField - this function builds 2 pop up boxes with 
packages & releases.
         *
         * @param       int             $extra_field_id The ID of this field.
@@ -691,53 +760,83 @@ class ArtifactTypeHtml extends ArtifactType {
                }
 
                $releasesArray = array();
-               $defaultRelease = $checked;
-               $releaseAttrs = $attrs;
                $releasesAttrs =  array();
-
-               $packagesArray = array();
-               $defaultPackage = 100;
-               $packageAttrs = array('class'=>'package');
-               $packagesAttrs = array();
+               $optGroup = array();
 
                $arr = $this->getExtraFieldElements($extra_field_id);
                $selectedPackagesId = array();
                for ($i=0; $i<count($arr); $i++) {
                        $selectedPackagesId[$i]=$arr[$i]['element_name'];
                }
+
                $packages = get_frs_packages($this->getGroup());
+               uasort($packages, 'compareObjectName');
+               foreach ($packages as $package) {
+                       if (in_array($package->getID(), $selectedPackagesId)) {
+                               $releases = $package->getReleases();
+                               uasort($releases, 'compareObjectName');
+                               foreach ($releases as $release) {
+                                       $optGroup[] = $package->getName();
+                                       $releasesArray[$release->getID()] = 
$release->getName();
+                               }
+                       }
+               }
 
-               if ((integer)$defaultRelease!=0 && $defaultRelease!=100) {
-                       $releaseObj = frsrelease_get_object($defaultRelease);
-                       $defaultPackage = $releaseObj->getFRSPackage()->getID();
+               $keys = array_keys($releasesArray);
+               $vals = array_values($releasesArray);
+               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, $releasesAttrs, array(), $optGroup);
+       }
+
+       /**
+        * renderMultiReleaseField - this function builds 2 pop up boxes with 
packages & releases.
+        *
+        * @param       int             $extra_field_id The ID of this field.
+        * @param       string          $checked        The item 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       bool            $show_any
+        * @param       string          $text_any
+        * @param       bool            $allowed
+        * @param       array           $attrs
+        * @return      string          HTML code for the box and choices
+        */
+       function renderMultiReleaseField 
($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');
+               }
+               if (!$checked) {
+                       $checked=array();
+               }
+               if (!is_array($checked)) {
+                       $checked = explode(',',$checked);
                }
 
+               $releasesArray = array();
+               $releasesAttrs =  array();
+               $optGroup = array();
+
+               $arr = $this->getExtraFieldElements($extra_field_id);
+               $selectedPackagesId = array();
+               for ($i=0; $i<count($arr); $i++) {
+                       $selectedPackagesId[$i]=$arr[$i]['element_name'];
+               }
+
+               $packages = get_frs_packages($this->getGroup());
                uasort($packages, 'compareObjectName');
                foreach ($packages as $package) {
                        if (in_array($package->getID(), $selectedPackagesId)) {
-                               $packagesArray[$package->getID()] = 
$package->getName();
-                               $releasesList = '';
                                $releases = $package->getReleases();
                                uasort($releases, 'compareObjectName');
                                foreach ($releases as $release) {
+                                       $optGroup[] = $package->getName();
                                        $releasesArray[$release->getID()] = 
$release->getName();
-                                       $releasesList .= (empty($releasesList) 
? '':', ').$release->getID();
-                                       if ($defaultPackage == 100 || 
$defaultPackage==$package->getID()) {
-                                               $allowed[] = $release->getID();
-                                       }
                                }
-                               $releasesList = '{"field": '.$extra_field_id.', 
"elmnt": ['.$releasesList.']}';
-                               $packagesAttrs [] = 
array('data-releases'=>$releasesList);
                        }
                }
-               $keys = array_keys($packagesArray);
-               $vals = array_values($packagesArray);
-
-               $return = html_build_select_box_from_arrays 
($keys,$vals,'package['.$extra_field_id.']',$defaultPackage,$show_100,$text_100,$show_any,$text_any,
 false, $packageAttrs, $packagesAttrs);
+               $size = min( count($releasesArray)+1, 15);
                $keys = array_keys($releasesArray);
                $vals = array_values($releasesArray);
-               $return .= html_build_select_box_from_arrays 
($keys,$vals,'extra_fields['.$extra_field_id.']',$defaultRelease,$show_100,$text_100,$show_any,$text_any,
 $allowed, $releaseAttrs, $releasesAttrs);
-               return $return;
+               return html_build_multiple_select_box_from_arrays 
($keys,$vals,'extra_fields['.$extra_field_id.'][]',$checked,$size, 
$show_100,$text_100,$allowed, $attrs, $releasesAttrs, array(), $optGroup);
        }
 
        /**
@@ -987,6 +1086,12 @@ class ArtifactTypeHtml extends ArtifactType {
                return html_e('input', array_merge(array('type'=>'text', 
'name'=>'extra_fields['.$extra_field_id.']', 'class'=>'datetimepicker', 
'value'=>$datetime),$attrs));
        }
 
+       function renderDateRange($extra_field_id, $dateRange, $attrs = array()) 
{
+               // http://html5pattern.com/Dates
+               // Date with leapyear-check
+               $datepattern = 
'(?:19|20)(?:(?:[13579][26]|[02468][048])-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-9])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:30))|(?:(?:0[13578]|1[02])-31))|(?:[0-9]{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:(?!02)(?:0[1-9]|1[0-2])-(?:29|30))|(?:(?:0[13578]|1[02])-31)))';
+               return html_e('input', array_merge(array('type'=>'text', 
'name'=>'extra_fields['.$extra_field_id.']', 'pattern'=>$datepattern.' 
'.$datepattern, 'maxlength'=>21, 'size'=>21, 'value'=>$dateRange),$attrs));
+       }
        function technicianBox 
($name='assigned_to[]',$checked='xzxz',$show_100=true,$text_100='none',$extra_id='-1',$extra_name='',$multiple=false)
 {
                if ($text_100=='none'){
                        $text_100=_('Nobody');
diff --git a/src/www/include/html.php b/src/www/include/html.php
index 46e67e4..ff6223a 100644
--- a/src/www/include/html.php
+++ b/src/www/include/html.php
@@ -630,7 +630,8 @@ function html_build_select_box_from_arrays($vals, $texts, 
$select_name,
                                           $show_any = false, $text_any = 'any',
                                           $allowed = false, $attrs = array(),
                                           $opts_attrs = array(),
-                                          $attrs_100 = array()) {
+                                          $attrs_100 = array(),
+                                          $optgroup = array()) {
        if ($text_100 == 'none') {
                $text_100 = _('None');
        }
@@ -690,7 +691,9 @@ function html_build_select_box_from_arrays($vals, $texts, 
$select_name,
        }
 
        $checked_found = false;
-
+       $withGroup = !empty($optgroup);
+       $currentGroup = '';
+       $groupOpen = false;
        for ($i = 0; $i < $rows; $i++) {
                //  uggh - sorry - don't show the 100 row
                //  if it was shown above, otherwise do show it
@@ -710,10 +713,22 @@ function html_build_select_box_from_arrays($vals, $texts, 
$select_name,
                        if (isset($opts_attrs[$i]) && 
is_array($opts_attrs[$i])) {
                                $opt_attrs = array_merge($opt_attrs, 
$opts_attrs[$i]);
                        }
+                       if ($withGroup && $vals[$i] != '100' && 
$optgroup[$i]!=$currentGroup) {
+                               if ($currentGroup!='' && $groupOpen) {
+                                       $return .= html_ac(html_ap() - 1);
+                                       $groupOpen = false;
+                               }
+                               $return .= 
html_ao('optgroup',array('label'=>$optgroup[$i]));
+                               $groupOpen = true;
+                               $currentGroup = $optgroup[$i];
+                       }
                        $return .= html_e('option', $opt_attrs, 
util_html_secure($texts[$i]));
                        $have_a_subelement = true;
                }
        }
+       if ($withGroup && $groupOpen) {
+               $return .= html_ac(html_ap() - 1);
+       }
        //
        //      If the passed in "checked value" was never "SELECTED"
        //      we want to preserve that value UNLESS that value was 'xzxz', 
the default value
@@ -850,11 +865,12 @@ function html_build_multiple_select_box($result, $name, 
$checked_array, $size =
  * @throws     Exception
  */
 function html_build_multiple_select_box_from_arrays(
-               $vals, $texts, $name, $checked_array, $size = 8,
+               $vals, $texts, $name, $checked_array=array(), $size = 8,
                $show_100 = true, $text_100 = 'none',
                $allowed = false, $attrs = array(),
-               $opts_attrs = array(), $attrs_100 = array()) {
-       $return = html_ao('select', array_merge(array('name' => $name, 
'multiple' => 'multiple', 'size' => $size), $attrs));
+               $opts_attrs = array(), $attrs_100 = array(),
+               $optgroup = array()) {
+       $return = html_ao('select', array_merge($attrs, array('name' => $name, 
'multiple' => 'multiple', 'size' => $size)));
        if ($show_100) {
                if ($text_100 == 'none') {
                        $text_100 = _('None');
@@ -872,6 +888,10 @@ function html_build_multiple_select_box_from_arrays(
                $return .= html_e('option', $opt_attrs, $text_100, false);
        }
 
+       $withGroup = !empty($optgroup);
+       $currentGroup = '';
+       $groupOpen = false;
+
        $rows = count($vals);
        for ($i = 0; $i < $rows; $i++) {
                if (($vals[$i] != '100') || ($vals[$i] == '100' && !$show_100)) 
{
@@ -892,6 +912,15 @@ function html_build_multiple_select_box_from_arrays(
                                }
                                $opt_attrs['class'] = 
(isset($opt_attrs['class']) ? $opt_attrs['class'].' ':'').'option_disabled';
                        }
+                       if ($withGroup && $vals[$i]!='100' && 
$optgroup[$i]!=$currentGroup) {
+                               if ($currentGroup!='' && $groupOpen) {
+                                       $return .= html_ac(html_ap() - 1);
+                                       $groupOpen = false;
+                               }
+                               $return .= html_ao('optgroup', 
array('label'=>$optgroup[$i]));
+                               $groupOpen = true;
+                               $currentGroup = $optgroup[$i];
+                       }
                        $return .= html_e('option', $opt_attrs, $texts[$i], 
false);
                }
        }

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

Summary of changes:
 src/common/tracker/ArtifactExtraField.class.php    |   7 +-
 src/common/tracker/ArtifactFactory.class.php       |   8 +
 .../tracker/include/ArtifactTypeHtml.class.php     | 163 +++++++++++++++++----
 src/www/include/html.php                           |  39 ++++-
 4 files changed, 181 insertions(+), 36 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