Przeglądaj źródła

Slight (incomptaible!) modification to the dashboards format to support incremental changes through the XML.

git-svn-id: http://svn.code.sf.net/p/itop/code/trunk@2336 a333f486-631f-4898-b8df-5754b55c2be0
dflaven 12 lat temu
rodzic
commit
426da70b94

+ 49 - 5
application/dashboard.class.inc.php

@@ -59,22 +59,54 @@ abstract class Dashboard
 		
 		$oCellsNode = $this->oDOMNode->getElementsByTagName('cells')->item(0);
 		$oCellsList = $oCellsNode->getElementsByTagName('cell');
+		$aCellOrder = array();
+		$iCellRank = 0;
 		foreach($oCellsList as $oCellNode)
 		{
 			$aDashletList = array();
-			$oDashletList = $oCellNode->getElementsByTagName('dashlet');
+			$oCellRank =  $oCellNode->getElementsByTagName('rank')->item(0);
+			if ($oCellRank)
+			{
+				$iCellRank = (int)$oCellRank->textContent;
+			}
+			$oDashletsNode = $oCellNode->getElementsByTagName('dashlets')->item(0);
+			$oDashletList = $oDashletsNode->getElementsByTagName('dashlet');
+			$iRank = 0;
+			$aDashletOrder = array();
 			foreach($oDashletList as $oDomNode)
 			{
 				$sDashletClass = $oDomNode->getAttribute('xsi:type');
+				$oRank =  $oDomNode->getElementsByTagName('rank')->item(0);
+				if ($oRank)
+				{
+					$iRank = (int)$oRank->textContent;
+				}
 				$sId = $oDomNode->getAttribute('id');
 				$oNewDashlet = new $sDashletClass($sId);
 				$oNewDashlet->FromDOMNode($oDomNode);
-				$aDashletList[] = $oNewDashlet;
+				$aDashletOrder[] = array('rank' => $iRank, 'dashlet' => $oNewDashlet);
 			}
-			$this->aCells[] = $aDashletList;
+			usort($aDashletOrder, array(get_class($this), 'SortOnRank'));
+			$aDashletList = array();
+			foreach($aDashletOrder as $aItem)
+			{
+				$aDashletList[] = $aItem['dashlet'];
+			}
+			$aCellOrder[] = array('rank' => $iCellRank, 'dashlets' => $aDashletList);
 		}
+		usort($aCellOrder, array(get_class($this), 'SortOnRank'));
+		foreach($aCellOrder as $aItem)
+		{
+			$this->aCells[] = $aItem['dashlets'];
+		}
+		
+		
 	}
 	
+	static function SortOnRank($aItem1, $aItem2)
+	{
+		return ($aItem1['rank'] > $aItem2['rank']) ? +1 : -1;
+	}
 	/**
 	 * Error handler to turn XML loading warnings into exceptions
 	 */
@@ -108,17 +140,29 @@ abstract class Dashboard
 
 		$oCellsNode = $oDoc->createElement('cells');
 		$oMainNode->appendChild($oCellsNode);
-
+		
+		$iCellRank = 0;
 		foreach ($this->aCells as $aCell)
 		{
 			$oCellNode = $oDoc->createElement('cell');
+			$oCellNode->setAttribute('id', $iCellRank);
 			$oCellsNode->appendChild($oCellNode);
+			$oCellRank = $oDoc->createElement('rank', $iCellRank);
+			$oCellNode->appendChild($oCellRank);
+			$iCellRank++;
+						
+			$iDashletRank = 0;
+			$oDashletsNode = $oDoc->createElement('dashlets');
+			$oCellNode->appendChild($oDashletsNode);
 			foreach ($aCell as $oDashlet)
 			{
 				$oNode = $oDoc->createElement('dashlet');
-				$oCellNode->appendChild($oNode);
+				$oDashletsNode->appendChild($oNode);
 				$oNode->setAttribute('id', $oDashlet->GetID());
 				$oNode->setAttribute('xsi:type', get_class($oDashlet));
+				$oDashletRank = $oDoc->createElement('rank', $iDashletRank);
+				$oNode->appendChild($oDashletRank);
+				$iDashletRank++;
 				$oDashlet->ToDOMNode($oNode);
 			}
 		}

+ 31 - 17
datamodels/1.x/itop-change-mgmt-1.0.0/overview.xml

@@ -3,25 +3,39 @@
   <layout>DashboardLayoutTwoCols</layout>
   <title></title>
   <cells>
-    <cell>
-      <dashlet id="1" xsi:type="DashletGroupByBars">
-        <title>UI-ChangeManagementOverview-ChangeByType</title>
-        <query>SELECT Change</query>
-        <group_by>finalclass</group_by>
-        <style>bars</style>
-      </dashlet>
+    <cell id="0">
+      <rank>0</rank>
+      <dashlets>
+        <dashlet id="1" xsi:type="DashletGroupByBars">
+          <rank>0</rank>
+          <title>UI-ChangeManagementOverview-ChangeByType</title>
+          <query>SELECT Change</query>
+          <group_by>finalclass</group_by>
+          <style>bars</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="2" xsi:type="DashletObjectList"/>
-      <title>UI-ChangeManagementOverview-ChangeUnassigned</title>
-      <query>SELECT Change WHERE status = 'new'</query>
-      <menu>false</menu>
+    <cell id="1">
+      <rank>1</rank>
+      <dashlets>
+        <dashlet id="2" xsi:type="DashletObjectList">
+          <rank>0</rank>
+          <title>UI-ChangeManagementOverview-ChangeUnassigned</title>
+          <query>SELECT Change WHERE status = 'new'</query>
+          <menu>false</menu>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="3" xsi:type="DashletObjectList"/>
-      <title>UI-ChangeManagementOverview-ChangeWithOutage</title>
-      <query>SELECT Change WHERE outage = 'yes'</query>
-      <menu>false</menu>
+    <cell id="2">
+      <rank>2</rank>
+      <dashlets>
+        <dashlet id="3" xsi:type="DashletObjectList">
+          <rank>0</rank>
+          <title>UI-ChangeManagementOverview-ChangeWithOutage</title>
+          <query>SELECT Change WHERE outage = 'yes'</query>
+          <menu>false</menu>
+        </dashlet>
+      </dashlets>
     </cell>
   </cells>
 </dashboard>

+ 91 - 64
datamodels/1.x/itop-config-mgmt-1.0.0/cis_menu.xml

@@ -3,72 +3,99 @@
   <layout>DashboardLayoutOneCol</layout>
   <title></title>
   <cells>
