This commit is contained in:
Garrett K 2021-03-05 21:02:36 +00:00
parent 27b569b7db
commit 48b0f3b99c
5 changed files with 149 additions and 89 deletions

View File

@ -36,6 +36,7 @@ Contents
**Changes introduced in 0.3.14 **Changes introduced in 0.3.14
[Enhance] Added support for point-to-multipoint connections to represent breakout cables [Enhance] Added support for point-to-multipoint connections to represent breakout cables
[Fix] Broken template image upload [Fix] Broken template image upload
[Fix] Objects deleted without confirmation
**Changes introduced in 0.3.13 **Changes introduced in 0.3.13
[Fix] Failure to import trunk data correctly on backup restore [Fix] Failure to import trunk data correctly on backup restore

View File

@ -23,7 +23,7 @@ function clearObjectDetails(){
$('.rackObjSelected').removeClass('rackObjSelected'); $('.rackObjSelected').removeClass('rackObjSelected');
//Reset selected object input value so it doesn't get highlighted again //Reset selected object input value so it doesn't get highlighted again
$('#selectedObjectID').val(''); $(document).data('selectedObjectID', '');
// -=Floorplan Object Details=- // -=Floorplan Object Details=-
$('#inline-floorplanObjName').editable('setValue', '-').editable('disable'); $('#inline-floorplanObjName').editable('setValue', '-').editable('disable');
@ -147,8 +147,8 @@ function makeRackObjectsClickable(){
$(document).data('selectedObject', object); $(document).data('selectedObject', object);
//Store objectID //Store objectID
var objID = $(object).data('templateObjectId'); var selectedObjectID = $(object).data('templateObjectId');
$('#selectedObjectID').val(objID); $(document).data('selectedObjectID', selectedObjectID);
//Store objectFace //Store objectFace
var objFace = $(object).data('objectFace'); var objFace = $(object).data('objectFace');
@ -168,7 +168,7 @@ function makeRackObjectsClickable(){
//Collect object data //Collect object data
var data = { var data = {
objID: objID, objID: selectedObjectID,
page: 'build', page: 'build',
objFace: objFace, objFace: objFace,
cabinetFace: cabinetFace, cabinetFace: cabinetFace,
@ -222,6 +222,9 @@ function makeRackObjectsClickable(){
.html(cabinetTrunkedTo); .html(cabinetTrunkedTo);
initializePathSelector(); initializePathSelector();
} }
// Public data
$(document).data('selectedObjectName', response.objectName);
} }
}); });
}); });
@ -275,6 +278,9 @@ function makeFloorplanObjectsClickable(){
.html(floorplanTrunkedTo); .html(floorplanTrunkedTo);
initializeFloorplanPathSelector(); initializeFloorplanPathSelector();
} }
// Public data
$(document).data('selectedObjectName', response.name);
} }
}); });
@ -291,11 +297,11 @@ function initializePathSelector(){
var modalTitle = $(this).data('modaltitle'); var modalTitle = $(this).data('modaltitle');
var peerIDArray = $(this).data('peerIDArray'); var peerIDArray = $(this).data('peerIDArray');
$(document).data('peerIDArray', peerIDArray); $(document).data('peerIDArray', peerIDArray);
var objectID = $('#selectedObjectID').val(); var selectedObjID = $(document).data('selectedObjectID');
var objectFace = $('#selectedObjectFace').val(); var objectFace = $('#selectedObjectFace').val();
var objectDepth = $('#selectedPartitionDepth').val(); var objectDepth = $('#selectedPartitionDepth').val();
$('#objTree').jstree(true).settings.core.data = {url: 'backend/retrieve_environment-tree.php?scope=partition&objectID='+objectID+'&objectFace='+objectFace+'&objectDepth='+objectDepth}; $('#objTree').jstree(true).settings.core.data = {url: 'backend/retrieve_environment-tree.php?scope=partition&objectID='+selectedObjID+'&objectFace='+objectFace+'&objectDepth='+objectDepth};
$('#objTree').jstree(true).settings.core.multiple = false; $('#objTree').jstree(true).settings.core.multiple = false;
$('#objTree').jstree(true).refresh(); $('#objTree').jstree(true).refresh();
$('#objectTreeModalLabel').html(modalTitle); $('#objectTreeModalLabel').html(modalTitle);
@ -343,7 +349,7 @@ function initializeEditable(){
mode: 'inline', mode: 'inline',
url: 'backend/process_cabinet-objects.php', url: 'backend/process_cabinet-objects.php',
params: function(params){ params: function(params){
var selectedObjID = $('#selectedObjectID').val(); var selectedObjID = $(document).data('selectedObjectID');
var data = { var data = {
'action':'edit', 'action':'edit',
'objectID':selectedObjID, 'objectID':selectedObjID,
@ -353,7 +359,7 @@ function initializeEditable(){
return params; return params;
}, },
success: function(response) { success: function(response) {
var selectedObjID = $('#selectedObjectID').val(); var selectedObjID = $(document).data('selectedObjectID');
var responseJSON = JSON.parse(response); var responseJSON = JSON.parse(response);
if (responseJSON.active == 'inactive'){ if (responseJSON.active == 'inactive'){
window.location.replace("/"); window.location.replace("/");
@ -498,7 +504,8 @@ function initializeInsertDroppable(){
} }
function retrieveCabinet(cabinetID, cabinetFace){ function retrieveCabinet(cabinetID, cabinetFace){
var objID = $('#selectedObjectID').val();
var selectedObjectID = $(document).data('selectedObjectID');
//Collect object data //Collect object data
var data = { var data = {
@ -522,9 +529,10 @@ function retrieveCabinet(cabinetID, cabinetFace){
} else { } else {
$('#buildSpaceContent').html(response.data[0].html); $('#buildSpaceContent').html(response.data[0].html);
loadCabinetBuild(); loadCabinetBuild();
//Re-highlight select cabinet object when switching cabinet side. //Re-highlight select cabinet object when switching cabinet side.
if (objID) { if (selectedObjectID) {
$('[data-template-object-id="'+objID+'"]').find('.flex-container-parent:first').addClass('rackObjSelected'); $('[data-template-object-id="'+selectedObjectID+'"]').find('.flex-container-parent:first').addClass('rackObjSelected');
} }
} }
}); });
@ -1448,17 +1456,17 @@ $( document ).ready(function() {
}); });
if(selectedObjectType == 'floorplan') { if(selectedObjectType == 'floorplan') {
var value = selectedNodeArray; var value = selectedNodeArray;
var objectID = $(document).data('selectedFloorplanObjectID'); var selectedObjectID = $(document).data('selectedFloorplanObjectID');
var trunkPathContainer = $('#floorplanTrunkedTo'); var trunkPathContainer = $('#floorplanTrunkedTo');
var data = { var data = {
action: 'trunkFloorplanPeer', action: 'trunkFloorplanPeer',
value: value, value: value,
objectID: objectID objectID: selectedObjectID
} }
} else if(selectedObjectType == 'cabinet') { } else if(selectedObjectType == 'cabinet') {
var value = selectedNodeArray[0]; var value = selectedNodeArray[0];
var objectID = $('#selectedObjectID').val(); var selectedObjectID = $(document).data('selectedObjectID');
var objectFace = $('#selectedObjectFace').val(); var objectFace = $('#selectedObjectFace').val();
var objectDepth = $('#selectedPartitionDepth').val(); var objectDepth = $('#selectedPartitionDepth').val();
var trunkPathContainer = $('#cabinetTrunkedTo'); var trunkPathContainer = $('#cabinetTrunkedTo');
@ -1466,7 +1474,7 @@ $( document ).ready(function() {
var data = { var data = {
action: 'trunkPeer', action: 'trunkPeer',
value: value, value: value,
objectID: objectID, objectID: selectedObjectID,
objectFace: objectFace, objectFace: objectFace,
objectDepth: objectDepth objectDepth: objectDepth
}; };
@ -1491,7 +1499,7 @@ $( document ).ready(function() {
if(selectedObjectType == 'floorplan') { if(selectedObjectType == 'floorplan') {
getFloorplanObjectPeerTable(); getFloorplanObjectPeerTable();
} else { } else {
$('[data-template-object-id='+objectID+']').find('[data-depth='+objectDepth+']').find('.port').addClass('endpointTrunked'); $('[data-template-object-id='+selectedObjectID+']').find('[data-depth='+objectDepth+']').find('.port').addClass('endpointTrunked');
var peerArray = value.split('-'); var peerArray = value.split('-');
var peerID = peerArray[1]; var peerID = peerArray[1];
var peerDepth = peerArray[3]; var peerDepth = peerArray[3];
@ -1507,20 +1515,20 @@ $( document ).ready(function() {
var selectedObjectType = $(document).data('selectedObjectType'); var selectedObjectType = $(document).data('selectedObjectType');
if(selectedObjectType == 'floorplan') { if(selectedObjectType == 'floorplan') {
var objectID = $(document).data('selectedFloorplanObjectID'); var selectedObjectID = $(document).data('selectedFloorplanObjectID');
var data = { var data = {
action: 'clearFloorplanTrunkPeer', action: 'clearFloorplanTrunkPeer',
objectID: objectID objectID: selectedObjectID
}; };
} else if(selectedObjectType == 'cabinet') { } else if(selectedObjectType == 'cabinet') {
var objectID = $('#selectedObjectID').val(); var selectedObjectID = $(document).data('selectedObjectID');
var objectFace = $('#selectedObjectFace').val(); var objectFace = $('#selectedObjectFace').val();
var objectDepth = $('#selectedPartitionDepth').val(); var objectDepth = $('#selectedPartitionDepth').val();
var data = { var data = {
action: 'clearTrunkPeer', action: 'clearTrunkPeer',
objectID: objectID, objectID: selectedObjectID,
objectFace: objectFace, objectFace: objectFace,
objectDepth: objectDepth objectDepth: objectDepth
}; };
@ -1547,7 +1555,7 @@ $( document ).ready(function() {
.data('peerIDArray', []); .data('peerIDArray', []);
// Clear trunked style // Clear trunked style
$('[data-template-object-id='+objectID+']').find('[data-depth='+objectDepth+']').find('.port').removeClass('endpointTrunked'); $('[data-template-object-id='+selectedObjectID+']').find('[data-depth='+objectDepth+']').find('.port').removeClass('endpointTrunked');
$('[data-template-object-id='+response.success.peerID+']').find('[data-depth='+response.success.peerFace+']').find('.port').removeClass('endpointTrunked'); $('[data-template-object-id='+response.success.peerID+']').find('[data-depth='+response.success.peerFace+']').find('.port').removeClass('endpointTrunked');
} else if(selectedObjectType == 'floorplan') { } else if(selectedObjectType == 'floorplan') {
$('#floorplanTrunkedTo') $('#floorplanTrunkedTo')
@ -1655,71 +1663,102 @@ $( document ).ready(function() {
'<button type="button" class="btn btn-sm editable-cancel btn-secondary waves-effect"><i class="zmdi zmdi-close"></i></button>'; '<button type="button" class="btn btn-sm editable-cancel btn-secondary waves-effect"><i class="zmdi zmdi-close"></i></button>';
initializeEditable(); initializeEditable();
$('.objDelete.rackObj').click(function(){ $('.objDelete').click(function(e){
// Prevent browser following # link
e.preventDefault();
if($(this).hasClass('disabled')) { if($(this).hasClass('disabled')) {
return false;
} // Prevent modal from showing
e.stopPropagation();
var cabinetID = $('#cabinetID').val();
var objectID = $('#selectedObjectID').val(); } else {
var object = $('#cabinetTable').find('[data-template-object-id='+objectID+']');
var objectName = $(document).data('selectedObjectName');
var data = {
objectID: objectID, $('#modalConfirmTitle').html('Delete Object');
action: 'delete' $('#modalConfirmBody').html('Delete <strong>'+objectName+'</strong>?');
};
if($(this).hasClass('rackObj')){
var dataSecondary = {
cabinetID: cabinetID, $(document).data('modalConfirmAction', 'deleteRackObject');
action: 'updateCabinetRUMin'
}; } else if($(this).hasClass('floorplanObj')){
data = JSON.stringify(data); $(document).data('modalConfirmAction', 'deleteFloorplanObject');
$.post('backend/process_cabinet-objects.php', {data:data}, function(response){
var alertMsg = '';
var responseJSON = JSON.parse(response);
if (responseJSON.active == 'inactive'){
window.location.replace("/");
} else if ($(responseJSON.error).size() > 0){
displayError(responseJSON.error);
} else {
removeObject(object);
$(object).remove();
clearObjectDetails();
// Update RUSize Minimum
dataSecondary = JSON.stringify(dataSecondary);
$.ajax({
url: 'backend/process_cabinet.php',
method: 'POST',
data: {'data':dataSecondary},
success: function(resultSecondary){
var responseSecondary = JSON.parse(resultSecondary);
if (responseSecondary.active == 'inactive'){
window.location.replace("/");
} else if ($(responseSecondary.error).size() > 0){
displayError(responseSecondary.error);
} else if ($(responseSecondary.success.RUData).length) {
$('#cabinetSizeInput').editable('option', 'min', responseSecondary.success.RUData.orientationSpecificMin);
}
},
async: false
});
}
} }
); }
}); });
$('.objDelete.floorplanObj').click(function(){ $('#modalConfirmBtn').click(function(){
var objectID = $(document).data('selectedFloorplanObjectID');
var data = { // Store confirm action
objectID: objectID, var confirmAction = $(document).data('modalConfirmAction');
action: 'delete'
};
data = JSON.stringify(data); if(confirmAction == 'deleteRackObject') {
$.post('backend/process_floorplan-objects.php', {data:data}, function(response){ // Delete Rack Object
var cabinetID = $('#cabinetID').val();
var selectedObjectID = $(document).data('selectedObjectID');
var object = $('#cabinetTable').find('[data-template-object-id='+selectedObjectID+']');
var data = {
objectID: selectedObjectID,
action: 'delete'
};
var dataSecondary = {
cabinetID: cabinetID,
action: 'updateCabinetRUMin'
};
data = JSON.stringify(data);
$.post('backend/process_cabinet-objects.php', {data:data}, function(response){
var alertMsg = '';
var responseJSON = JSON.parse(response);
if (responseJSON.active == 'inactive'){
window.location.replace("/");
} else if ($(responseJSON.error).size() > 0){
displayError(responseJSON.error);
} else {
removeObject(object);
$(object).remove();
clearObjectDetails();
// Update RUSize Minimum
dataSecondary = JSON.stringify(dataSecondary);
$.ajax({
url: 'backend/process_cabinet.php',
method: 'POST',
data: {'data':dataSecondary},
success: function(resultSecondary){
var responseSecondary = JSON.parse(resultSecondary);
if (responseSecondary.active == 'inactive'){
window.location.replace("/");
} else if ($(responseSecondary.error).size() > 0){
displayError(responseSecondary.error);
} else if ($(responseSecondary.success.RUData).length) {
$('#cabinetSizeInput').editable('option', 'min', responseSecondary.success.RUData.orientationSpecificMin);
}
},
async: false
});
}
}
);
} else if(confirmAction == 'deleteFloorplanObject') {
// Delete floorplan object
var objectID = $(document).data('selectedFloorplanObjectID');
var data = {
objectID: objectID,
action: 'delete'
};
data = JSON.stringify(data);
$.post('backend/process_floorplan-objects.php', {data:data}, function(response){
var alertMsg = ''; var alertMsg = '';
var responseJSON = JSON.parse(response); var responseJSON = JSON.parse(response);
if (responseJSON.active == 'inactive'){ if (responseJSON.active == 'inactive'){
@ -1731,10 +1770,9 @@ $( document ).ready(function() {
clearObjectDetails(); clearObjectDetails();
getFloorplanObjectPeerTable(); getFloorplanObjectPeerTable();
} }
} });
); }
}); });
// Ajax Tree // Ajax Tree
$('#ajaxTree') $('#ajaxTree')
@ -2088,7 +2126,6 @@ $( document ).ready(function() {
}, },
'core' : { 'core' : {
'check_callback' : function(operation, node, node_parent, node_position, more){ 'check_callback' : function(operation, node, node_parent, node_position, more){
//alert("Position: "+node_position+" Operation: "+operation+" Type: "+node.type+" Parent: "+node_parent.type+" Node name: "+node.text+" Node ID: "+node.id);
if(operation == 'move_node'){ if(operation == 'move_node'){
if(node.type == 'location') { if(node.type == 'location') {
if(node_parent.type == 'pod' || node_parent.type == 'cabinet') { if(node_parent.type == 'pod' || node_parent.type == 'cabinet') {
@ -2111,7 +2148,6 @@ $( document ).ready(function() {
}, },
'data' : { 'data' : {
'url' : function (node) { 'url' : function (node) {
//return 'backend/process_environment-tree.php';
return 'backend/retrieve_environment-tree.php?scope=cabinet'; return 'backend/retrieve_environment-tree.php?scope=cabinet';
} }
}, },

View File

@ -138,7 +138,7 @@ $qls->Security->check_auth_page('operator.php');
<button type="button" class="btn btn-sm btn-custom dropdown-toggle waves-effect waves-light" data-toggle="dropdown" aria-expanded="false">Actions <span class="m-l-5"><i class="fa fa-cog"></i></span></button> <button type="button" class="btn btn-sm btn-custom dropdown-toggle waves-effect waves-light" data-toggle="dropdown" aria-expanded="false">Actions <span class="m-l-5"><i class="fa fa-cog"></i></span></button>
<div class="dropdown-menu"> <div class="dropdown-menu">
<a class="clearTrunkPeer floorplanObj dropdown-item disabled" href="#" ><i class="fa fa-times"></i></span> Clear Path</a> <a class="clearTrunkPeer floorplanObj dropdown-item disabled" href="#" ><i class="fa fa-times"></i></span> Clear Path</a>
<a class="objDelete floorplanObj dropdown-item disabled" href="#" data-toggle="modal" data-target="#modalTemplateDeleteConfirm"><i class="fa fa-times"></i></span> Delete</a> <a class="objDelete floorplanObj dropdown-item disabled" href="#" data-toggle="modal" data-target="#modalConfirm"><i class="fa fa-times"></i></span> Delete</a>
</div> </div>
</div> </div>
</span> </span>
@ -241,7 +241,7 @@ $qls->Security->check_auth_page('operator.php');
<div class="dropdown-menu"> <div class="dropdown-menu">
<a class="createCombinedTemplate rackObj dropdown-item disabled" href="#" ><i class="fa fa-object-group"></i></span> Combine Templates</a> <a class="createCombinedTemplate rackObj dropdown-item disabled" href="#" ><i class="fa fa-object-group"></i></span> Combine Templates</a>
<a class="clearTrunkPeer rackObj dropdown-item disabled" href="#" ><i class="fa fa-times"></i></span> Clear Trunk</a> <a class="clearTrunkPeer rackObj dropdown-item disabled" href="#" ><i class="fa fa-times"></i></span> Clear Trunk</a>
<a class="objDelete rackObj dropdown-item disabled" href="#" data-toggle="modal" data-target="#modalTemplateDeleteConfirm"><i class="fa fa-times"></i></span> Delete</a> <a class="objDelete rackObj dropdown-item disabled" href="#" data-toggle="modal" data-target="#modalConfirm"><i class="fa fa-times"></i></span> Delete</a>
</div> </div>
</div> </div>
</span> </span>

View File

@ -3260,7 +3260,9 @@ var $qls;
if($detectDivergence) { if($detectDivergence) {
$this->detectDivergence($trunkSet); $this->detectDivergence($trunkSet);
} }
$trunkFound = (count($trunkSet)) ? true : false;
$trunkSetCount = count($trunkSet);
$trunkFound = ($trunkSetCount) ? true : false;
// Find connections for each trunked port // Find connections for each trunked port
$workingConnSet = array(array(),array()); $workingConnSet = array(array(),array());
@ -3354,6 +3356,7 @@ var $qls;
function crawlConn($selected, $objID, $objFace, $objDepth, $objPort, &$connSet=array(array(),array()), $connSetID=0) { function crawlConn($selected, $objID, $objFace, $objDepth, $objPort, &$connSet=array(array(),array()), $connSetID=0) {
// Store cable details
$managedCableID = (isset($this->inventoryArray[$objID][$objFace][$objDepth][$objPort])) ? $this->inventoryArray[$objID][$objFace][$objDepth][$objPort][0]['localEndID'] : 0; $managedCableID = (isset($this->inventoryArray[$objID][$objFace][$objDepth][$objPort])) ? $this->inventoryArray[$objID][$objFace][$objDepth][$objPort][0]['localEndID'] : 0;
if($managedCableID != 0) { if($managedCableID != 0) {
$managedCable = $this->inventoryByIDArray[$managedCableID]; $managedCable = $this->inventoryByIDArray[$managedCableID];
@ -3399,7 +3402,6 @@ var $qls;
$remoteObjFace = $connection['face']; $remoteObjFace = $connection['face'];
$remoteObjDepth = $connection['depth']; $remoteObjDepth = $connection['depth'];
$remoteObjPort = $connection['port']; $remoteObjPort = $connection['port'];
$managedCableID = $connection['localEndID'];
// Verify this node has not been visited already // Verify this node has not been visited already
$alreadySeen = false; $alreadySeen = false;

View File

@ -733,6 +733,27 @@
</div><!-- /.modal-dialog --> </div><!-- /.modal-dialog -->
</div><!-- /.modal --> </div><!-- /.modal -->
<!-- confirm modal -->
<div id="modalConfirm" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="modalConfirm" aria-hidden="true" style="display: none;">
<div class="modal-dialog modal-sm">
<div class="modal-content">
<div class="modal-header">
<div title="Close">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">
<i class="zmdi zmdi-close"></i>
</button>
</div>
<h4 class="modal-title" id="modalConfirmTitle"></h4>
</div>
<div class="modal-body" id="modalConfirmBody"></div>
<div class="modal-footer">
<button id="modalConfirmBtn" type="button" class="btn btn-secondary btn-danger waves-effect" data-toggle="modal" data-target="#modalConfirm">Confirm</button>
<button type="button" class="btn btn-secondary waves-effect" data-dismiss="modal">Cancel</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
<!-- image upload modal --> <!-- image upload modal -->
<div id="modalTemplateWhereUsed" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="modalLableTemplateWhereUsed" aria-hidden="true" style="display: none;"> <div id="modalTemplateWhereUsed" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="modalLableTemplateWhereUsed" aria-hidden="true" style="display: none;">
<div class="modal-dialog modal-lg"> <div class="modal-dialog modal-lg">