Selaa lähdekoodia

HPCC-3314 Configmgr - Need finer granularity when copying Hardware

  - Add 'Copy Hardware Item(s) To ->' context menu for Hardware Copy
  - Allow multi-select for Hardware Items for copy

Signed-off-by: Gleb Aronsky <gleb.aronsky@lexisnexis.com>
Gleb Aronsky 12 vuotta sitten
vanhempi
commit
3a2eb36210

+ 1 - 0
deployment/deploy/XMLTags.h

@@ -137,6 +137,7 @@
 #define XML_ATTR_HOLEPREFIX            "@holePrefix"
 #define XML_ATTR_HOLEPRIORITY          "@holePriority"
 #define XML_ATTR_HOLETIMEOUT           "@holeTimeout"
+#define XML_ATTR_HWXPATH               "@hwxpath"
 #define XML_ATTR_INCLUDE               "@include"
 #define XML_ATTR_INSTALLSET            "@installSet"
 #define XML_ATTR_JACKAGENTIP           "@jackAgentIP"

+ 48 - 3
esp/files/scripts/configmgr/configmgr.js

@@ -3089,6 +3089,32 @@ function onMenuItemClickHandleEspServiceBindings(p_sType, p_aArgs, p_oValue) {
   top.document.navDT.getFileName(true) + 'Operation=' + oper + '&XmlArgs=' + xmlArgs);
 }
 
+function onMenuItemClickHandleComputerItemsCopy(p_sType, p_aArgs, p_oValue)
+{
+  var label = top.document.RightTabView.getTab(top.document.RightTabView.get('activeIndex')).get('label');
+
+  if (label === "Computer Types")
+    label = "ComputerType";
+  else if (label === "Switches")
+    label = "Switch";
+  else if (label === "Domains")
+    label = "Domain"
+  else if (label === "Computers")
+    label = "Computer"
+
+  var dt = top.document.RightTabView.getTab(top.document.RightTabView.get('activeIndex')).dt;
+
+  for (counter = 0; counter < dt.getSelectedRows().length; counter++)
+  {
+    var rec = dt.getRecord(dt.getRecordIndex(dt.getSelectedRows()[counter]));
+    var param = label + rec.getData('params').split("subTypeKey=")[1];
+
+    param = param.replace(/\@/g,'').replace(/\[/g,' ').replace(/\]/g,' ');
+
+    top.document.copyHWSWTo(p_oValue.element.innerText, true, param);
+  }
+}
+
 function onMenuItemClickHandleComputer(p_sType, p_aArgs, p_oValue) {
   var form = top.document.forms['treeForm'];
   if (form.isLocked.value === 'false')
@@ -3205,10 +3231,22 @@ function onContextMenuBeforeShowRegular(p_sType, p_aArgs) {
       "Computers": [
                                 { text: "New", onclick: { fn: onMenuItemClickHandleComputer} },
                                 { text: "New Range...", onclick: { fn: onMenuItemClickHandleComputer} },
-                                { text: "Delete", onclick: { fn: onMenuItemClickHandleComputer}}],
+                                { text: "Delete", onclick: { fn: onMenuItemClickHandleComputer} },
+                                { text: "Copy Hardware Item(s) To",
+                                  submenu: {
+                                    id: "HWCopyItems",
+                                    lazyload: true,
+                                    itemdata: top.document.copyCompMenu2
+                                    } } ],
       "Hardware": [
                                 { text: "New", onclick: { fn: onMenuItemClickHandleComputer} },
-                                { text: "Delete", onclick: { fn: onMenuItemClickHandleComputer} }
+                                { text: "Delete", onclick: { fn: onMenuItemClickHandleComputer} },
+                                { text: "Copy Hardware Item(s) To",
+                                  submenu: {
+                                     id: "HWCopyItems",
+                                     lazyload: true,
+                                     itemdata: top.document.copyCompMenu2
+                                    } }
                                 ],
       "GenericAddDelete": [
                                 { text: "Add", onclick: { fn: onMenuItemClickGenericAddDelete} },
@@ -3219,7 +3257,14 @@ function onContextMenuBeforeShowRegular(p_sType, p_aArgs) {
      };
   }
 
-  var oTarget = this.contextEventTarget, aMenuItems, aClasses;
+  for (var count = 0; count < this.configContextMenuItems.Hardware[2].submenu.itemdata.length; count++)
+  {
+    if (typeof(this.configContextMenuItems.Hardware[2].submenu.itemdata[count]) !== 'undefined')
+      this.configContextMenuItems.Hardware[2].submenu.itemdata[count].onclick.fn  = onMenuItemClickHandleComputerItemsCopy;
+  }
+
+
+var oTarget = this.contextEventTarget, aMenuItems, aClasses;
   if (this.getRoot() === this) {
     var Dom = YAHOO.util.Dom;
     var oSelectedTR = oTarget.nodeName.toUpperCase() === "TR" ?

+ 15 - 6
esp/files/scripts/configmgr/navtree.js

@@ -1178,7 +1178,8 @@ function createNavigationTree(navTreeData) {
     }
   }
 
-  var copyCompMenu = new Array();
+  top.document.copyCompMenu = new Array();
+  top.document.copyCompMenu2 = new Array();
   var fnDeleteComps = function(){
   var params = "queryType=sourceEnvironments";
 
@@ -1200,7 +1201,8 @@ function createNavigationTree(navTreeData) {
             {
                continue;
             }
-           copyCompMenu[i] = { text: files[i], onclick: { fn: onMenuSWClick} };
+           top.document.copyCompMenu[i] = { text: files[i], onclick: { fn: onMenuSWClick} };
+           top.document.copyCompMenu2[i] = { text: files[i], onclick: { fn: onMenuSWClick} };
           }
         }
       },