-    <cell>
-      <dashlet id="1" xsi:type="DashletHeaderDynamic">
-        <title>Menu_ConfigManagement_Devices</title>
-        <icon>itop-config-mgmt-1.0.0/images/server.png</icon>
-        <subtitle>Menu_ConfigManagement_AllDevices</subtitle>
-        <query>SELECT FunctionalCI</query>
-        <group_by>status</group_by>
-        <values>implementation,production,obsolete</values>
-      </dashlet>
-      <dashlet id="2" xsi:type="DashletBadge">
-        <class>Server</class>
-      </dashlet>
-      <dashlet id="3" xsi:type="DashletBadge">
-        <class>NetworkDevice</class>
-      </dashlet>
-      <dashlet id="5" xsi:type="DashletBadge">
-        <class>PC</class>
-      </dashlet>
-      <dashlet id="6" xsi:type="DashletBadge">
-        <class>MobilePhone</class>
-      </dashlet>
-      <dashlet id="7" xsi:type="DashletBadge">
-        <class>Printer</class>
-      </dashlet>
+    <cell id="0">
+      <rank>0</rank>
+      <dashlets>
+        <dashlet id="1" xsi:type="DashletHeaderDynamic">
+          <rank>0</rank>
+          <title>Menu_ConfigManagement_Devices</title>
+          <icon>itop-config-mgmt-1.0.0/images/server.png</icon>
+          <subtitle>Menu_ConfigManagement_AllDevices</subtitle>
+          <query>SELECT FunctionalCI</query>
+          <group_by>status</group_by>
+          <values>implementation,production,obsolete</values>
+        </dashlet>
+        <dashlet id="2" xsi:type="DashletBadge">
+          <rank>1</rank>
+          <class>Server</class>
+        </dashlet>
+        <dashlet id="3" xsi:type="DashletBadge">
+          <rank>2</rank>
+          <class>NetworkDevice</class>
+        </dashlet>
+        <dashlet id="5" xsi:type="DashletBadge">
+          <rank>3</rank>
+          <class>PC</class>
+        </dashlet>
+        <dashlet id="6" xsi:type="DashletBadge">
+          <rank>4</rank>
+          <class>MobilePhone</class>
+        </dashlet>
+        <dashlet id="7" xsi:type="DashletBadge">
+          <rank>5</rank>
+          <class>Printer</class>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="8" xsi:type="DashletHeaderStatic">
-        <title>Menu:ConfigManagement:SWAndApps</title>
-        <icon>itop-config-mgmt-1.0.0/images/application.png</icon>
-      </dashlet>
-      <dashlet id="9" xsi:type="DashletBadge">
-        <class>ApplicationInstance</class>
-      </dashlet>
-      <dashlet id="10" xsi:type="DashletBadge">
-        <class>DBServerInstance</class>
-      </dashlet>
-      <dashlet id="11" xsi:type="DashletBadge">
-        <class>DatabaseInstance</class>
-      </dashlet>
-      <dashlet id="12" xsi:type="DashletBadge">
-        <class>Patch</class>
-      </dashlet>
-      <dashlet id="13" xsi:type="DashletBadge">
-        <class>Licence</class>
-      </dashlet>
+    <cell id="1">
+      <rank>1</rank>
+      <dashlets>
+        <dashlet id="8" xsi:type="DashletHeaderStatic">
+          <rank>0</rank>
+          <title>Menu:ConfigManagement:SWAndApps</title>
+          <icon>itop-config-mgmt-1.0.0/images/application.png</icon>
+        </dashlet>
+        <dashlet id="9" xsi:type="DashletBadge">
+          <rank>1</rank>
+          <class>ApplicationInstance</class>
+        </dashlet>
+        <dashlet id="10" xsi:type="DashletBadge">
+          <rank>2</rank>
+          <class>DBServerInstance</class>
+        </dashlet>
+        <dashlet id="11" xsi:type="DashletBadge">
+          <rank>3</rank>
+          <class>DatabaseInstance</class>
+        </dashlet>
+        <dashlet id="12" xsi:type="DashletBadge">
+          <rank>4</rank>
+          <class>Patch</class>
+        </dashlet>
+        <dashlet id="13" xsi:type="DashletBadge">
+          <rank>5</rank>
+          <class>Licence</class>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="14" xsi:type="DashletHeaderStatic">
-        <title>Menu:ConfigManagement:Misc</title>
-        <icon>itop-config-mgmt-1.0.0/images/subnet.png</icon>
-      </dashlet>
-      <dashlet id="15" xsi:type="DashletBadge">
-        <class>NetworkInterface</class>
-      </dashlet>
-      <dashlet id="16" xsi:type="DashletBadge">
-        <class>Subnet</class>
-      </dashlet>
-      <dashlet id="17" xsi:type="DashletBadge">
-        <class>BusinessProcess</class>
-      </dashlet>
-      <dashlet id="18" xsi:type="DashletBadge">
-        <class>ApplicationSolution</class>
-      </dashlet>
-      <dashlet id="19" xsi:type="DashletBadge">
-        <class>Group</class>
-      </dashlet>
+    <cell id="2">
+      <rank>2</rank>
+      <dashlets>
+        <dashlet id="14" xsi:type="DashletHeaderStatic">
+          <rank>0</rank>
+          <title>Menu:ConfigManagement:Misc</title>
+          <icon>itop-config-mgmt-1.0.0/images/subnet.png</icon>
+        </dashlet>
+        <dashlet id="15" xsi:type="DashletBadge">
+          <rank>1</rank>
+          <class>NetworkInterface</class>
+        </dashlet>
+        <dashlet id="16" xsi:type="DashletBadge">
+          <rank>2</rank>
+          <class>Subnet</class>
+        </dashlet>
+        <dashlet id="17" xsi:type="DashletBadge">
+          <rank>3</rank>
+          <class>BusinessProcess</class>
+        </dashlet>
+        <dashlet id="18" xsi:type="DashletBadge">
+          <rank>4</rank>
+          <class>ApplicationSolution</class>
+        </dashlet>
+        <dashlet id="19" xsi:type="DashletBadge">
+          <rank>5</rank>
+          <class>Group</class>
+        </dashlet>
+      </dashlets>
     </cell>
   </cells>
 </dashboard>

+ 40 - 28
datamodels/1.x/itop-config-mgmt-1.0.0/config-dashboard.xml

@@ -1,31 +1,43 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <dashboard xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-<title>UI:ConfigMgmtMenuOverview:Title</title>
-<layout>DashboardLayoutTwoCols</layout>
-<cells>
- <cell>
-  <dashlet id="1" xsi:type="DashletGroupByPie">
-   <title>UI-ConfigMgmtMenuOverview-FunctionalCIbyStatus</title>
-   <query>SELECT FunctionalCI</query>
-   <group_by>status</group_by>
-   <style>pie</style>
-  </dashlet>
- </cell>
- <cell>
-  <dashlet id="2" xsi:type="DashletGroupByBars">
-   <title>UI-ConfigMgmtMenuOverview-FunctionalCIByType</title>
-   <query>SELECT FunctionalCI</query>
-   <group_by>finalclass</group_by>
-   <style>bars</style>
-  </dashlet>
- </cell>
- <cell>
-  <dashlet id="3" xsi:type="DashletGroupByTable">
-   <title>UI-ConfigMgmtMenuOverview-FunctionalCIByType</title>
-   <query>SELECT FunctionalCI</query>
-   <group_by>finalclass</group_by>
-   <style>table</style>
-  </dashlet>
- </cell>
-</cells>
+  <title>UI:ConfigMgmtMenuOverview:Title</title>
+  <layout>DashboardLayoutTwoCols</layout>
+  <cells>
+    <cell id="0">
+      <rank>0</rank>
+      <dashlets>
+        <dashlet id="1" xsi:type="DashletGroupByPie">
+          <rank>0</rank>
+          <title>UI-ConfigMgmtMenuOverview-FunctionalCIbyStatus</title>
+          <query>SELECT FunctionalCI</query>
+          <group_by>status</group_by>
+          <style>pie</style>
+        </dashlet>
+      </dashlets>
+    </cell>
+    <cell id="0">
+      <rank>0</rank>
+      <dashlets>
+        <dashlet id="2" xsi:type="DashletGroupByBars">
+          <rank>0</rank>
+          <title>UI-ConfigMgmtMenuOverview-FunctionalCIByType</title>
+          <query>SELECT FunctionalCI</query>
+          <group_by>finalclass</group_by>
+          <style>bars</style>
+        </dashlet>
+      </dashlets>
+    </cell>
+    <cell id="0">
+      <rank>0</rank>
+      <dashlets>
+        <dashlet id="3" xsi:type="DashletGroupByTable">
+          <rank>0</rank>
+          <title>UI-ConfigMgmtMenuOverview-FunctionalCIByType</title>
+          <query>SELECT FunctionalCI</query>
+          <group_by>finalclass</group_by>
+          <style>table</style>
+        </dashlet>
+      </dashlets>
+    </cell>
+  </cells>
 </dashboard>

+ 30 - 20
datamodels/1.x/itop-config-mgmt-1.0.0/contacts_menu.xml

@@ -4,28 +4,38 @@
   <title></title>
   <cells>
     <cell>
-      <dashlet id="1" xsi:type="DashletHeaderDynamic">
-        <title>UI:ContactsMenu</title>
-        <icon>itop-config-mgmt-1.0.0/images/team.png</icon>
-        <subtitle>Menu:ConfigManagement:AllContacts</subtitle>
-        <query>SELECT Contact</query>
-        <group_by>status</group_by>
-        <values>active,inactive</values>
-      </dashlet>
-      <dashlet id="2" xsi:type="DashletBadge">
-        <class>Team</class>
-      </dashlet>
-      <dashlet id="3" xsi:type="DashletBadge">
-        <class>Person</class>
-      </dashlet>
+      <rank>0</rank>
+      <dashlets>
+        <dashlet id="1" xsi:type="DashletHeaderDynamic">
+          <rank>0</rank>
+          <title>UI:ContactsMenu</title>
+          <icon>itop-config-mgmt-1.0.0/images/team.png</icon>
+          <subtitle>Menu:ConfigManagement:AllContacts</subtitle>
+          <query>SELECT Contact</query>
+          <group_by>status</group_by>
+          <values>active,inactive</values>
+        </dashlet>
+        <dashlet id="2" xsi:type="DashletBadge">
+          <rank>1</rank>
+          <class>Team</class>
+        </dashlet>
+        <dashlet id="3" xsi:type="DashletBadge">
+          <rank>2</rank>
+          <class>Person</class>
+        </dashlet>
+      </dashlets>
     </cell>
     <cell>
-      <dashlet id="4" xsi:type="DashletGroupByPie">
-        <title>UI-ContactsMenu-ContactsByLocation</title>
-        <query>SELECT Contact</query>
-        <group_by>location_id</group_by>
-        <style>pie</style>
-      </dashlet>
+      <rank>1</rank>
+      <dashlets>
+        <dashlet id="4" xsi:type="DashletGroupByPie">
+          <rank>0</rank>
+          <title>UI-ContactsMenu-ContactsByLocation</title>
+          <query>SELECT Contact</query>
+          <group_by>location_id</group_by>
+          <style>pie</style>
+        </dashlet>
+      </dashlets>
     </cell>
   </cells>
 </dashboard>

+ 38 - 26
datamodels/1.x/itop-incident-mgmt-1.0.0/incident-dashboard.xml

