diff --git a/application/displayblock.class.inc.php b/application/displayblock.class.inc.php index 211e48792..076ef2c59 100644 --- a/application/displayblock.class.inc.php +++ b/application/displayblock.class.inc.php @@ -65,7 +65,14 @@ class DisplayBlock public static function FromObjectSet(DBObjectSet $oSet, $sStyle, $aParams = array()) { $oDummyFilter = new DBObjectSearch($oSet->GetClass()); - $oBlock = new DisplayBlock($oDummyFilter, $sStyle, false, $aParams, $oSet); // DisplayBlocks built this way are synchronous + $aKeys = array(); + while($oObject = $oSet->Fetch()) + { + $aKeys[] = $oObject->GetKey(); + } + $oSet->Rewind(); + $oDummyFilter->AddCondition('id', $aKeys, 'IN'); + $oBlock = new DisplayBlock($oDummyFilter, $sStyle, false, $aParams); // DisplayBlocks built this way are synchronous return $oBlock; } @@ -553,6 +560,30 @@ class DisplayBlock case 'actions': $sClass = $this->m_oFilter->GetClass(); $oAppContext = new ApplicationContext(); + $bContextFilter = isset($aExtraParams['context_filter']) ? isset($aExtraParams['context_filter']) != 0 : false; + if ($bContextFilter) + { + $aFilterCodes = array_keys(MetaModel::GetClassFilterDefs($this->m_oFilter->GetClass())); + foreach($oAppContext->GetNames() as $sFilterCode) + { + $sContextParamValue = trim(utils::ReadParam($sFilterCode, null)); + if (!is_null($sContextParamValue) && ! empty($sContextParamValue) && MetaModel::IsValidFilterCode($sClass, $sFilterCode)) + { + $this->m_oFilter->AddCondition($sFilterCode, $sContextParamValue); // Use the default 'loose' operator + } + } + $aQueryParams = array(); + if (isset($aExtraParams['query_params'])) + { + $aQueryParams = $aExtraParams['query_params']; + } + $this->m_oSet = new CMDBObjectSet($this->m_oFilter, array(), $aQueryParams); + } + $iCount = $this->m_oSet->Count(); + $sHyperlink = '../pages/UI.php?operation=search&filter='.$this->m_oFilter->serialize(); + $sHtml .= '

'; + $sHtml .= MetaModel::GetClassIcon($sClass, true, 'float;left;margin-right:10px;'); + $sHtml .= MetaModel::GetName($sClass).': '.$iCount.'

'; $sParams = $oAppContext->GetForLink(); $sHtml .= '

'; if (UserRights::IsActionAllowed($sClass, UR_ACTION_MODIFY)) @@ -562,6 +593,67 @@ class DisplayBlock $sHtml .= "".Dict::Format('UI:SearchFor_Class', MetaModel::GetName($sClass))."\n"; $sHtml .= '

'; break; + + case 'summary': + $sClass = $this->m_oFilter->GetClass(); + $oAppContext = new ApplicationContext(); + $sTitle = isset($aExtraParams['title[block]']) ? $aExtraParams['title[block]'] : ''; + $sLabel = isset($aExtraParams['label[block]']) ? $aExtraParams['label[block]'] : ''; + $sStateAttrCode = isset($aExtraParams['status[block]']) ? $aExtraParams['status[block]'] : 'status'; + $sStatesList = isset($aExtraParams['status_codes[block]']) ? $aExtraParams['status_codes[block]'] : ''; + + $bContextFilter = isset($aExtraParams['context_filter']) ? isset($aExtraParams['context_filter']) != 0 : false; + if ($bContextFilter) + { + $aFilterCodes = array_keys(MetaModel::GetClassFilterDefs($this->m_oFilter->GetClass())); + foreach($oAppContext->GetNames() as $sFilterCode) + { + $sContextParamValue = trim(utils::ReadParam($sFilterCode, null)); + if (!is_null($sContextParamValue) && ! empty($sContextParamValue) && MetaModel::IsValidFilterCode($sClass, $sFilterCode)) + { + $this->m_oFilter->AddCondition($sFilterCode, $sContextParamValue); // Use the default 'loose' operator + } + } + $aQueryParams = array(); + if (isset($aExtraParams['query_params'])) + { + $aQueryParams = $aExtraParams['query_params']; + } + $this->m_oSet = new CMDBObjectSet($this->m_oFilter, array(), $aQueryParams); + } + // Summary details + $aCounts = array(); + $aStateLabels = array(); + if (!empty($sStateAttrCode) && !empty($sStatesList)) + { + $aStates = explode(',', $sStatesList); + $oAttDef = MetaModel::GetAttributeDef($sClass, $sStateAttrCode); + foreach($aStates as $sStateValue) + { + $oFilter = clone($this->m_oFilter); + $oFilter->AddCondition($sStateAttrCode, $sStateValue, '='); + $oSet = new DBObjectSet($oFilter); + $aCounts[$sStateValue] = $oSet->Count(); + $aStateLabels[$sStateValue] = Dict::S("Class:".$oAttDef->GetHostClass()."/Attribute:$sStateAttrCode/Value:$sStateValue"); + if ($aCounts[$sStateValue] == 0) + { + $aCounts[$sStateValue] = '-'; + } + else + { + $sHyperlink = '../pages/UI.php?operation=search&filter='.$oFilter->serialize(); + $aCounts[$sStateValue] = "{$aCounts[$sStateValue]}"; + } + } + } + $sHtml .= '
'; + $sHtml .= '
'.implode('', $aStateLabels).'
'.implode('', $aCounts).'
'; + // Title & summary + $iCount = $this->m_oSet->Count(); + $sHyperlink = '../pages/UI.php?operation=search&filter='.$this->m_oFilter->serialize(); + $sHtml .= '

'.Dict::S(str_replace('_', ':', $sTitle)).'

'; + $sHtml .= ''.Dict::Format(str_replace('_', ':', $sLabel), $iCount).''; + break; case 'bare_details': while($oObj = $this->m_oSet->Fetch()) diff --git a/pages/UI.php b/pages/UI.php index 6ad441099..9668b103a 100644 --- a/pages/UI.php +++ b/pages/UI.php @@ -1393,6 +1393,10 @@ EOF $sClass = utils::ReadParam('class', ''); $id = utils::ReadParam('id', 0); $sRelation = utils::ReadParam('relation', 'impact'); + + $oP->AddTabContainer('Navigator'); + $oP->SetCurrentTabContainer('Navigator'); + $oP->SetCurrentTab(Dict::S('UI:RelationshipGraph')); $width = 1000; $height = 700; $sParams = "pWidth=$width&pHeight=$height&drillUrl=".urlencode('../pages/UI.php?operation=details')."&displayController=false&xmlUrl=".urlencode("./xml.navigator.php")."&obj_class=$sClass&obj_id=$id&relation=$sRelation"; @@ -1404,6 +1408,44 @@ EOF \n"); + $oP->SetCurrentTab(Dict::S('UI:RelationshipList')); + $oP->add("

 

"); + $oP->add_ready_script( +<<SetCurrentTab(''); break; default: