N°1161 - Dashlet Group By supports sum, average, min and max.

SVN:trunk[5623]
This commit is contained in:
Eric Espié
2018-04-06 08:53:30 +00:00
parent d641ff3ab7
commit f4b8b4cae3
6 changed files with 286 additions and 34 deletions

View File

@@ -700,12 +700,21 @@ abstract class DashletGroupBy extends Dashlet
$this->aProperties['query'] = 'SELECT Contact';
$this->aProperties['group_by'] = 'status';
$this->aProperties['style'] = 'table';
$this->aProperties['agregation_function'] = 'count';
$this->aProperties['agregation_attribute'] = '';
$this->aProperties['limit'] = '';
$this->aProperties['order_direction'] = 'desc';
}
protected $sGroupByLabel = null;
protected $sGroupByExpr = null;
protected $sGroupByAttCode = null;
protected $sFunction = null;
protected $sAgregationFunction = null;
protected $sAgregationAttribute = null;
protected $sLimit = null;
protected $sOrderDirection = null;
protected $sClass = null;
/**
* Compute Grouping
@@ -716,22 +725,27 @@ abstract class DashletGroupBy extends Dashlet
$this->sGroupByLabel = null;
$this->sGroupByAttCode = null;
$this->sFunction = null;
$this->sClass = null;
$sQuery = $this->aProperties['query'];
$sGroupBy = $this->aProperties['group_by'];
$sStyle = $this->aProperties['style'];
$this->sAgregationFunction = $this->aProperties['agregation_function'];
$this->sAgregationAttribute = $this->aProperties['agregation_attribute'];
$this->sLimit = $this->aProperties['limit'];
$this->sOrderDirection = $this->aProperties['order_direction'];
// First perform the query - if the OQL is not ok, it will generate an exception : no need to go further
try
{
$oQuery = $this->oModelReflection->GetQuery($sQuery);
$sClass = $oQuery->GetClass();
$this->sClass = $oQuery->GetClass();
$sClassAlias = $oQuery->GetClassAlias();
}
catch(Exception $e)
{
// Invalid query, let the user edit the dashlet/dashboard anyhow
$sClass = '';
$this->sClass = null;
$sClassAlias = '';
}
// Check groupby... it can be wrong at this stage
@@ -745,9 +759,9 @@ abstract class DashletGroupBy extends Dashlet
$this->sGroupByAttCode = $sGroupBy;
$this->sFunction = null;
}
if (($sClass != '') && $this->oModelReflection->IsValidAttCode($sClass, $this->sGroupByAttCode))
if ((!is_null($this->sClass)) && $this->oModelReflection->IsValidAttCode($this->sClass, $this->sGroupByAttCode))
{
$sAttLabel = $this->oModelReflection->GetLabel($sClass, $this->sGroupByAttCode);
$sAttLabel = $this->oModelReflection->GetLabel($this->sClass, $this->sGroupByAttCode);
if (!is_null($this->sFunction))
{
switch($this->sFunction)
@@ -793,7 +807,6 @@ abstract class DashletGroupBy extends Dashlet
{
$sTitle = $this->aProperties['title'];
$sQuery = $this->aProperties['query'];
$sGroupBy = $this->aProperties['group_by'];
$sStyle = $this->aProperties['style'];
// First perform the query - if the OQL is not ok, it will generate an exception : no need to go further
@@ -801,7 +814,6 @@ abstract class DashletGroupBy extends Dashlet
$oFilter->SetShowObsoleteData(utils::ShowObsoleteData());
$sClass = $oFilter->GetClass();
$sClassAlias = $oFilter->GetClassAlias();
if (!$this->oModelReflection->IsValidAttCode($sClass, $this->sGroupByAttCode))
{
@@ -818,6 +830,10 @@ abstract class DashletGroupBy extends Dashlet
'chart_title' => $sTitle,
'group_by' => $this->sGroupByExpr,
'group_by_label' => $this->sGroupByLabel,
'agregation_function' => $this->sAgregationFunction,
'agregation_attribute' => $this->sAgregationAttribute,
'limit' => $this->sLimit,
'order_direction' => $this->sOrderDirection,
);
$sHtmlTitle = ''; // done in the itop block
break;
@@ -829,6 +845,10 @@ abstract class DashletGroupBy extends Dashlet
'chart_title' => $sTitle,
'group_by' => $this->sGroupByExpr,
'group_by_label' => $this->sGroupByLabel,
'agregation_function' => $this->sAgregationFunction,
'agregation_attribute' => $this->sAgregationAttribute,
'limit' => $this->sLimit,
'order_direction' => $this->sOrderDirection,
);
$sHtmlTitle = ''; // done in the itop block
break;
@@ -840,6 +860,10 @@ abstract class DashletGroupBy extends Dashlet
$aExtraParams = array(
'group_by' => $this->sGroupByExpr,
'group_by_label' => $this->sGroupByLabel,
'agregation_function' => $this->sAgregationFunction,
'agregation_attribute' => $this->sAgregationAttribute,
'limit' => $this->sLimit,
'order_direction' => $this->sOrderDirection,
);
break;
}
@@ -966,6 +990,10 @@ abstract class DashletGroupBy extends Dashlet
return $aGroupBy;
}
/**
* @param DesignerForm $oForm
* @throws DictExceptionMissingString
*/
public function GetPropertiesFields(DesignerForm $oForm)
{
$oField = new DesignerTextField('title', Dict::S('UI:DashletGroupBy:Prop-Title'), $this->aProperties['title']);
@@ -1001,6 +1029,100 @@ abstract class DashletGroupBy extends Dashlet
$oField->SetMandatory();
$oField->SetAllowedValues($aStyles);
$oForm->AddField($oField);
$aFunctionAttributes = $this->GetNumericAttributes($this->aProperties['query']);
$aFunctions = $this->GetAllowedFunctions($aFunctionAttributes);
$oSelectorField = new DesignerFormSelectorField('agregation_function', Dict::S('UI:DashletGroupBy:Prop-Function'), $this->aProperties['agregation_function']);
$oForm->AddField($oSelectorField);
$oSelectorField->SetMandatory();
// Count sub-menu
$oSubForm = new DesignerForm();
$oSelectorField->AddSubForm($oSubForm, Dict::S('UI:GroupBy:count'), 'count');
foreach($aFunctions as $sFct => $sLabel)
{
$oSubForm = new DesignerForm();
$oField = new DesignerComboField('agregation_attribute', Dict::S('UI:DashletGroupBy:Prop-FunctionAttribute'), $this->aProperties['agregation_attribute']);
$oField->SetMandatory();
$oField->SetAllowedValues($aFunctionAttributes);
$oSubForm->AddField($oField);
$oSelectorField->AddSubForm($oSubForm, $sLabel, $sFct);
}
$aOrderDirections = array(
'asc' => Dict::S('UI:DashletGroupBy:Order:asc'),
'desc' => Dict::S('UI:DashletGroupBy:Order:desc'),
);
$oField = new DesignerComboField('order_direction', Dict::S('UI:DashletGroupBy:Prop-OrderDirection'), $this->aProperties['order_direction']);
$oField->SetMandatory();
$oField->SetAllowedValues($aOrderDirections);
$oForm->AddField($oField);
$oField = new DesignerIntegerField('limit', Dict::S('UI:DashletGroupBy:Prop-Limit'), $this->aProperties['limit']);
$oForm->AddField($oField);
}
/**
* @return array
* @throws DictExceptionMissingString
*/
protected function GetOrderBy()
{
if (is_null($this->sClass))
{
return array();
}
return array(
$this->aProperties['group_by'] => $this->oModelReflection->GetLabel($this->sClass, $this->aProperties['group_by']),
'_itop_'.$this->aProperties['agregation_function'].'_' => Dict::S('UI:GroupBy:'.$this->aProperties['agregation_function']));
}
/**
* @return array
* @throws DictExceptionMissingString
*/
protected function GetAllowedFunctions($aFunctionAttributes)
{
$aFunctions = array();
if (!empty($aFunctionAttributes) || is_null($this->sClass))
{
$aFunctions['sum'] = Dict::S('UI:GroupBy:sum');
$aFunctions['avg'] = Dict::S('UI:GroupBy:avg');
$aFunctions['min'] = Dict::S('UI:GroupBy:min');
$aFunctions['max'] = Dict::S('UI:GroupBy:max');
}
return $aFunctions;
}
/**
* @return array
*/
protected function GetNumericAttributes($sOql)
{
$aFunctionAttributes = array();
$oQuery = $this->oModelReflection->GetQuery($sOql);
$sClass = $oQuery->GetClass();
if (is_null($sClass))
{
return $aFunctionAttributes;
}
foreach($this->oModelReflection->ListAttributes($sClass) as $sAttCode => $sAttType)
{
switch ($sAttType)
{
case 'AttributeDecimal':
case 'AttributeDuration':
case 'AttributeInteger':
case 'AttributePercentage':
$sLabel = $this->oModelReflection->GetLabel($sClass, $sAttCode);
$aFunctionAttributes[$sAttCode] = $sLabel;
break;
}
}
return $aFunctionAttributes;
}
public function Update($aValues, $aUpdatedFields)
@@ -1052,6 +1174,15 @@ abstract class DashletGroupBy extends Dashlet
$oDashlet->bRedrawNeeded = true;
$oDashlet->bFormRedrawNeeded = true;
}
if (in_array('group_by', $aUpdatedFields) || in_array('agregation_attribute', $aUpdatedFields) || in_array('order_direction', $aUpdatedFields) || in_array('limit', $aUpdatedFields))
{
$oDashlet->bRedrawNeeded = true;
}
if (in_array('agregation_function', $aUpdatedFields))
{
$oDashlet->bRedrawNeeded = true;
$oDashlet->bFormRedrawNeeded = true;
}
return $oDashlet;
}