@@ -1,29 +1,41 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <dashboard xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-<title>UI:IncidentMgmtMenuOverview:Title</title>
-<layout>DashboardLayoutTwoCols</layout>
-<cells>
- <cell>
-  <dashlet id="1" xsi:type="DashletGroupByBars">
-   <title>UI-IncidentManagementOverview-IncidentByService</title>
-   <query>SELECT Incident</query>
-   <group_by>service_id</group_by>
-   <style>bars</style>
-  </dashlet>
- </cell>
- <cell>
-  <dashlet id="2" xsi:type="DashletGroupByPie">
-   <title>UI-IncidentManagementOverview-IncidentByPriority</title>
-   <query>SELECT Incident</query>
-   <group_by>priority</group_by>
-   <style>pie</style>
-  </dashlet>
- </cell>
- <cell>
-  <dashlet id="3" xsi:type="DashletObjectList">
-   <title>UI-IncidentManagementOverview-IncidentUnassigned</title>
-   <query>SELECT Incident WHERE status IN ("new", "escalated_tto")</query>
-  </dashlet>
- </cell>
-</cells>
+  <title>UI:IncidentMgmtMenuOverview:Title</title>
+  <layout>DashboardLayoutTwoCols</layout>
+  <cells>
+    <cell>
+      <rank>0</rank>
+      <dashlets>
+        <dashlet id="1" xsi:type="DashletGroupByBars">
+          <rank>0</rank>
+          <title>UI-IncidentManagementOverview-IncidentByService</title>
+          <query>SELECT Incident</query>
+          <group_by>service_id</group_by>
+          <style>bars</style>
+        </dashlet>
+      </dashlets>
+    </cell>
+    <cell>
+      <rank>1</rank>
+      <dashlets>
+        <dashlet id="2" xsi:type="DashletGroupByPie">
+          <rank>0</rank>
+          <title>UI-IncidentManagementOverview-IncidentByPriority</title>
+          <query>SELECT Incident</query>
+          <group_by>priority</group_by>
+          <style>pie</style>
+        </dashlet>
+      </dashlets>
+    </cell>
+    <cell>
+      <rank>2</rank>
+      <dashlets>
+        <dashlet id="3" xsi:type="DashletObjectList">
+          <rank>0</rank>
+          <title>UI-IncidentManagementOverview-IncidentUnassigned</title>
+          <query>SELECT Incident WHERE status IN ("new", "escalated_tto")</query>
+        </dashlet>
+      </dashlets>
+    </cell>
+  </cells>
 </dashboard>

+ 32 - 19
datamodels/1.x/itop-problem-mgmt-1.0.0/overview.xml

@@ -3,27 +3,40 @@
   <layout>DashboardLayoutTwoCols</layout>
   <title></title>
   <cells>
-    <cell>
-      <dashlet id="1" xsi:type="DashletGroupByBars">
-        <title>UI-ProblemManagementOverview-ProblemByService</title>
-        <query>SELECT Problem</query>
-        <group_by>service_id</group_by>
-        <style>bars</style>
-      </dashlet>
+    <cell id="0">
+      <rank>0</rank>
+      <dashlets>
+        <dashlet id="1" xsi:type="DashletGroupByBars">
+          <rank>0</rank>
+          <title>UI-ProblemManagementOverview-ProblemByService</title>
+          <query>SELECT Problem</query>
+          <group_by>service_id</group_by>
+          <style>bars</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="2" xsi:type="DashletGroupByPie">
-        <title>UI-ProblemManagementOverview-ProblemByPriority</title>
-        <query>SELECT Problem</query>
-        <group_by>priority</group_by>
-        <style>pie</style>
-      </dashlet>
+    <cell id="1">
+      <rank>1</rank>
+      <dashlets>
+        <dashlet id="2" xsi:type="DashletGroupByPie">
+          <rank>0</rank>
+          <title>UI-ProblemManagementOverview-ProblemByPriority</title>
+          <query>SELECT Problem</query>
+          <group_by>priority</group_by>
+          <style>pie</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="3" xsi:type="DashletObjectList"/>
-      <title>UI-ProblemManagementOverview-ProblemUnassigned</title>
-      <query>SELECT Problem WHERE status IN ("new")</query>
-      <menu>true</menu>
+    <cell id="2">
+      <rank>2</rank>
+      <dashlets>
+        <dashlet id="3" xsi:type="DashletObjectList">
+          <rank>0</rank>
+          <title>UI-ProblemManagementOverview-ProblemUnassigned</title>
+          <query>SELECT Problem WHERE status IN ("new")</query>
+          <menu>true</menu>
+        </dashlet>
+      </dashlets>
     </cell>
   </cells>
 </dashboard>

+ 38 - 26
datamodels/1.x/itop-request-mgmt-1.0.0/request-dashboard.xml

@@ -1,29 +1,41 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <dashboard xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-<title>UI:RequestMgmtMenuOverview:Title</title>
-<layout>DashboardLayoutTwoCols</layout>
-<cells>
- <cell>
-  <dashlet id="1" xsi:type="DashletGroupByBars">
-   <title>UI-RequestManagementOverview-RequestByService</title>
-   <query>SELECT UserRequest</query>
-   <group_by>service_id</group_by>
-   <style>bars</style>
-  </dashlet>
- </cell>
- <cell>
-  <dashlet id="2" xsi:type="DashletGroupByPie">
-   <title>UI-RequestManagementOverview-RequestByPriority</title>
-   <query>SELECT UserRequest</query>
-   <group_by>priority</group_by>
-   <style>pie</style>
-  </dashlet>
- </cell>
- <cell>
-  <dashlet id="3" xsi:type="DashletObjectList">
-   <title>UI-RequestManagementOverview-RequestUnassigned</title>
-   <query>SELECT UserRequest WHERE status IN ("new", "escalated_tto")</query>
-  </dashlet>
- </cell>
-</cells>
+  <title>UI:RequestMgmtMenuOverview:Title</title>
+  <layout>DashboardLayoutTwoCols</layout>
+  <cells>
+    <cell id="0">
+      <rank>0</rank>
+      <dashlets>
+        <dashlet id="1" xsi:type="DashletGroupByBars">
+          <rank>0</rank>
+          <title>UI-RequestManagementOverview-RequestByService</title>
+          <query>SELECT UserRequest</query>
+          <group_by>service_id</group_by>
+          <style>bars</style>
+        </dashlet>
+      </dashlets>
+    </cell>
+    <cell id="1">
+      <rank>1</rank>
+      <dashlets>
+        <dashlet id="2" xsi:type="DashletGroupByPie">
+          <rank>0</rank>
+          <title>UI-RequestManagementOverview-RequestByPriority</title>
+          <query>SELECT UserRequest</query>
+          <group_by>priority</group_by>
+          <style>pie</style>
+        </dashlet>
+      </dashlets>
+    </cell>
+    <cell id="2">
+      <rank>2</rank>
+      <dashlets>
+        <dashlet id="3" xsi:type="DashletObjectList">
+          <rank>0</rank>
+          <title>UI-RequestManagementOverview-RequestUnassigned</title>
+          <query>SELECT UserRequest WHERE status IN ("new", "escalated_tto")</query>
+        </dashlet>
+      </dashlets>
+    </cell>
+  </cells>
 </dashboard>

+ 72 - 52
datamodels/1.x/itop-welcome-itil/welcome_menu.xml

@@ -4,62 +4,82 @@
   <title></title>
   <cells>
     <cell>
-      <dashlet id="1" xsi:type="DashletHeaderDynamic">
-        <title>UI:ConfigurationManagementMenu</title>
-        <icon>itop-config-mgmt-1.0.0/images/database.png</icon>
-        <subtitle>UI:WelcomeMenu:AllConfigItems</subtitle>
-        <query>SELECT FunctionalCI</query>
-        <group_by>status</group_by>
-        <values>implementation,production,obsolete</values>
-      </dashlet>
-      <dashlet id="2" xsi:type="DashletBadge">
-        <class>BusinessProcess</class>
-      </dashlet>
-      <dashlet id="3" xsi:type="DashletBadge">
-        <class>Contact</class>
-      </dashlet>
-      <dashlet id="4" xsi:type="DashletBadge">
-        <class>Location</class>
-      </dashlet>
-      <dashlet id="5" xsi:type="DashletBadge">
-        <class>Server</class>
-      </dashlet>
-      <dashlet id="6" xsi:type="DashletBadge">
-        <class>DatabaseInstance</class>
-      </dashlet>
-      <dashlet id="7" xsi:type="DashletBadge">
-        <class>NetworkDevice</class>
-      </dashlet>
+      <rank>0</rank>
+      <dashlets>
+        <dashlet id="1" xsi:type="DashletHeaderDynamic">
+          <rank>0</rank>
+          <title>UI:ConfigurationManagementMenu</title>
+          <icon>itop-config-mgmt-1.0.0/images/database.png</icon>
+          <subtitle>UI:WelcomeMenu:AllConfigItems</subtitle>
+          <query>SELECT FunctionalCI</query>
+          <group_by>status</group_by>
+          <values>implementation,production,obsolete</values>
+        </dashlet>
+        <dashlet id="2" xsi:type="DashletBadge">
+          <rank>1</rank>
+          <class>BusinessProcess</class>
+        </dashlet>
+        <dashlet id="3" xsi:type="DashletBadge">
+          <rank>2</rank>
+          <class>Contact</class>
+        </dashlet>
+        <dashlet id="4" xsi:type="DashletBadge">
+          <rank>3</rank>
+          <class>Location</class>
+        </dashlet>
+        <dashlet id="5" xsi:type="DashletBadge">
+          <rank>4</rank>
+          <class>Server</class>
+        </dashlet>
+        <dashlet id="6" xsi:type="DashletBadge">
+          <rank>5</rank>
+          <class>DatabaseInstance</class>
+        </dashlet>
+        <dashlet id="7" xsi:type="DashletBadge">
+          <rank>6</rank>
+          <class>NetworkDevice</class>
+        </dashlet>
+      </dashlets>
     </cell>
     <cell>