@@ -1228,7 +1230,7 @@ function createNavigationTree(navTreeData) {
                       submenu: {
                            id: "HWCopy",
                            lazyload: true,
-                           itemdata: copyCompMenu,
+                           itemdata: top.document.copyCompMenu,
                            onclick: { fn: onMenuItemClick }
                           } }
                           ],
@@ -1276,7 +1278,7 @@ function createNavigationTree(navTreeData) {
                                 submenu: {
                                   id: "SWCopy",
                                   lazyload: true,
-                                  itemdata: copyCompMenu
+                                  itemdata: top.document.copyCompMenu
                                  }
                               }
                           ],
@@ -1963,16 +1965,21 @@ function saveEnvironment(saveas) {
   getFileName(true) + args);
 }
 
-copyHWSWTo = function (menuItemName, IsHW)
+copyHWSWTo = function (menuItemName, IsHW, HW_XPath)
 {
   var targetRec;
   var xmlStr = "";
   var xmlStr2 = "";
   var idx;
 
+  menuItemName = menuItemName.replace(/\n/g,"");
+
   if (IsHW === true)
   {
-    xmlStr2 = "<Components> <Component name=\"Hardware\" target=\"" + menuItemName + "\"/> " + "</Components>";
+    if (HW_XPath == "" || typeof(HW_XPath) == 'undefined')
+     xmlStr2 = "<Components> <Component name=\"Hardware\" target=\"" + menuItemName + "\"/> " + "</Components>";
+    else
+     xmlStr2 = "<Components> <Component name=\"Hardware\" target=\"" + menuItemName + "\" hwxpath=\"" + HW_XPath + "\"/> " + "</Components>";
   }
   else // software
   {
@@ -2013,6 +2020,8 @@ copyHWSWTo = function (menuItemName, IsHW)
   getFileName(true) + 'Operation=Copy' + (IsHW ? 'HW' : 'SW') + '&XmlArgs='  + xmlStr2);
 }
 
