diff --git a/dictionaries/dictionary.itop.ui.php b/dictionaries/dictionary.itop.ui.php index 2411d7049..12f2568be 100644 --- a/dictionaries/dictionary.itop.ui.php +++ b/dictionaries/dictionary.itop.ui.php @@ -886,6 +886,7 @@ When associated with a trigger, each action is given an "order" number, specifyi 'UI:RelationshipGraph' => 'Graphical view', 'UI:RelationshipList' => 'List', 'UI:OperationCancelled' => 'Operation Cancelled', + 'UI:ElementsDisplayed' => 'Filtering', 'Portal:Title' => 'iTop user portal', 'Portal:Refresh' => 'Refresh', diff --git a/dictionaries/fr.dictionary.itop.ui.php b/dictionaries/fr.dictionary.itop.ui.php index 33ed6caff..94833f0d5 100644 --- a/dictionaries/fr.dictionary.itop.ui.php +++ b/dictionaries/fr.dictionary.itop.ui.php @@ -730,7 +730,7 @@ Lors de l\'association à un déclencheur, on attribue à chaque action un numé 'UI:DisplayThisMessageAtStartup' => 'Afficher ce message au démarrage', 'UI:RelationshipGraph' => 'Vue graphique', 'UI:RelationshipList' => 'Liste', - 'UI:ElementsDisplayed' => 'Eléments Affichés', + 'UI:ElementsDisplayed' => 'Filtrage', 'UI:OperationCancelled' => 'Opération Annulée', 'Portal:Title' => 'Portail utilisateur iTop', 'Portal:Refresh' => 'Rafraîchir', diff --git a/navigator/iTop/Navigator.as b/navigator/iTop/Navigator.as index c7ce171c7..5d24d98f0 100644 --- a/navigator/iTop/Navigator.as +++ b/navigator/iTop/Navigator.as @@ -8,6 +8,8 @@ import fl.controls.Slider; import fl.events.SliderEvent; import fl.controls.Label; + // For callbacks from Javascript + import flash.external.ExternalInterface; // The main canvas public class Navigator extends MovieClip @@ -26,6 +28,7 @@ protected var m_sRelation:String; protected var m_sObjClass:String; protected var m_sObjId:String; + protected var m_sExclude:String; // Constants protected var m_RADIUS = 150; @@ -43,14 +46,60 @@ { m_aLinks = new Array(); m_aNodes = new Array(); + m_sExclude = ''; m_fZoom = 1; initParameters(); - doLoadData(); + var success = true; + if (ExternalInterface.available) + { + //Security.allowDomain(loader.contentLoaderInfo.url); + //the addCallback registers a function to be called from javascript, and this is what you wanted to do: + try + { + ExternalInterface.addCallback("Filter", DoFilter); + } + catch(err) + { + m_sTitle.text = 'E: '+err.description; + success = false + } + } + + if (success) + { + //m_sTitle.text = 'Ok...'; + doLoadData(); + } + else + { + m_sTitle.text = 'Failed to addCallback'; + } + addEventListener(Event.ENTER_FRAME, initGraphics); //Stop scaling the flash content stage.scaleMode = StageScaleMode.NO_SCALE; } + function Reset() + { + m_aLinks = new Array(); + for (var i:String in m_aNodes) + { + m_oCanvas.removeChild(m_aNodes[i]); + } + m_aNodes = new Array(); + removeEventListener(Event.ENTER_FRAME, drawLines); + stage.removeEventListener(MouseEvent.MOUSE_DOWN, mouseDown) + stage.removeEventListener(MouseEvent.MOUSE_UP, mouseReleased); + } + + function DoFilter(sExcludeList:String):void + { + //do something + m_sExclude = sExcludeList; + doLoadData(); + } + protected function initParameters():void { @@ -70,6 +119,8 @@ m_oCanvas.scaleY = m_fZoom; // Handle listeners... removeEventListener(Event.ENTER_FRAME,initGraphics); + m_oZoomSlider.value = 100; + m_oZoomSlider.addEventListener(SliderEvent.CHANGE, onZoomChange); } function mouseDown(event:MouseEvent):void { @@ -99,19 +150,22 @@ m_oCanvas.scaleX = m_fZoom; m_oCanvas.scaleY = m_fZoom; } - function GetZommLevel() + function GetZoomLevel() { return m_fZoom; } function doLoadData() { + m_sTitle.text = "Loading..."; + m_oPreloader.visible = true; + m_oZoomSlider.enabled = true; var sSeparator:String = '?'; if (m_sDataUrl.indexOf(sSeparator) != -1) { sSeparator = '&'; } - var myString:String = m_sDataUrl+sSeparator+'relation='+m_sRelation+'&class='+m_sObjClass+'&id='+m_sObjId; + var myString:String = m_sDataUrl+sSeparator+'relation='+m_sRelation+'&class='+m_sObjClass+'&id='+m_sObjId+'&exclude='+m_sExclude; trace("Requesting:"+myString); var myXMLURL:URLRequest = new URLRequest(myString); m_oLoader = new URLLoader(); @@ -125,6 +179,7 @@ { try { + Reset(); var myXML:XML = XML(m_oLoader.data); //trace("Data loaded." + myXML); //trace("==========================="); @@ -132,8 +187,6 @@ m_sTitle.text = decodeEntities(myXML.attribute("title").toString()); m_oZoomSlider.enabled = true; addEventListener(Event.ENTER_FRAME, drawLines); - m_oZoomSlider.value = 100; - m_oZoomSlider.addEventListener(SliderEvent.CHANGE, onZoomChange); stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown) stage.addEventListener(MouseEvent.MOUSE_UP, mouseReleased); //trace('======= Initial Posistions ========='); @@ -155,8 +208,7 @@ { if (m_oPreloader != null) { - removeChild(m_oPreloader); - m_oPreloader = null; + m_oPreloader.visible = false; } } } @@ -165,8 +217,7 @@ { if (m_oPreloader != null) { - removeChild(m_oPreloader); - m_oPreloader = null; + m_oPreloader.visible = false; } m_sTitle.text = "I/O Error: unable to load the graph data ("+event+")"; } diff --git a/navigator/navigator.fla b/navigator/navigator.fla index d5f7ca346..f587149ef 100755 Binary files a/navigator/navigator.fla and b/navigator/navigator.fla differ diff --git a/navigator/navigator.swf b/navigator/navigator.swf index feae28bda..0b5600984 100755 Binary files a/navigator/navigator.swf and b/navigator/navigator.swf differ diff --git a/pages/UI.php b/pages/UI.php index ba277b33b..5d2d5447c 100644 --- a/pages/UI.php +++ b/pages/UI.php @@ -2029,25 +2029,101 @@ EOF $oP->AddTabContainer('Navigator'); $oP->SetCurrentTabContainer('Navigator'); $oP->SetCurrentTab(Dict::S('UI:RelationshipGraph')); + + $oP->add("
\n"); + $oP->add_ready_script( +<<GetRelatedObjects($sRelation, 20 /* iMaxDepth */, $aResults); + foreach($aResults as $sClassIdx => $aObjects) + { + foreach($aObjects as $oCurrObj) + { + $sSubClass = get_class($oCurrObj); + $aSortedElements[$sSubClass] = MetaModel::GetName($sSubClass); + } + } + + asort($aSortedElements); + $idx = 0; + foreach($aSortedElements as $sSubClass => $sClassName) + { + $oP->add(" "); + $idx++; + } + $oP->add("
\n"); + $oP->add("
\n"); + $oP->add("
".Dict::S('UI:ElementsDisplayed')."
\n"); + $width = 1000; $height = 700; $sDrillUrl = utils::GetAbsoluteUrlAppRoot().'pages/UI.php?operation=details&'.$oAppContext->GetForLink(); $sParams = "pWidth=$width&pHeight=$height&drillUrl=".urlencode($sDrillUrl)."&displayController=false&xmlUrl=".urlencode("./xml.navigator.php")."&obj_class=$sClass&obj_id=$id&relation=$sRelation"; - $oP->add("
- + $oP->add("
+ - +
\n"); $oP->SetCurrentTab(Dict::S('UI:RelationshipList')); $oP->add("

 

"); + $oP->add_script( +<<add_ready_script( <<getMessage()); } } -?> +?> \ No newline at end of file diff --git a/pages/xml.navigator.php b/pages/xml.navigator.php index 7be77b29d..65a3a2c0b 100755 --- a/pages/xml.navigator.php +++ b/pages/xml.navigator.php @@ -59,9 +59,10 @@ function AddNodeDetails(&$oNode, $oObj) * @param DBObject $oObj The current object * @param string $sRelation The name of the relation to search with */ -function GetRelatedObjectsAsXml(DBObject $oObj, $sRelationName, &$oLinks, &$oXmlDoc, &$oXmlNode, $iDepth = 0) +function GetRelatedObjectsAsXml(DBObject $oObj, $sRelationName, &$oLinks, &$oXmlDoc, &$oXmlNode, $iDepth = 0, $aExcludedClasses) { $aResults = array(); + $bAddLinks = false; $oObj->GetRelatedObjects($sRelationName, 1 /* iMaxDepth */, $aResults); if ($iDepth > MAX_RECURSION_DEPTH) return; @@ -71,25 +72,33 @@ function GetRelatedObjectsAsXml(DBObject $oObj, $sRelationName, &$oLinks, &$oXml { if (is_object($oTargetObj)) { - $oLinkingNode = $oXmlDoc->CreateElement('link'); - $oLinkingNode->SetAttribute('relation', $sRelationName); - $oLinkingNode->SetAttribute('arrow', 1); // Such relations have a direction, display an arrow - $oLinkedNode = $oXmlDoc->CreateElement('node'); - $oLinkedNode->SetAttribute('id', $oTargetObj->GetKey()); - $oLinkedNode->SetAttribute('obj_class', get_class($oTargetObj)); - $oLinkedNode->SetAttribute('obj_class_name', htmlspecialchars(MetaModel::GetName(get_class($oTargetObj)))); - $oLinkedNode->SetAttribute('name', htmlspecialchars($oTargetObj->GetRawName())); // htmlentities is too much for XML - $oLinkedNode->SetAttribute('icon', BuildIconPath($oTargetObj->GetIcon(false /* No IMG tag */))); - AddNodeDetails($oLinkedNode, $oTargetObj); - $oSubLinks = $oXmlDoc->CreateElement('links'); - // Recurse - GetRelatedObjectsAsXml($oTargetObj, $sRelationName, $oSubLinks, $oXmlDoc, $oLinkedNode, $iDepth++); - $oLinkingNode->AppendChild($oLinkedNode); - $oLinks->AppendChild($oLinkingNode); + if (in_array(get_class($oTargetObj), $aExcludedClasses)) + { + GetRelatedObjectsAsXml($oTargetObj, $sRelationName, $oLinks, $oXmlDoc, $oXmlNode, $iDepth++, $aExcludedClasses); + } + else + { + $oLinkingNode = $oXmlDoc->CreateElement('link'); + $oLinkingNode->SetAttribute('relation', $sRelationName); + $oLinkingNode->SetAttribute('arrow', 1); // Such relations have a direction, display an arrow + $oLinkedNode = $oXmlDoc->CreateElement('node'); + $oLinkedNode->SetAttribute('id', $oTargetObj->GetKey()); + $oLinkedNode->SetAttribute('obj_class', get_class($oTargetObj)); + $oLinkedNode->SetAttribute('obj_class_name', htmlspecialchars(MetaModel::GetName(get_class($oTargetObj)))); + $oLinkedNode->SetAttribute('name', htmlspecialchars($oTargetObj->GetRawName())); // htmlentities is too much for XML + $oLinkedNode->SetAttribute('icon', BuildIconPath($oTargetObj->GetIcon(false /* No IMG tag */))); + AddNodeDetails($oLinkedNode, $oTargetObj); + $oSubLinks = $oXmlDoc->CreateElement('links'); + // Recurse + GetRelatedObjectsAsXml($oTargetObj, $sRelationName, $oSubLinks, $oXmlDoc, $oLinkedNode, $iDepth++, $aExcludedClasses); + $oLinkingNode->AppendChild($oLinkedNode); + $oLinks->AppendChild($oLinkingNode); + $bAddLinks = true; + } } } } - if (count($aResults) > 0) + if ($bAddLinks) { $oXmlNode->AppendChild($oLinks); } @@ -117,6 +126,9 @@ $id = utils::ReadParam('id', 1); $sRelation = utils::ReadParam('relation', 'impacts'); $aValidRelations = MetaModel::EnumRelations(); $sFormat = utils::ReadParam('format', 'xml'); +$sExcludedClasses = utils::ReadParam('exclude', '', false, 'raw_data'); +$aExcludedClasses = explode(',', $sExcludedClasses); + if (!in_array($sRelation, $aValidRelations)) { @@ -167,7 +179,7 @@ try $oXmlRoot->SetAttribute('position', 'left'); $oXmlRoot->SetAttribute('title', MetaModel::GetRelationDescription($sRelation).' '. htmlspecialchars($oObj->GetRawName())); - GetRelatedObjectsAsXml($oObj, $sRelation, $oLinks, $oXmlDoc, $oXmlNode); + GetRelatedObjectsAsXml($oObj, $sRelation, $oLinks, $oXmlDoc, $oXmlNode, 0, $aExcludedClasses); $oXmlRoot->AppendChild($oXmlNode); $oXmlDoc->AppendChild($oXmlRoot);