-      <dashlet id="8" xsi:type="DashletHeaderDynamic">
-        <title>Menu:RequestManagement</title>
-        <icon>itop-request-mgmt-1.0.0/images/user-request-deadline.png</icon>
-        <subtitle>UI:WelcomeMenu:AllOpenRequests</subtitle>
-        <query>SELECT UserRequest WHERE status != "closed"</query>
-        <group_by>status</group_by>
-        <values>new,assigned,escalated_tto,escalated_ttr,resolved</values>
-      </dashlet>
-      <dashlet id="9" xsi:type="DashletObjectList">
-        <title>UI:WelcomeMenu:MyCalls</title>
-        <query>SELECT UserRequest AS i WHERE i.caller_id = :current_contact_id AND status NOT IN ("closed", "resolved")</query>
-        <menu>true</menu>
-      </dashlet>
+      <rank>0</rank>
+      <dashlets>
+        <dashlet id="8" xsi:type="DashletHeaderDynamic">
+          <rank>0</rank>
+          <title>Menu:RequestManagement</title>
+          <icon>itop-request-mgmt-1.0.0/images/user-request-deadline.png</icon>
+          <subtitle>UI:WelcomeMenu:AllOpenRequests</subtitle>
+          <query>SELECT UserRequest WHERE status != "closed"</query>
+          <group_by>status</group_by>
+          <values>new,assigned,escalated_tto,escalated_ttr,resolved</values>
+        </dashlet>
+        <dashlet id="9" xsi:type="DashletObjectList">
+          <rank>1</rank>
+          <title>UI:WelcomeMenu:MyCalls</title>
+          <query>SELECT UserRequest AS i WHERE i.caller_id = :current_contact_id AND status NOT IN ("closed", "resolved")</query>
+          <menu>true</menu>
+        </dashlet>
+      </dashlets>
     </cell>
     <cell>
-      <dashlet id="10" xsi:type="DashletHeaderDynamic">
-        <title>Menu:IncidentManagement</title>
-        <icon>itop-incident-mgmt-1.0.0/images/incident-escalated.png</icon>
-        <subtitle>UI:WelcomeMenu:OpenIncidents</subtitle>
-        <query>SELECT Incident WHERE status != "closed"</query>
-        <group_by>status</group_by>
-        <values>new,assigned,escalated_tto,escalated_ttr,resolved</values>
-      </dashlet>
-      <dashlet id="11" xsi:type="DashletObjectList">
-        <title>UI:WelcomeMenu:MyIncidents</title>
-        <query>SELECT Incident AS i WHERE i.agent_id = :current_contact_id AND status NOT IN ("closed", "resolved")</query>
-        <menu>true</menu>
-      </dashlet>
+      <rank>0</rank>
+      <dashlets>
+        <dashlet id="10" xsi:type="DashletHeaderDynamic">
+          <rank>0</rank>
+          <title>Menu:IncidentManagement</title>
+          <icon>itop-incident-mgmt-1.0.0/images/incident-escalated.png</icon>
+          <subtitle>UI:WelcomeMenu:OpenIncidents</subtitle>
+          <query>SELECT Incident WHERE status != "closed"</query>
+          <group_by>status</group_by>
+          <values>new,assigned,escalated_tto,escalated_ttr,resolved</values>
+        </dashlet>
+        <dashlet id="11" xsi:type="DashletObjectList">
+          <rank>1</rank>
+          <title>UI:WelcomeMenu:MyIncidents</title>
+          <query>SELECT Incident AS i WHERE i.agent_id = :current_contact_id AND status NOT IN ("closed", "resolved")</query>
+          <menu>true</menu>
+        </dashlet>
+      </dashlets>
     </cell>
   </cells>
 </dashboard>

+ 46 - 29
datamodels/2.x/itop-change-mgmt/overview.xml

@@ -3,37 +3,54 @@
   <layout>DashboardLayoutTwoCols</layout>
   <title>UI:ChangeMgmtMenuOverview:Title</title>
   <cells>
-    <cell>
-      <dashlet id="1" xsi:type="DashletGroupByTable">
-        <title>UI-ChangeManagementOverview-ChangeByCategory-last-7-days</title>
-        <query>SELECT Change WHERE start_date &gt; DATE_SUB(NOW(), INTERVAL 7 DAY)</query>
-        <group_by>category</group_by>
-        <style>table</style>
-      </dashlet>
+    <cell id="0">
+      <rank>0</rank>
+      <dashlets>
+        <dashlet id="1" xsi:type="DashletGroupByTable">
+          <rank>0</rank>
+          <title>UI-ChangeManagementOverview-ChangeByCategory-last-7-days</title>
+          <query>SELECT Change WHERE start_date &gt; DATE_SUB(NOW(), INTERVAL 7 DAY)</query>
+          <group_by>category</group_by>
+          <style>table</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="2" xsi:type="DashletGroupByBars">
-        <title>UI-ChangeManagementOverview-Last-7-days</title>
-        <query>SELECT Change WHERE start_date &gt; DATE_SUB(NOW(), INTERVAL 7 DAY)</query>
-        <group_by>start_date:day_of_month</group_by>
-        <style>bars</style>
-      </dashlet>
+    <cell id="1">
+      <rank>1</rank>
+      <dashlets>
+        <dashlet id="2" xsi:type="DashletGroupByBars">
+          <rank>0</rank>
+          <title>UI-ChangeManagementOverview-Last-7-days</title>
+          <query>SELECT Change WHERE start_date &gt; DATE_SUB(NOW(), INTERVAL 7 DAY)</query>
+          <group_by>start_date:day_of_month</group_by>
+          <style>bars</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="3" xsi:type="DashletGroupByTable">
-        <title>UI-ChangeManagementOverview-ChangeByDomain-last-7-days</title>
-        <query>SELECT Change WHERE start_date &gt; DATE_SUB(NOW(), INTERVAL 7 DAY)</query>
-        <group_by>finalclass</group_by>
-        <style>table</style>
-      </dashlet>
+    <cell id="2">
+      <rank>2</rank>
+      <dashlets>
+        <dashlet id="3" xsi:type="DashletGroupByTable">
+          <rank>0</rank>
+          <title>UI-ChangeManagementOverview-ChangeByDomain-last-7-days</title>
+          <query>SELECT Change WHERE start_date &gt; DATE_SUB(NOW(), INTERVAL 7 DAY)</query>
+          <group_by>finalclass</group_by>
+          <style>table</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="4" xsi:type="DashletGroupByTable">
-        <title>UI-ChangeManagementOverview-ChangeByStatus-last-7-days</title>
-        <query>SELECT Change WHERE start_date &gt; DATE_SUB(NOW(), INTERVAL 7 DAY)</query>
-        <group_by>status</group_by>
-        <style>table</style>
-      </dashlet>
+    <cell id="3">
+      <rank>3</rank>
+      <dashlets>
+        <dashlet id="4" xsi:type="DashletGroupByTable">
+          <rank>0</rank>
+          <title>UI-ChangeManagementOverview-ChangeByStatus-last-7-days</title>
+          <query>SELECT Change WHERE start_date &gt; DATE_SUB(NOW(),
+            INTERVAL 7 DAY)</query>
+          <group_by>status</group_by>
+          <style>table</style>
+        </dashlet>
+      </dashlets>
     </cell>
   </cells>
-</dashboard>
+</dashboard>

+ 183 - 129
datamodels/2.x/itop-config-mgmt/cis_menu.xml

@@ -3,138 +3,192 @@
   <layout>DashboardLayoutOneCol</layout>
   <title></title>
   <cells>