+top.document.copyHWSWTo = copyHWSWTo;
+
 function saveEnvironmentAs() {
   getWaitDlg().show();
 

+ 32 - 6
esp/services/WsDeploy/WsDeployService.cpp

@@ -4293,9 +4293,21 @@ bool CWsDeployFileInfo::handleComponent(IEspContext &context, IEspHandleComponen
   return true;
 }
 
+bool CWsDeployFileInfo::addCopyToPropTree(IPropertyTree* pPropTree, IPropertyTree* pDupTree, const char* tag_name)
+{
+  StringBuffer strTag;
+  strTag.clear().appendf("%s/%s", XML_TAG_HARDWARE, tag_name);
+
+  if (pPropTree->addPropTree(strTag.str(), pDupTree) == NULL)
+    return false;
+  else
+    return true;
+}
+
 bool CWsDeployFileInfo::handleHardwareCopy(IPropertyTree *pComponents, IPropertyTree *pEnvRoot)
 {
   StringBuffer xpath;
+  StringBuffer xpath3;
   StringBuffer filePath;
   xpath.clear().appendf("%s", XML_TAG_HARDWARE);
 
@@ -4307,6 +4319,8 @@ bool CWsDeployFileInfo::handleHardwareCopy(IPropertyTree *pComponents, IProperty
 
   CWsDeployFileInfo::setFilePath(filePath, iterComp->query().queryProp(XML_ATTR_TARGET));
 
+  xpath3.clear().appendf("<%s/>", iterComp->query().queryProp(XML_ATTR_HWXPATH));
+
   Owned<CWsDeployFileInfo> fi = new CWsDeployFileInfo(m_pService, filePath, false);
 
   fi->m_skipEnvUpdateFromNotification = false;
@@ -4345,23 +4359,35 @@ bool CWsDeployFileInfo::handleHardwareCopy(IPropertyTree *pComponents, IProperty
     }
     xml.append("/>");
 
-    IPropertyTree *dupTree = createPTreeFromXMLString(xml.str());
+    IPropertyTree *dupTree = NULL;
 
-    bWrite = true;
+    if (iterComp->query().queryProp(XML_ATTR_HWXPATH) && strlen(iterComp->query().queryProp(XML_ATTR_HWXPATH)) > 0)
+    {
+      dupTree = createPTreeFromXMLString((xpath3.replace('\'','\"')).str());
+
+      String strTagName(xpath3);
+      strTagName = *strTagName.substring(1,strTagName.indexOf(' '));
+
+      if (CWsDeployFileInfo::addCopyToPropTree(pEnvRoot2, dupTree, strTagName.toCharArray()) == false)
+        return false;
 
-    StringBuffer strTag;
-    strTag.clear().appendf("%s/%s", XML_TAG_HARDWARE, tag_name);
+      break;
+    }
+    else
+      dupTree = createPTreeFromXMLString(xml.str());
 
-    if (pEnvRoot2->addPropTree(strTag.str(), dupTree) == NULL)
+    if (CWsDeployFileInfo::addCopyToPropTree(pEnvRoot2, dupTree, tag_name) == false)
       return false;
   }
 
+  bWrite = true;
+
   if (bWrite == true)
   {
     StringBuffer err;
     fi->saveEnvironment(NULL, NULL, err);
 
-    if (elems.ordinality() > 0)
+    if (elems.ordinality() > 0 && !(iterComp->query().queryProp(XML_ATTR_HWXPATH) && strlen(iterComp->query().queryProp(XML_ATTR_HWXPATH)) > 0))
     {
       StringBuffer errMsg;
       errMsg.appendf("Saved succeeded but some some element(s) could not be copied.  Element(s) may already exist in the target configuration.\n[");

+ 1 - 0
esp/services/WsDeploy/WsDeployService.hpp

@@ -455,6 +455,7 @@ public:
       return m_pFile->queryFilename();
     };
     static void setFilePath(StringBuffer &filePath, const char* targetName);
+    static bool addCopyToPropTree(IPropertyTree* pPropTree, IPropertyTree* pDupTree, const char* tag_name);
     virtual void updateConfigFromFile();
     virtual bool deploy(IEspContext &context, IEspDeployRequest &req, IEspDeployResponse &resp);
     virtual bool graph(IEspContext &context, IEspEmptyRequest& req, IEspGraphResponse& resp);