View File

@@ -285,7 +285,19 @@ class DisplayBlock
}
$oPage->add($this->GetRenderContent($oPage, $aExtraParams, $sId));
}
/**
* @param WebPage $oPage
* @param array $aExtraParams
* @param $sId
* @return string
* @throws ApplicationException
* @throws CoreException
* @throws CoreWarning
* @throws DictExceptionMissingString
* @throws MySQLException
* @throws Exception
*/
public function GetRenderContent(WebPage $oPage, $aExtraParams = array(), $sId)
{
$sHtml = '';
@@ -400,6 +412,7 @@ class DisplayBlock
case 'count':
if (isset($aExtraParams['group_by']))
{
$sAlias = $this->m_oFilter->GetClassAlias();
if (isset($aExtraParams['group_by_label']))
{
$oGroupByExp = Expression::FromOQL($aExtraParams['group_by']);
@@ -408,7 +421,6 @@ class DisplayBlock
else
{
// Backward compatibility: group_by is simply a field id
$sAlias = $this->m_oFilter->GetClassAlias();
$oGroupByExp = new FieldExpression($aExtraParams['group_by'], $sAlias);
$sGroupByLabel = MetaModel::GetLabel($this->m_oFilter->GetClass(), $aExtraParams['group_by']);
}
@@ -430,7 +442,42 @@ class DisplayBlock
$aGroupBy = array();
$aGroupBy['grouped_by_1'] = $oGroupByExp;
$sSql = $this->m_oFilter->MakeGroupByQuery($aQueryParams, $aGroupBy, true);
$aQueryParams = array();
if (isset($aExtraParams['query_params']))
{
$aQueryParams = $aExtraParams['query_params'];
}
$aFunctions = array();
$aOrderBy = array();
$sAgregationFunction = 'count';
$sFctVar = '_itop_count_';
$sAgregationAttr = '';
if (isset($aExtraParams['agregation_function']) && !empty($aExtraParams['agregation_attribute']))
{
$sAgregationFunction = $aExtraParams['agregation_function'];
$sAgregationAttr = $aExtraParams['agregation_attribute'];
$oAttrExpr = Expression::FromOQL('`'.$sAlias.'`.`'.$sAgregationAttr.'`');
$oFctExpr = new FunctionExpression(strtoupper($sAgregationFunction), array($oAttrExpr));
$sFctVar = '_itop_'.$sAgregationFunction.'_';
$aFunctions = array($sFctVar => $oFctExpr);
}
if (!empty($sAgregationAttr))
{
$sClass = $this->m_oFilter->GetClass();
$sAgregationAttr = MetaModel::GetLabel($sClass, $sAgregationAttr);
}
$iLimit = 0;
if (isset($aExtraParams['limit']))
{
$iLimit = intval($aExtraParams['limit']);
}
if (isset($aExtraParams['order_direction']))
{
$aOrderBy = array($sFctVar => ($aExtraParams['order_direction'] === 'asc'));
}
$sSql = $this->m_oFilter->MakeGroupByQuery($aQueryParams, $aGroupBy, true, $aFunctions, $aOrderBy, $iLimit);
$aRes = CMDBSource::QueryToArray($sSql);
$aGroupBy = array();
@@ -443,7 +490,7 @@ class DisplayBlock
$aValues[$iRow] = $sValue;
$sHtmlValue = $oGroupByExp->MakeValueLabel($this->m_oFilter, $sValue, $sValue);
$aLabels[$iRow] = $sHtmlValue;
$aGroupBy[$iRow] = (int) $aRow['_itop_count_'];
$aGroupBy[$iRow] = (int) $aRow[$sFctVar];
$iTotalCount += $aRow['_itop_count_'];
}
@@ -459,12 +506,12 @@ class DisplayBlock
$oSubsetSearch->AddConditionExpression($oCondition);
$sFilter = urlencode($oSubsetSearch->serialize());
$aData[] = array ( 'group' => $aLabels[$iRow],
$aData[] = array ('group' => $aLabels[$iRow],
'value' => "<a href=\"".utils::GetAbsoluteUrlAppRoot()."pages/UI.php?operation=search&dosearch=1&$sParams&filter=$sFilter\">$iCount</a>"); // TO DO: add the context information
}
$aAttribs =array(
'group' => array('label' => $sGroupByLabel, 'description' => ''),
'value' => array('label'=> Dict::S('UI:GroupBy:Count'), 'description' => Dict::S('UI:GroupBy:Count+'))
'value' => array('label'=> Dict::S('UI:GroupBy:'.$sAgregationFunction), 'description' => Dict::Format('UI:GroupBy:'.$sAgregationFunction.'+', $sAgregationAttr))
);
$sFormat = isset($aExtraParams['format']) ? $aExtraParams['format'] : 'UI:Pagination:HeaderNoSelection';
$sHtml .= $oPage->GetP(Dict::Format($sFormat, $iTotalCount));
@@ -924,18 +971,21 @@ class DisplayBlock
$sFilter = $this->m_oFilter->serialize();
$oContext = new ApplicationContext();
$sContextParam = $oContext->GetForLink();
$sAgregationFunction = isset($aExtraParams['agregation_function']) ? $aExtraParams['agregation_function'] : '';
$sAgregationAttr = isset($aExtraParams['agregation_attribute']) ? $aExtraParams['agregation_attribute'] : '';
$sLimit = isset($aExtraParams['limit']) ? $aExtraParams['limit'] : '';
$sOrderBy = isset($aExtraParams['order_by']) ? $aExtraParams['order_by'] : '';
$sOrderDirection = isset($aExtraParams['order_direction']) ? $aExtraParams['order_direction'] : '';
if (isset($aExtraParams['group_by_label']))
{
$sUrl = json_encode(utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$sGroupBy{$sGroupByExpr}&params[group_by_label]={$aExtraParams['group_by_label']}&params[chart_type]=$sChartType&params[currentId]=$sId{$iChartCounter}&id=$sId{$iChartCounter}&filter=".urlencode($sFilter).'&'.$sContextParam);
$sUrl = json_encode(utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$sGroupBy{$sGroupByExpr}&params[group_by_label]={$aExtraParams['group_by_label']}&params[chart_type]=$sChartType&params[currentId]=$sId{$iChartCounter}&params[order_direction]=$sOrderDirection&params[order_by]=$sOrderBy&params[limit]=$sLimit&params[agregation_function]=$sAgregationFunction&params[agregation_attribute]=$sAgregationAttr&id=$sId{$iChartCounter}&filter=".urlencode($sFilter).'&'.$sContextParam);
}
else
{
$sUrl = json_encode(utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$sGroupBy{$sGroupByExpr}&params[chart_type]=$sChartType&params[currentId]=$sId{$iChartCounter}&id=$sId{$iChartCounter}&filter=".urlencode($sFilter).'&'.$sContextParam);
$sUrl = json_encode(utils::GetAbsoluteUrlAppRoot()."pages/ajax.render.php?operation=chart&params[group_by]=$sGroupBy{$sGroupByExpr}&params[chart_type]=$sChartType&params[currentId]=$sId{$iChartCounter}&params[order_direction]=$sOrderDirection&params[order_by]=$sOrderBy&params[limit]=$sLimit&params[agregation_function]=$sAgregationFunction&params[agregation_attribute]=$sAgregationAttr&id=$sId{$iChartCounter}&filter=".urlencode($sFilter).'&'.$sContextParam);
}
$sType = ($sChartType == 'pie') ? 'pie' : 'bar';
$oPage->add_ready_script(
<<<EOF
$.post($sUrl, {}, function(data) {
@@ -952,22 +1002,47 @@ EOF
if (isset($aExtraParams['group_by']))
{
$sAlias = $this->m_oFilter->GetClassAlias();
if (isset($aExtraParams['group_by_label']))
{
$oGroupByExp = Expression::FromOQL($aExtraParams['group_by']);
$sGroupByLabel = $aExtraParams['group_by_label'];
}
else
{
// Backward compatibility: group_by is simply a field id
$sAlias = $this->m_oFilter->GetClassAlias();
$oGroupByExp = new FieldExpression($aExtraParams['group_by'], $sAlias);
$sGroupByLabel = MetaModel::GetLabel($this->m_oFilter->GetClass(), $aExtraParams['group_by']);
}
$aGroupBy = array();
$aGroupBy['grouped_by_1'] = $oGroupByExp;
$sSql = $this->m_oFilter->MakeGroupByQuery($aQueryParams, $aGroupBy, true);
$aQueryParams = array();
if (isset($aExtraParams['query_params']))
{
$aQueryParams = $aExtraParams['query_params'];
}
$aFunctions = array();
$aOrderBy = array();
$sFctVar = '_itop_count_';
if (isset($aExtraParams['agregation_function']) && !empty($aExtraParams['agregation_attribute']))
{
$sAgregationFunction = $aExtraParams['agregation_function'];
$sAgregationAttr = $aExtraParams['agregation_attribute'];
$oAttrExpr = Expression::FromOQL('`'.$sAlias.'`.`'.$sAgregationAttr.'`');
$oFctExpr = new FunctionExpression(strtoupper($sAgregationFunction), array($oAttrExpr));
$sFctVar = '_itop_'.$sAgregationFunction.'_';
$aFunctions = array($sFctVar => $oFctExpr);
}
$iLimit = 0;
if (isset($aExtraParams['limit']))
{
$iLimit = intval($aExtraParams['limit']);
}
if (isset($aExtraParams['order_direction']))
{
$aOrderBy = array($sFctVar => ($aExtraParams['order_direction'] === 'asc'));
}
$sSql = $this->m_oFilter->MakeGroupByQuery($aQueryParams, $aGroupBy, true, $aFunctions, $aOrderBy, $iLimit);
$aRes = CMDBSource::QueryToArray($sSql);
$oContext = new ApplicationContext();
$sContextParam = $oContext->GetForLink();
@@ -980,9 +1055,9 @@ EOF
{
$sValue = $aRow['grouped_by_1'];
$sHtmlValue = $oGroupByExp->MakeValueLabel($this->m_oFilter, $sValue, $sValue);
$aGroupBy[(int)$iRow] = (int) $aRow['_itop_count_'];
$aGroupBy[(int)$iRow] = (int) $aRow[$sFctVar];
$iTotalCount += $aRow['_itop_count_'];
$aValues[] = array('label' => html_entity_decode(strip_tags($sHtmlValue), ENT_QUOTES, 'UTF-8'), 'label_html' => $sHtmlValue, 'value' => (int) $aRow['_itop_count_']);
$aValues[] = array('label' => html_entity_decode(strip_tags($sHtmlValue), ENT_QUOTES, 'UTF-8'), 'label_html' => $sHtmlValue, 'value' => (int) $aRow[$sFctVar]);
// Build the search for this subset
$oSubsetSearch = $this->m_oFilter->DeepClone();

View File

@@ -1217,6 +1217,27 @@ When associated with a trigger, each action is given an "order" number, specifyi
'UI:DashletGroupByTable:Label' => 'Group By (table)',
'UI:DashletGroupByTable:Description' => 'List (Grouped by a field)',
// New in 2.5
'UI:DashletGroupBy:Prop-Function' => 'Agregation function',
'UI:DashletGroupBy:Prop-FunctionAttribute' => 'Function attribute',
'UI:DashletGroupBy:Prop-OrderDirection' => 'Direction',
'UI:DashletGroupBy:Prop-Limit' => 'Limit',
'UI:DashletGroupBy:Order:asc' => 'Ascending',
'UI:DashletGroupBy:Order:desc' => 'Descending',
'UI:GroupBy:count' => 'Count',
'UI:GroupBy:count+' => 'Number of elements',
'UI:GroupBy:sum' => 'Sum',
'UI:GroupBy:sum+' => 'Sum of %1$s',
'UI:GroupBy:avg' => 'Average',
'UI:GroupBy:avg+' => 'Average of %1$s',
'UI:GroupBy:min' => 'Minimum',
'UI:GroupBy:min+' => 'Minimum of %1$s',
'UI:GroupBy:max' => 'Maximum',
'UI:GroupBy:max+' => 'Maximum of %1$s',
// ---
'UI:DashletHeaderStatic:Label' => 'Header',
'UI:DashletHeaderStatic:Description' => 'Displays an horizontal separator',
'UI:DashletHeaderStatic:Prop-Title' => 'Title',

View File

@@ -160,7 +160,6 @@ Dict::Add('FR FR', 'French', 'Français', array(
'Class:User/Attribute:status+' => 'Est-ce que ce compte utilisateur est actif, ou non?',
'Class:User/Attribute:status/Value:enabled' => 'Actif',
'Class:User/Attribute:status/Value:disabled' => 'Désactivé',
'Class:User/Attribute:status' => 'Etat',
'Class:User/Error:LoginMustBeUnique' => 'Le login doit être unique - "%1s" est déjà utilisé.',
'Class:User/Error:AtLeastOneProfileIsNeeded' => 'L\'utilisateur doit avoir au moins un profil.',
'Class:UserInternal' => 'Utilisateur interne',
@@ -1054,6 +1053,27 @@ Lors de l\'association à un déclencheur, on attribue à chaque action un numé
'UI:DashletGroupByTable:Label' => 'Table',
'UI:DashletGroupByTable:Description' => 'Table',
// New in 2.5
'UI:DashletGroupBy:Prop-Function' => 'Fonction d\'agregation',
'UI:DashletGroupBy:Prop-FunctionAttribute' => 'Attribut',
'UI:DashletGroupBy:Prop-OrderDirection' => 'Type de tri',
'UI:DashletGroupBy:Prop-Limit' => 'Limite',
'UI:DashletGroupBy:Order:asc' => 'Croissant',
'UI:DashletGroupBy:Order:desc' => 'Décroissant',
'UI:GroupBy:count' => 'Nombre',
'UI:GroupBy:count+' => 'Nombre d\'éléments',
'UI:GroupBy:sum' => 'Somme',
'UI:GroupBy:sum+' => 'Somme : %1$s',
'UI:GroupBy:avg' => 'Moyenne',
'UI:GroupBy:avg+' => 'Moyenne : %1$s',
'UI:GroupBy:min' => 'Minimum',
'UI:GroupBy:min+' => 'Minimum : %1$s',
'UI:GroupBy:max' => 'Maximum',
'UI:GroupBy:max+' => 'Maximum : %1$s',
// ---
'UI:DashletHeaderStatic:Label' => 'En-tête',
'UI:DashletHeaderStatic:Description' => 'En-tête présenté comme une barre horizontale',
'UI:DashletHeaderStatic:Prop-Title' => 'Titre',

View File

@@ -102,14 +102,19 @@ $(function()
{
var oParams = {};
var oProperties = $('#dashlet_properties_'+this.options.dashlet_id);
oProperties.find(':itop-property_field').each(function(){
var oWidget = $(this).data('itopProperty_field');
if (oWidget)
{
var oVal = oWidget._get_committed_value();
oParams[oVal.name] = oVal.value;
}
});
oProperties.find('.itop-property-field').each(function(){
var oWidget = $(this).data('itopProperty_field');
if (oWidget == undefined)
{
oWidget = $(this).data('itopSelector_property_field');
}
if (oWidget && $(this).is(':visible'))
{
var oVal = oWidget._get_committed_value();
oParams[oVal.name] = oVal.value;
}
});
oParams.dashlet_id = this.options.dashlet_id;
oParams.dashlet_class = this.options.dashlet_class;
return oParams;

View File

@@ -965,7 +965,7 @@ try
foreach($aUpdatedProperties as $sProp)
{
$sDecodedProp = str_replace('attr_', '', $sProp); // Remove the attr_ prefix
$aCurrentValues[$sDecodedProp] = $aPreviousValues[$sProp]; // Set the previous value
$aCurrentValues[$sDecodedProp] = (isset($aPreviousValues[$sProp]) ? $aPreviousValues[$sProp] : ''); // Set the previous value
$aUpdatedDecoded[] = $sDecodedProp;
}