-    <cell>
-      <dashlet id="1" xsi:type="DashletHeaderStatic">
-        <title>Menu:ConfigManagement:AllDevices</title>
-        <icon>itop-config-mgmt/images/server.png</icon>
-        <subtitle>Menu_ConfigManagement_AllDevices</subtitle>
-      </dashlet>
-      <dashlet id="2" xsi:type="DashletBadge">
-        <class>Rack</class>
-      </dashlet>
-      <dashlet id="3" xsi:type="DashletBadge">
-        <class>Enclosure</class>
-      </dashlet>
-      <dashlet id="4" xsi:type="DashletBadge">
-        <class>Server</class>
-      </dashlet>
-      <dashlet id="5" xsi:type="DashletBadge">
-        <class>NetworkDevice</class>
-      </dashlet>
-      <dashlet id="6" xsi:type="DashletBadge">
-        <class>StorageSystem</class>
-      </dashlet>
-      <dashlet id="7" xsi:type="DashletBadge">
-        <class>SANSwitch</class>
-      </dashlet>
-      <dashlet id="8" xsi:type="DashletBadge">
-        <class>NAS</class>
-      </dashlet>
-      <dashlet id="9" xsi:type="DashletBadge">
-        <class>TapeLibrary</class>
-      </dashlet>
-      <dashlet id="10" xsi:type="DashletBadge">
-        <class>ElectricalConnection</class>
-      </dashlet>
+    <cell id="0">
+      <rank>0</rank>
+      <dashlets>
+        <dashlet id="1" xsi:type="DashletHeaderStatic">
+          <rank>0</rank>
+          <title>Menu:ConfigManagement:AllDevices</title>
+          <icon>itop-config-mgmt/images/server.png</icon>
+          <subtitle>Menu_ConfigManagement_AllDevices</subtitle>
+        </dashlet>
+        <dashlet id="2" xsi:type="DashletBadge">
+          <rank>1</rank>
+          <class>Rack</class>
+        </dashlet>
+        <dashlet id="3" xsi:type="DashletBadge">
+          <rank>2</rank>
+          <class>Enclosure</class>
+        </dashlet>
+        <dashlet id="4" xsi:type="DashletBadge">
+          <rank>3</rank>
+          <class>Server</class>
+        </dashlet>
+        <dashlet id="5" xsi:type="DashletBadge">
+          <rank>4</rank>
+          <class>NetworkDevice</class>
+        </dashlet>
+        <dashlet id="6" xsi:type="DashletBadge">
+          <rank>5</rank>
+          <class>StorageSystem</class>
+        </dashlet>
+        <dashlet id="7" xsi:type="DashletBadge">
+          <rank>6</rank>
+          <class>SANSwitch</class>
+        </dashlet>
+        <dashlet id="8" xsi:type="DashletBadge">
+          <rank>7</rank>
+          <class>NAS</class>
+        </dashlet>
+        <dashlet id="9" xsi:type="DashletBadge">
+          <rank>8</rank>
+          <class>TapeLibrary</class>
+        </dashlet>
+        <dashlet id="10" xsi:type="DashletBadge">
+          <rank>9</rank>
+          <class>ElectricalConnection</class>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="11" xsi:type="DashletHeaderStatic">
-        <title>Menu:ConfigManagement:virtualization</title>
-        <icon>itop-config-mgmt/images/application.png</icon>
-      </dashlet>
-      <dashlet id="12" xsi:type="DashletBadge">
-        <class>Farm</class>
-      </dashlet>
-      <dashlet id="13" xsi:type="DashletBadge">
-        <class>Hypervisor</class>
-      </dashlet>
-      <dashlet id="14" xsi:type="DashletBadge">
-        <class>VirtualMachine</class>
-      </dashlet>
+    <cell id="1">
+      <rank>1</rank>
+      <dashlets>
+        <dashlet id="11" xsi:type="DashletHeaderStatic">
+          <rank>0</rank>
+          <title>Menu:ConfigManagement:virtualization</title>
+          <icon>itop-config-mgmt/images/application.png</icon>
+        </dashlet>
+        <dashlet id="12" xsi:type="DashletBadge">
+          <rank>1</rank>
+          <class>Farm</class>
+        </dashlet>
+        <dashlet id="13" xsi:type="DashletBadge">
+          <rank>2</rank>
+          <class>Hypervisor</class>
+        </dashlet>
+        <dashlet id="14" xsi:type="DashletBadge">
+          <rank>3</rank>
+          <class>VirtualMachine</class>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="15" xsi:type="DashletHeaderStatic">
-        <title>Menu:ConfigManagement:EndUsers</title>
-        <icon>itop-config-mgmt/images/team.png</icon>
-      </dashlet>
-      <dashlet id="16" xsi:type="DashletBadge">
-        <class>PC</class>
-      </dashlet>
-      <dashlet id="17" xsi:type="DashletBadge">
-        <class>Phone</class>
-      </dashlet>
-      <dashlet id="18" xsi:type="DashletBadge">
-        <class>IpPhone</class>
-      </dashlet>
-      <dashlet id="19" xsi:type="DashletBadge">
-        <class>MobilePhone</class>
-      </dashlet>
-      <dashlet id="20" xsi:type="DashletBadge">
-        <class>Tablet</class>
-      </dashlet>
-      <dashlet id="21" xsi:type="DashletBadge">
-        <class>Printer</class>
-      </dashlet>
-      <dashlet id="22" xsi:type="DashletBadge">
-        <class>Peripheral</class>
-      </dashlet>
+    <cell id="2">
+      <rank>2</rank>
+      <dashlets>
+        <dashlet id="15" xsi:type="DashletHeaderStatic">
+          <rank>0</rank>
+          <title>Menu:ConfigManagement:EndUsers</title>
+          <icon>itop-config-mgmt/images/team.png</icon>
+        </dashlet>
+        <dashlet id="16" xsi:type="DashletBadge">
+          <rank>1</rank>
+          <class>PC</class>
+        </dashlet>
+        <dashlet id="17" xsi:type="DashletBadge">
+          <rank>2</rank>
+          <class>Phone</class>
+        </dashlet>
+        <dashlet id="18" xsi:type="DashletBadge">
+          <rank>3</rank>
+          <class>IpPhone</class>
+        </dashlet>
+        <dashlet id="19" xsi:type="DashletBadge">
+          <rank>4</rank>
+          <class>MobilePhone</class>
+        </dashlet>
+        <dashlet id="20" xsi:type="DashletBadge">
+          <rank>5</rank>
+          <class>Tablet</class>
+        </dashlet>
+        <dashlet id="21" xsi:type="DashletBadge">
+          <rank>6</rank>
+          <class>Printer</class>
+        </dashlet>
+        <dashlet id="22" xsi:type="DashletBadge">
+          <rank>7</rank>
+          <class>Peripheral</class>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="23" xsi:type="DashletHeaderStatic">
-        <title>Menu:ConfigManagement:SWAndApps</title>
-        <icon>itop-config-mgmt/images/application.png</icon>
-      </dashlet>
-      <dashlet id="24" xsi:type="DashletBadge">
-        <class>Middleware</class>
-      </dashlet>
-      <dashlet id="25" xsi:type="DashletBadge">
-        <class>DBserver</class>
-      </dashlet>
-      <dashlet id="26" xsi:type="DashletBadge">
-        <class>Webserver</class>
-      </dashlet>
-      <dashlet id="27" xsi:type="DashletBadge">
-        <class>OtherSoftware</class>
-      </dashlet>
-      <dashlet id="29" xsi:type="DashletBadge">
-        <class>MiddlewareInstance</class>
-      </dashlet>
-      <dashlet id="30" xsi:type="DashletBadge">
-        <class>DatabaseSchema</class>
-      </dashlet>
-      <dashlet id="31" xsi:type="DashletBadge">
-        <class>WebApplication</class>
-      </dashlet>
-      <dashlet id="32" xsi:type="DashletBadge">
-        <class>Patch</class>
-      </dashlet>
-      <dashlet id="33" xsi:type="DashletBadge">
-        <class>Licence</class>
-      </dashlet>
+    <cell id="3">
+      <rank>3</rank>
+      <dashlets>
+        <dashlet id="23" xsi:type="DashletHeaderStatic">
+          <rank>0</rank>
+          <title>Menu:ConfigManagement:SWAndApps</title>
+          <icon>itop-config-mgmt/images/application.png</icon>
+        </dashlet>
+        <dashlet id="24" xsi:type="DashletBadge">
+          <rank>1</rank>
+          <class>Middleware</class>
+        </dashlet>
+        <dashlet id="25" xsi:type="DashletBadge">
+          <rank>2</rank>
+          <class>DBserver</class>
+        </dashlet>
+        <dashlet id="26" xsi:type="DashletBadge">
+          <rank>3</rank>
+          <class>Webserver</class>
+        </dashlet>
+        <dashlet id="27" xsi:type="DashletBadge">
+          <rank>4</rank>
+          <class>OtherSoftware</class>
+        </dashlet>
+        <dashlet id="29" xsi:type="DashletBadge">
+          <rank>5</rank>
+          <class>MiddlewareInstance</class>
+        </dashlet>
+        <dashlet id="30" xsi:type="DashletBadge">
+          <rank>6</rank>
+          <class>DatabaseSchema</class>
+        </dashlet>
+        <dashlet id="31" xsi:type="DashletBadge">
+          <rank>7</rank>
+          <class>WebApplication</class>
+        </dashlet>
+        <dashlet id="32" xsi:type="DashletBadge">
+          <rank>8</rank>
+          <class>Patch</class>
+        </dashlet>
+        <dashlet id="33" xsi:type="DashletBadge">
+          <rank>9</rank>
+          <class>Licence</class>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="34" xsi:type="DashletHeaderStatic">
-        <title>Menu:ConfigManagement:Misc</title>
-        <icon>itop-config-mgmt/images/subnet.png</icon>
-      </dashlet>
-      <dashlet id="35" xsi:type="DashletBadge">
-        <class>NetworkInterface</class>
-      </dashlet>
-      <dashlet id="36" xsi:type="DashletBadge">
-        <class>Subnet</class>
-      </dashlet>
-      <dashlet id="37" xsi:type="DashletBadge">
-        <class>LogicalVolume</class>
-      </dashlet>
-      <dashlet id="38" xsi:type="DashletBadge">
-        <class>BusinessProcess</class>
-      </dashlet>
-      <dashlet id="39" xsi:type="DashletBadge">
-        <class>ApplicationSolution</class>
-      </dashlet>
-      <dashlet id="40" xsi:type="DashletBadge">
-        <class>Group</class>
-      </dashlet>
+    <cell id="4">
+      <rank>4</rank>
+      <dashlets>
+        <dashlet id="34" xsi:type="DashletHeaderStatic">
+          <rank>0</rank>
+          <title>Menu:ConfigManagement:Misc</title>
+          <icon>itop-config-mgmt/images/subnet.png</icon>
+        </dashlet>
+        <dashlet id="35" xsi:type="DashletBadge">
+          <rank>1</rank>
+          <class>NetworkInterface</class>
+        </dashlet>
+        <dashlet id="36" xsi:type="DashletBadge">
+          <rank>2</rank>
+          <class>Subnet</class>
+        </dashlet>
+        <dashlet id="37" xsi:type="DashletBadge">
+          <rank>3</rank>
+          <class>LogicalVolume</class>
+        </dashlet>
+        <dashlet id="38" xsi:type="DashletBadge">
+          <rank>4</rank>
+          <class>BusinessProcess</class>
+        </dashlet>
+        <dashlet id="39" xsi:type="DashletBadge">
+          <rank>5</rank>
+          <class>ApplicationSolution</class>
+        </dashlet>
+        <dashlet id="40" xsi:type="DashletBadge">
+          <rank>6</rank>
+          <class>Group</class>
+        </dashlet>
+      </dashlets>
     </cell>
   </cells>
