Security->check_auth_page('operator.php'); require_once '../includes/Validate.class.php'; $validate = new Validate($qls); $validate->returnData['success'] = array(); if ($validate->returnData['active'] == 'inactive') { echo json_encode($validate->returnData); return; } $data = json_decode($_POST['data'], true); validate($data, $validate, $qls); if (!count($validate->returnData['error'])){ $operation = $data['operation']; if ($operation == 'create_node') { $order = count($qls->App->envTreeArray) + 1; $parentID = $data['parent']; $nodeType = $data['type']; $nodeName = $data['name']; $attrArray = array('order', 'parent', 'name', 'type'); $valueArray = array($order, $parentID, $nodeName, $nodeType); // Add column and value if floorplan object if($nodeType == 'floorplan') { array_push($attrArray, 'floorplan_img'); array_push($valueArray, DEFAULT_FLOORPLAN_IMG); } // Insert new node into env_tree table $qls->SQL->insert('app_env_tree', $attrArray, $valueArray); // Ajax response with auto-incremented node.id so jsTree can replace default 'j1_1' node.id $validate->returnData['success']['nodeID'] = $qls->SQL->insert_id(); $validate->returnData['success']['nodeName'] = $nodeName; // Log history $parentName = $qls->App->envTreeArray[$parentID]['nameString']; $actionString = 'Added '.$nodeType.': '.$parentName.'.'.$nodeName.''; $qls->App->logAction(2, 1, $actionString); } else if ($operation == 'rename_node') { $nodeID = $data['id']; $nodeName = $data['name']; $qls->SQL->update('app_env_tree', array('name'=>$nodeName), 'id='.$nodeID); // Log history $nodeType = $qls->App->envTreeArray[$nodeID]['type']; $originalNodeName = $qls->App->envTreeArray[$nodeID]['nameString']; $actionString = 'Renamed '.$nodeType.': From '.$originalNodeName.' to '.$nodeName.''; $qls->App->logAction(2, 2, $actionString); } else if ($operation == 'move_node') { $nodeID = $data['id']; $parentID = $data['parent']; $newOrder = $data['order']; $node = $qls->App->envTreeArray[$nodeID]; $permitted = true; if($node['type'] == 'floorplan') { if($parentID != '#') { $parent = $qls->App->envTreeArray[$parentID]; $parentType = $parent['type']; if($parentType == 'floorplan' or $parentType == 'pod' or $parentType == 'cabinet') { $permitted = false; } } } else if($node['type'] == 'cabinet') { if($parentID != '#') { $parent = $qls->App->envTreeArray[$parentID]; $parentType = $parent['type']; if($parentType == 'cabinet' or $parentType == 'floorplan') { $permitted = false; } } } if($permitted) { $origOrder = $node['order']; $ordDiff = $newOrder - $origOrder; // Set the user defined order foreach($qls->App->envTreeArray as $envTreeNode) { $envTreeNodeID = $envTreeNode['id']; $envTreeNodeOrder = $envTreeNode['order']; if($envTreeNodeID != $nodeID) { if($ordDiff < 0) { if($envTreeNodeOrder >= $newOrder and $envTreeNodeOrder <= $origOrder) { $newEnvTreeNodeOrder = $envTreeNodeOrder + 1; $qls->SQL->update('app_env_tree', array('order'=>$newEnvTreeNodeOrder), array('id'=>array('=', $envTreeNodeID))); } } else if($ordDiff > 0) { if($envTreeNodeOrder <= $newOrder and $envTreeNodeOrder >= $origOrder) { $newEnvTreeNodeOrder = $envTreeNodeOrder - 1; $qls->SQL->update('app_env_tree', array('order'=>$newEnvTreeNodeOrder), array('id'=>array('=', $envTreeNodeID))); } } } } $qls->SQL->update('app_env_tree', array('parent'=>$parentID, 'order'=>$newOrder), 'id='.$nodeID); // Log history $nodeType = $qls->App->envTreeArray[$nodeID]['type']; $nodeName = $qls->App->envTreeArray[$nodeID]['name']; $originalParentID = $qls->App->envTreeArray[$nodeID]['parent']; $originalParentName = ($originalParentID == '#') ? 'Root' : $qls->App->envTreeArray[$originalParentID]['nameString']; $newParentName = ($parentID == '#') ? 'Root' : $qls->App->envTreeArray[$parentID]['nameString']; $actionString = 'Moved '.$nodeType.': From '.$originalParentName.'.'.$nodeName.' to '.$newParentName.'.'.$nodeName.''; $qls->App->logAction(2, 2, $actionString); } else { $errMsg = 'Invalid node move.'; array_push($validate->returnData['error'], $errMsg); } } else if ($operation == 'delete_node') { $nodeID = $data['id']; $occupiedArray = array(); $envTree = array(); $query = $qls->SQL->select('*', 'app_env_tree'); while($row = $qls->SQL->fetch_assoc($query)) { $envTree[$row['id']] = $row; } // Get the number of nodes that will be deleted $nodeCount = getNodeCount($nodeID, $qls); // Will there be anymore nodes left after deletion? if($nodeCount - count($envTree) == 0) { $errorMsg = 'Cannot delete all environment nodes.'; array_push($validate->returnData['error'], $errorMsg); } // Does this node's children contain any objects? canDeleteNode($nodeID, $occupiedArray, $envTree, $qls); if(count($occupiedArray)) { $occupiedCabinetList = ''; foreach($occupiedArray as $index => $occupiedNode) { $separator = $index == 0 ? '' : ', '; $occupiedCabinetList = $occupiedCabinetList.$separator.''.$occupiedNode['name'].''; } $errorMsg = 'Cannot delete environment node. The following cabinets are occupied by objects: '.$occupiedCabinetList; array_push($validate->returnData['error'], $errorMsg); } // If no errors, delete the environment node. if (!count($validate->returnData['error'])){ deleteNodes($nodeID, $qls); // Reorder nodes $counter = 1; $query = $qls->SQL->select('*', 'app_env_tree', false, array('order', 'ASC')); while($row = $qls->SQL->fetch_assoc($query)) { $rowID = $row['id']; $rowOrder = $row['order']; if ($rowOrder != $counter) { $qls->SQL->update('app_env_tree', array('order'=>$counter), array('id'=>array('=', $rowID))); } $counter++; } // Log history $nodeType = $qls->App->envTreeArray[$nodeID]['type']; $nodeName = $qls->App->envTreeArray[$nodeID]['nameString']; $actionString = 'Deleted '.$nodeType.': '.$nodeName.''; $qls->App->logAction(2, 3, $actionString); } } } echo json_encode($validate->returnData); } function validate(&$data, &$validate, &$qls){ $operationArray = array('create_node', 'rename_node', 'move_node', 'delete_node'); // Validate the operation command if ($validate->validateInArray($data['operation'], $operationArray, 'operation. Cannot delete the only remaining environment node.')) { $operation = $data['operation']; if ($operation == 'create_node') { $type = $data['type']; $parentID = $data['parent']; $typeArray = array('location', 'pod', 'cabinet', 'floorplan'); // Validate node type if($validate->validateInArray($type, $typeArray, 'node type.')) { // Validate cabinet ID if($validate->validateTreeID($parentID, 'cabinet ID')) { // Generate unique name $name = $qls->App->findUniqueName($parentID, $type); if($name === false) { $errMsg = 'Unable to find unique name.'; array_push($validate->returnData['error'], $errMsg); } else { $data['name'] = $name; } } } // Validate entitlement if($type == 'cabinet') { $query = $qls->SQL->select('id', 'app_env_tree', array('type' => array('=', 'cabinet'))); $cabNum = $qls->SQL->num_rows($query) + 1; if(!$qls->App->checkEntitlement('cabinet', $cabNum)) { $errMsg = 'Exceeded entitled cabinet count.'; array_push($validate->returnData['error'], $errMsg); } } } else if ($operation == 'rename_node') { $nodeName = $data['name']; $nodeID = $data['id']; $validName = $validate->validateNameText($nodeName, 'environment node name'); $validNodeID = $validate->validateTreeID($nodeID); // Validate node name is not a duplicate if($validName and $validNodeID) { if(isset($qls->App->envTreeArray[$nodeID])) { $parentID = $qls->App->envTreeArray[$nodeID]['parent']; $table = 'app_env_tree'; $where = array('parent' => array('=', $parentID), 'AND', 'name' => array('=', $nodeName), 'AND', 'id' => array('!=', $nodeID)); $errMsg = 'Duplicate node name.'; $validate->validateDuplicate($table, $where, $errMsg); } else { $errMsg = 'Parent node does not exist.'; array_push($validate->returnData['error'], $errMsg); } } } else if ($operation == 'move_node') { $parentID = $data['parent']; $nodeID = $data['id']; $nodeOrder = $data['order']; $validParentID = $validate->validateTreeID($parentID); $validNodeID = $validate->validateTreeID($nodeID); $validNodeOrder = $validate->validateID($nodeOrder, 'node order'); // Node Order if ($validNodeOrder) { if ($nodeOrder > count($qls->App->envTreeArray) or $nodeOrder < 1) { $errMsg = 'Invalid node order.'; array_push($validate->returnData['error'], $errMsg); } } // Same name if($validParentID and $validNodeID) { $nodeName = $qls->App->envTreeArray[$nodeID]['name']; foreach($qls->App->envTreeArray as $envTreeNode) { if($envTreeNode['parent'] == $parentID and $envTreeNode['id'] != $nodeID) { if(strtolower($nodeName) == strtolower($envTreeNode['name'])) { $errMsg = 'Duplicate node name.'; array_push($validate->returnData['error'], $errMsg); } } } } } else if ($operation == 'delete_node') { $nodeID = $data['id']; $validate->validateTreeID($nodeID); } } return; } function canDeleteNode($id, &$occupiedArray, &$envTree, &$qls){ $query = $qls->SQL->select('id', 'app_object', array('env_tree_id' => array('=', $id))); if($row = $qls->SQL->num_rows($query)) { array_push($occupiedArray, array('id' => $id, 'name' => $envTree[$id]['name'])); } $query = $qls->SQL->select('*', 'app_env_tree', array('parent' => array('=', $id))); while($row = $qls->SQL->fetch_assoc($query)) { canDeleteNode($row['id'], $occupiedArray, $envTree, $qls); } return; } function deleteNodes($id, &$qls){ $query = $qls->SQL->select('*', 'app_env_tree', array('parent' => array('=', $id))); while($row = $qls->SQL->fetch_assoc($query)) { deleteNodes($row['id'], $qls); } $qls->SQL->delete('app_env_tree', array('id' => array('=', $id))); $qls->SQL->delete('app_cable_path', array('cabinet_a_id' => array('=', $id), 'OR', 'cabinet_b_id' => array('=', $id))); $qls->SQL->delete('app_cabinet_adj', array('left_cabinet_id' => array('=', $id), 'OR', 'right_cabinet_id' => array('=', $id))); return; } function getNodeCount($id, &$qls, &$count=0){ $query = $qls->SQL->select('*', 'app_env_tree', array('parent' => array('=', $id))); while($row = $qls->SQL->fetch_assoc($query)) { getNodeCount($row['id'], $qls, $count); } $count = $count + 1; return $count; } ?>