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