-</dashboard>
+</dashboard>

+ 21 - 15
datamodels/2.x/itop-config-mgmt/contacts_menu.xml

@@ -3,21 +3,27 @@
   <layout>DashboardLayoutOneCol</layout>
   <title></title>
   <cells>
-    <cell>
-      <dashlet id="1" xsi:type="DashletHeaderDynamic">
-        <title>Menu:Contact</title>
-        <icon>itop-config-mgmt/images/team.png</icon>
-        <subtitle>Menu:Contact:Count</subtitle>
-        <query>SELECT Contact</query>
-        <group_by>status</group_by>
-        <values>active,inactive</values>
-      </dashlet>
-      <dashlet id="2" xsi:type="DashletBadge">
-        <class>Team</class>
-      </dashlet>
-      <dashlet id="3" xsi:type="DashletBadge">
-        <class>Person</class>
-      </dashlet>
+    <cell id="0">
+      <rank>0</rank>
+      <dashlets>
+        <dashlet id="1" xsi:type="DashletHeaderDynamic">
+          <rank>1</rank>
+          <title>Menu:Contact</title>
+          <icon>itop-config-mgmt/images/team.png</icon>
+          <subtitle>Menu:Contact:Count</subtitle>
+          <query>SELECT Contact</query>
+          <group_by>status</group_by>
+          <values>active,inactive</values>
+        </dashlet>
+        <dashlet id="2" xsi:type="DashletBadge">
+          <rank>2</rank>
+          <class>Team</class>
+        </dashlet>
+        <dashlet id="3" xsi:type="DashletBadge">
+          <rank>3</rank>
+          <class>Person</class>
+        </dashlet>
+      </dashlets>
     </cell>
   </cells>
 </dashboard>

+ 62 - 39
datamodels/2.x/itop-incident-mgmt-itil/overview.xml

@@ -3,51 +3,74 @@
   <layout>DashboardLayoutTwoCols</layout>
   <title>UI:IncidentMgmtMenuOverview:Title</title>
   <cells>
-    <cell>
-      <dashlet id="1" xsi:type="DashletGroupByPie">
-        <title>UI-IncidentManagementOverview-IncidentByPriority-last-14-days</title>
-        <query>SELECT Incident WHERE DATE_SUB(NOW(), INTERVAL 14 DAY) &lt; start_date</query>
-        <group_by>priority</group_by>
-        <style>pie</style>
-      </dashlet>
+    <cell id="0">
+      <rank>0</rank>
+      <dashlets>
+        <dashlet id="1" xsi:type="DashletGroupByPie">
+          <title>UI-IncidentManagementOverview-IncidentByPriority-last-14-days</title>
+          <query>SELECT Incident WHERE DATE_SUB(NOW(), INTERVAL 14 DAY) &lt; start_date</query>
+          <group_by>priority</group_by>
+          <style>pie</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="2" xsi:type="DashletGroupByBars">
-        <title>UI-IncidentManagementOverview-Last-14-days</title>
-        <query>SELECT Incident WHERE DATE_SUB(NOW(), INTERVAL 14 DAY) &lt; start_date</query>
-        <group_by>start_date:day_of_month</group_by>
-        <style>bars</style>
-      </dashlet>
+    <cell id="1">
+      <rank>1</rank>
+      <dashlets>
+        <dashlet id="2" xsi:type="DashletGroupByBars">
+          <title>UI-IncidentManagementOverview-Last-14-days</title>
+          <query>SELECT Incident WHERE DATE_SUB(NOW(), INTERVAL 14 DAY) &lt; start_date</query>
+          <group_by>start_date:day_of_month</group_by>
+          <style>bars</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="3" xsi:type="DashletGroupByTable">
-        <title>UI-IncidentManagementOverview-OpenIncidentByStatus</title>
-        <query>SELECT Incident WHERE status NOT IN ('closed','rejected')</query>
-        <group_by>status</group_by>
-        <style>table</style>
-      </dashlet>
+    <cell id="2">
+      <rank>2</rank>
+      <dashlets>
+        <dashlet id="3" xsi:type="DashletGroupByTable">
+          <title>UI-IncidentManagementOverview-OpenIncidentByStatus</title>
+          <query>SELECT Incident WHERE status NOT IN
+            ('closed','rejected')</query>
+          <group_by>status</group_by>
+          <style>table</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="4" xsi:type="DashletGroupByTable">
-        <title>UI-IncidentManagementOverview-OpenIncidentByAgent</title>
-        <query>SELECT Incident WHERE status NOT IN ('closed','rejected')</query>
-        <group_by>agent_id</group_by>
-        <style>table</style>
-      </dashlet>
+    <cell id="3">
+      <rank>3</rank>
+      <dashlets>
+        <dashlet id="4" xsi:type="DashletGroupByTable">
+          <title>UI-IncidentManagementOverview-OpenIncidentByAgent</title>
+          <query>SELECT Incident WHERE status NOT IN
+            ('closed','rejected')</query>
+          <group_by>agent_id</group_by>
+          <style>table</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="5" xsi:type="DashletGroupByTable">
-        <title>UI-IncidentManagementOverview-OpenIncidentByCustomer</title>
-        <query>SELECT Incident WHERE status NOT IN ('closed','rejected')</query>
-        <group_by>org_id</group_by>
-        <style>table</style>
-      </dashlet>
+    <cell id="4">
+      <rank>4</rank>
+      <dashlets>
+        <dashlet id="5" xsi:type="DashletGroupByTable">
+          <title>UI-IncidentManagementOverview-OpenIncidentByCustomer</title>
+          <query>SELECT Incident WHERE status NOT IN ('closed','rejected')</query>
+          <group_by>org_id</group_by>
+          <style>table</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="0" xsi:type="DashletEmptyCell"/>
+    <cell id="5">
+      <rank>5</rank>
+      <dashlets>
+        <dashlet id="0" xsi:type="DashletEmptyCell" />
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="0" xsi:type="DashletEmptyCell"/>
+    <cell id="6">
+      <rank>6</rank>
+      <dashlets>
+        <dashlet id="0" xsi:type="DashletEmptyCell" />
+      </dashlets>
     </cell>
   </cells>
 </dashboard>

+ 32 - 20
datamodels/2.x/itop-problem-mgmt/overview.xml

@@ -3,28 +3,40 @@
   <layout>DashboardLayoutTwoCols</layout>
   <title>UI:ProblemMgmtMenuOverview:Title</title>
   <cells>
-    <cell>
-      <dashlet id="1" xsi:type="DashletGroupByBars">
-        <title>UI-ProblemManagementOverview-ProblemByService</title>
-        <query>SELECT Problem</query>
-        <group_by>service_id</group_by>
-        <style>bars</style>
-      </dashlet>
+    <cell id="0">
+      <rank>0</rank>
+      <dashlets>
+        <dashlet id="1" xsi:type="DashletGroupByBars">
+          <rank>0</rank>
+          <title>UI-ProblemManagementOverview-ProblemByService</title>
+          <query>SELECT Problem</query>
+          <group_by>service_id</group_by>
+          <style>bars</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="2" xsi:type="DashletGroupByPie">
-        <title>UI-ProblemManagementOverview-ProblemByPriority</title>
-        <query>SELECT Problem</query>
-        <group_by>priority</group_by>
-        <style>pie</style>
-      </dashlet>
+    <cell id="1">
+      <rank>1</rank>
+      <dashlets>
+        <dashlet id="2" xsi:type="DashletGroupByPie">
+          <rank>0</rank>
+          <title>UI-ProblemManagementOverview-ProblemByPriority</title>
+          <query>SELECT Problem</query>
+          <group_by>priority</group_by>
+          <style>pie</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="3" xsi:type="DashletObjectList">
-        <title>UI-ProblemManagementOverview-ProblemUnassigned</title>
-        <query>SELECT Problem WHERE status IN ("new")</query>
-        <menu>false</menu>
-      </dashlet>
+    <cell id="2">
+      <rank>2</rank>
+      <dashlets>
+        <dashlet id="3" xsi:type="DashletObjectList">
+          <rank>0</rank>
+          <title>UI-ProblemManagementOverview-ProblemUnassigned</title>
+          <query>SELECT Problem WHERE status IN ("new")</query>
+          <menu>false</menu>
+        </dashlet>
+      </dashlets>
     </cell>
   </cells>
 </dashboard>

+ 73 - 48
datamodels/2.x/itop-request-mgmt-itil/overview.xml

@@ -3,59 +3,84 @@
   <layout>DashboardLayoutTwoCols</layout>
   <title>UI:RequestMgmtMenuOverview:Title</title>
   <cells>
-    <cell>
-      <dashlet id="1" xsi:type="DashletGroupByPie">
-        <title>UI-RequestManagementOverview-RequestByType-last-14-days</title>
-        <query>SELECT UserRequest WHERE DATE_SUB(NOW(), INTERVAL 14 DAY) &lt; start_date</query>
-        <group_by>request_type</group_by>
-        <style>pie</style>
-      </dashlet>
+    <cell id="0">
+      <rank>0</rank>
+      <dashlets>
+        <dashlet id="1" xsi:type="DashletGroupByPie">
+          <rank>0</rank>
+          <title>UI-RequestManagementOverview-RequestByType-last-14-days</title>
+          <query>SELECT UserRequest WHERE DATE_SUB(NOW(), INTERVAL 14
+            DAY) &lt; start_date</query>
+          <group_by>request_type</group_by>
+          <style>pie</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="2" xsi:type="DashletGroupByBars">
-        <title>UI-RequestManagementOverview-Last-14-days</title>
-        <query>SELECT UserRequest WHERE DATE_SUB(NOW(), INTERVAL 14 DAY) &lt; start_date</query>
-        <group_by>start_date:day_of_month</group_by>
-        <style>bars</style>
-      </dashlet>
+    <cell id="1">
+      <rank>1</rank>
+      <dashlets>
+        <dashlet id="2" xsi:type="DashletGroupByBars">
+          <rank>0</rank>
+          <title>UI-RequestManagementOverview-Last-14-days</title>
+          <query>SELECT UserRequest WHERE DATE_SUB(NOW(), INTERVAL 14
+            DAY)
+            &lt; start_date</query>
+          <group_by>start_date:day_of_month</group_by>
+          <style>bars</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="3" xsi:type="DashletGroupByTable">
-        <title>UI-RequestManagementOverview-OpenRequestByStatus</title>
-        <query>SELECT UserRequest WHERE status NOT IN ('closed','rejected')</query>
-        <group_by>status</group_by>
-        <style>table</style>
-      </dashlet>
+    <cell id="2">
+      <rank>2</rank>
+      <dashlets>
+        <dashlet id="3" xsi:type="DashletGroupByTable">
+          <rank>0</rank>
+          <title>UI-RequestManagementOverview-OpenRequestByStatus</title>
+          <query>SELECT UserRequest WHERE status NOT IN
+            ('closed','rejected')</query>
+          <group_by>status</group_by>
+          <style>table</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="4" xsi:type="DashletGroupByTable">
-        <title>UI-RequestManagementOverview-OpenRequestByAgent</title>
-        <query>SELECT UserRequest WHERE status NOT IN ('closed','rejected')</query>
-        <group_by>agent_id</group_by>
-        <style>table</style>
-      </dashlet>
+    <cell id="3">
+      <rank>3</rank>
+      <dashlets>
+        <dashlet id="4" xsi:type="DashletGroupByTable">
+          <rank>0</rank>
+          <title>UI-RequestManagementOverview-OpenRequestByAgent</title>
+          <query>SELECT UserRequest WHERE status NOT IN
+            ('closed','rejected')</query>
+          <group_by>agent_id</group_by>
+          <style>table</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="5" xsi:type="DashletGroupByTable">
-        <title>UI-RequestManagementOverview-OpenRequestByType</title>
-        <query>SELECT UserRequest WHERE status NOT IN ('closed','rejected')</query>
-        <group_by>finalclass</group_by>
-        <style>table</style>
-      </dashlet>
+    <cell id="4">
+      <rank>4</rank>
+      <dashlets>
+        <dashlet id="5" xsi:type="DashletGroupByTable">
+          <rank>0</rank>
+          <title>UI-RequestManagementOverview-OpenRequestByType</title>
+          <query>SELECT UserRequest WHERE status NOT IN
+            ('closed','rejected')</query>
+          <group_by>finalclass</group_by>
+          <style>table</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="6" xsi:type="DashletGroupByTable">
-        <title>UI-RequestManagementOverview-OpenRequestByCustomer</title>
-        <query>SELECT UserRequest WHERE status NOT IN ('closed','rejected')</query>
-        <group_by>org_id</group_by>
-        <style>table</style>
-      </dashlet>
-    </cell>
-    <cell>
-      <dashlet id="0" xsi:type="DashletEmptyCell"/>
-    </cell>
-    <cell>
-      <dashlet id="0" xsi:type="DashletEmptyCell"/>
+    <cell id="5">
+      <rank>5</rank>
+      <dashlets>
+        <dashlet id="6" xsi:type="DashletGroupByTable">
+          <rank>0</rank>
+          <title>UI-RequestManagementOverview-OpenRequestByCustomer</title>
+          <query>SELECT UserRequest WHERE status NOT IN
+            ('closed','rejected')</query>
+          <group_by>org_id</group_by>
+          <style>table</style>
+        </dashlet>
+      </dashlets>
     </cell>
   </cells>
 </dashboard>

+ 66 - 48
datamodels/2.x/itop-request-mgmt/overview.xml

@@ -3,59 +3,77 @@
   <layout>DashboardLayoutTwoCols</layout>
   <title>UI:RequestMgmtMenuOverview:Title</title>
   <cells>
-    <cell>
-      <dashlet id="1" xsi:type="DashletGroupByPie">
-        <title>UI-RequestManagementOverview-RequestByType-last-14-days</title>
-        <query>SELECT UserRequest WHERE DATE_SUB(NOW(), INTERVAL 14 DAY) &lt; start_date</query>
-        <group_by>request_type</group_by>
-        <style>pie</style>
-      </dashlet>
+    <cell id="0">
+      <rank>0</rank>
+      <dashlets>
+        <dashlet id="1" xsi:type="DashletGroupByPie">
+          <rank>0</rank>
+          <title>UI-RequestManagementOverview-RequestByType-last-14-days</title>
+          <query>SELECT UserRequest WHERE DATE_SUB(NOW(), INTERVAL 14 DAY) &lt; start_date</query>
+          <group_by>request_type</group_by>
+          <style>pie</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="2" xsi:type="DashletGroupByBars">
-        <title>UI-RequestManagementOverview-Last-14-days</title>
-        <query>SELECT UserRequest WHERE DATE_SUB(NOW(), INTERVAL 14 DAY) &lt; start_date</query>
-        <group_by>start_date:day_of_month</group_by>
-        <style>bars</style>
-      </dashlet>
+    <cell id="1">
+      <rank>1</rank>
+      <dashlets>
+        <dashlet id="2" xsi:type="DashletGroupByBars">
+          <rank>0</rank>
+          <title>UI-RequestManagementOverview-Last-14-days</title>
+          <query>SELECT UserRequest WHERE DATE_SUB(NOW(), INTERVAL 14 DAY) &lt; start_date</query>
+          <group_by>start_date:day_of_month</group_by>
+          <style>bars</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="3" xsi:type="DashletGroupByTable">
-        <title>UI-RequestManagementOverview-OpenRequestByStatus</title>
-        <query>SELECT UserRequest WHERE status NOT IN ('closed','rejected')</query>
-        <group_by>status</group_by>
-        <style>table</style>
-      </dashlet>
+    <cell id="1">
+      <rank>2</rank>
+      <dashlets>
+        <dashlet id="3" xsi:type="DashletGroupByTable">
+          <rank>0</rank>
+          <title>UI-RequestManagementOverview-OpenRequestByStatus</title>
+          <query>SELECT UserRequest WHERE status NOT IN ('closed','rejected')</query>
+          <group_by>status</group_by>
+          <style>table</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="4" xsi:type="DashletGroupByTable">
-        <title>UI-RequestManagementOverview-OpenRequestByAgent</title>
-        <query>SELECT UserRequest WHERE status NOT IN ('closed','rejected')</query>
-        <group_by>agent_id</group_by>
-        <style>table</style>
-      </dashlet>
+    <cell id="2">
+      <rank>3</rank>
+      <dashlets>
+        <dashlet id="4" xsi:type="DashletGroupByTable">
+          <rank>0</rank>
+          <title>UI-RequestManagementOverview-OpenRequestByAgent</title>
+          <query>SELECT UserRequest WHERE status NOT IN ('closed','rejected')</query>
+          <group_by>agent_id</group_by>
+          <style>table</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="5" xsi:type="DashletGroupByTable">
-        <title>UI-RequestManagementOverview-OpenRequestByType</title>
-        <query>SELECT UserRequest WHERE status NOT IN ('closed','rejected')</query>
-        <group_by>finalclass</group_by>
-        <style>table</style>
-      </dashlet>
+    <cell id="3">
+      <rank>4</rank>
+      <dashlets>
+        <dashlet id="5" xsi:type="DashletGroupByTable">
+          <rank>0</rank>
+          <title>UI-RequestManagementOverview-OpenRequestByType</title>
+          <query>SELECT UserRequest WHERE status NOT IN ('closed','rejected')</query>
+          <group_by>finalclass</group_by>
+          <style>table</style>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="6" xsi:type="DashletGroupByTable">
-        <title>UI-RequestManagementOverview-OpenRequestByCustomer</title>
-        <query>SELECT UserRequest WHERE status NOT IN ('closed','rejected')</query>
-        <group_by>org_id</group_by>
-        <style>table</style>
-      </dashlet>
-    </cell>
-    <cell>
-      <dashlet id="0" xsi:type="DashletEmptyCell"/>
-    </cell>
-    <cell>
-      <dashlet id="0" xsi:type="DashletEmptyCell"/>
+    <cell id="4">
+      <rank>5</rank>
+      <dashlets>
+        <dashlet id="6" xsi:type="DashletGroupByTable">
+          <rank>0</rank>
+          <title>UI-RequestManagementOverview-OpenRequestByCustomer</title>
+          <query>SELECT UserRequest WHERE status NOT IN ('closed','rejected')</query>
+          <group_by>org_id</group_by>
+          <style>table</style>
+        </dashlet>
+      </dashlets>
     </cell>
   </cells>
 </dashboard>

+ 56 - 41
datamodels/2.x/itop-welcome-itil/welcome_menu.xml

@@ -3,48 +3,63 @@
   <layout>DashboardLayoutOneCol</layout>
   <title></title>
   <cells>
-    <cell>
-      <dashlet id="1" xsi:type="DashletHeaderStatic">
-        <title>Menu:ConfigManagementCI</title>
-        <icon>itop-welcome-itil/images/database.png</icon>
-      </dashlet>
-      <dashlet id="2" xsi:type="DashletBadge">
-        <class>BusinessProcess</class>
-      </dashlet>
-      <dashlet id="3" xsi:type="DashletBadge">
-        <class>ApplicationSolution</class>
-      </dashlet>
-      <dashlet id="4" xsi:type="DashletBadge">
-        <class>Contact</class>
-      </dashlet>
-      <dashlet id="5" xsi:type="DashletBadge">
-        <class>Location</class>
-      </dashlet>
-      <dashlet id="6" xsi:type="DashletBadge">
-        <class>Contract</class>
-      </dashlet>
-      <dashlet id="7" xsi:type="DashletBadge">
-        <class>Server</class>
-      </dashlet>
-      <dashlet id="8" xsi:type="DashletBadge">
-        <class>NetworkDevice</class>
-      </dashlet>
+    <cell id="0">
+      <rank>0</rank>
+      <dashlets>
+        <dashlet id="1" xsi:type="DashletHeaderStatic">
+          <rank>0</rank>
+          <title>Menu:ConfigManagementCI</title>
+          <icon>itop-welcome-itil/images/database.png</icon>
+        </dashlet>
+        <dashlet id="2" xsi:type="DashletBadge">
+          <rank>1</rank>
+          <class>BusinessProcess</class>
+        </dashlet>
+        <dashlet id="3" xsi:type="DashletBadge">
+          <rank>2</rank>
+          <class>ApplicationSolution</class>
+        </dashlet>
+        <dashlet id="4" xsi:type="DashletBadge">
+          <rank>3</rank>
+          <class>Contact</class>
+        </dashlet>
+        <dashlet id="5" xsi:type="DashletBadge">
+          <rank>4</rank>
+          <class>Location</class>
+        </dashlet>
+        <dashlet id="6" xsi:type="DashletBadge">
+          <rank>5</rank>
+          <class>Contract</class>
+        </dashlet>
+        <dashlet id="7" xsi:type="DashletBadge">
+          <rank>6</rank>
+          <class>Server</class>
+        </dashlet>
+        <dashlet id="8" xsi:type="DashletBadge">
+          <rank>7</rank>
+          <class>NetworkDevice</class>
+        </dashlet>
+      </dashlets>
     </cell>
-    <cell>
-      <dashlet id="8" xsi:type="DashletHeaderDynamic">
-        <title>Menu:RequestManagement</title>
-        <icon>itop-welcome-itil/images/user-request-deadline.png</icon>
-        <subtitle>Open Requests</subtitle>
-        <query>SELECT UserRequest WHERE status != "closed"</query>
-        <group_by>status</group_by>
-        <values>new,assigned,escalated_tto,escalated_ttr,resolved</values>
-      </dashlet>
-      <dashlet id="9" xsi:type="DashletObjectList">
-        <title>UI:WelcomeMenu:MyCalls</title>
-        <query>SELECT UserRequest AS i WHERE i.agent_id = :current_contact_id AND status NOT IN ("closed", "resolved")</query>
-        <menu>true</menu>
-      </dashlet>
+    <cell id="1">
+      <rank>1</rank>
+      <dashlets>
+        <dashlet id="8" xsi:type="DashletHeaderDynamic">
+          <rank>0</rank>
+          <title>Menu:RequestManagement</title>
+          <icon>itop-welcome-itil/images/user-request-deadline.png</icon>
+          <subtitle>Open Requests</subtitle>
+          <query>SELECT UserRequest WHERE status != "closed"</query>
+          <group_by>status</group_by>
+          <values>new,assigned,escalated_tto,escalated_ttr,resolved</values>
+        </dashlet>
+        <dashlet id="9" xsi:type="DashletObjectList">
+          <rank>1</rank>
+          <title>UI:WelcomeMenu:MyCalls</title>
+          <query>SELECT UserRequest AS i WHERE i.agent_id = :current_contact_id AND status NOT IN ("closed", "resolved")</query>
+          <menu>true</menu>
+        </dashlet>
+      </dashlets>
     </cell>
   </cells>
 </dashboard>
-

+ 31 - 4
setup/compiler.class.inc.php

@@ -176,7 +176,7 @@ EOF;
 					}
 					try
 					{
-						$sCompiledCode .= $this->CompileMenu($oMenuNode, $sRelativeDir, $oP);
+						$sCompiledCode .= $this->CompileMenu($oMenuNode, $sTargetDir, $sRelativeDir, $oP);
 					}
 					catch (ssDOMFormatException $e)
 					{
@@ -929,7 +929,7 @@ EOF;
 	}// function CompileClass()
 
 
-	protected function CompileMenu($oMenu, $sModuleRelativeDir, $oP)
+	protected function CompileMenu($oMenu, $sTargetDir, $sModuleRelativeDir, $oP)
 	{
 		$sMenuId = $oMenu->getAttribute("id");
 		$sMenuClass = $oMenu->getAttribute("xsi:type");
@@ -954,8 +954,35 @@ EOF;
 			break;
 
 		case 'DashboardMenuNode':
-			$sTemplateFile = $oMenu->GetChildText('definition_file');
-			$sTemplateSpec = $this->PathToPHP($sTemplateFile, $sModuleRelativeDir);
+			$sTemplateFile = $oMenu->GetChildText('definition_file', '');
+			if ($sTemplateFile != '')
+			{
+				$sTemplateSpec = $this->PathToPHP($sTemplateFile, $sModuleRelativeDir);
+			}
+			else
+			{
+				$oDashboardDefinition = $oMenu->GetOptionalElement('definition');
+				if ($oDashboardDefinition == null)
+				{
+					throw(new Exception('Missing definition for Dashboard menu "'.$sMenuId.'" expecting either a tag "definition_file" or "definition".'));
+				}
+				$sFileName = strtolower(str_replace(array(':', '/', '\\', '*'), '_', $sMenuId)).'_dashboard_menu.xml';
+				$sTemplateSpec = $this->PathToPHP($sFileName, $sModuleRelativeDir);
+				
+				$oXMLDoc = new DOMDocument('1.0', 'UTF-8');
+				$oXMLDoc->formatOutput = true; // indent (must be loaded with option LIBXML_NOBLANKS)
+				$oXMLDoc->preserveWhiteSpace = true; // otherwise the formatOutput option would have no effect
+				
+				$oRootNode = $oXMLDoc->createElement('dashboard'); // make sure that the document is not empty
+				$oRootNode->setAttribute('xmlns:xsi', "http://www.w3.org/2001/XMLSchema-instance");
+				$oXMLDoc->appendChild($oRootNode);
+				foreach($oDashboardDefinition->childNodes as $oNode)
+				{
+					$oDefNode = $oXMLDoc->importNode($oNode, true); // layout, cells, etc Nodes and below
+					$oRootNode->appendChild($oDefNode);
+				}
+				$oXMLDoc->save($sTargetDir.'/'.$sModuleRelativeDir.'/'.$sFileName);
+			}
 			$sNewMenu = "new DashboardMenuNode('$sMenuId', $sTemplateSpec, $sParentSpec, $fRank);";
 			break;