/**
* Common js file to handle all single node js trees
* author : turlra01
*/
lexisnexis.component.JSTreeSingleNodes = lexisnexis.component.Component
.extend({
data : {
},
ready : function() {
},
/**
* Method to setup js tree and register events
* action : the action that caused the selection to change
* selected: the current selection
* event : the event (if any) that triggered this changed event
*/
setupAvailableJsTree : function(cs, data, availableJsTree){
$(availableJsTree).jstree({
'plugins' : ["checkbox", "sort", "wholerow"],
"checkbox" : {
},
'core' : {
'check_callback' : true,
'themes' : {
'icons' : false,
'responsive' : true
},
'data' : data.leftPanel
}
}).bind("changed.jstree", function (node, action, selected, event) {
cs.bindLeftCheckBoxEvent(cs.data.availableDiv, cs.data.udfSelectAllAvailableCheckBox, cs.data.udfMoveRightBtn);
}).bind("ready.jstree", function(){
cs.showDefaultLeftPanelText(cs.data.availableDiv, cs.data.availableListPlaceholder, cs);
cs.bindLeftCheckBoxEvent(cs.data.availableDiv, cs.data.udfSelectAllAvailableCheckBox, cs.data.udfMoveRightBtn);
cs.enableOrDisableSelectAllCheckBoxOfAvailable(cs.data.availableDiv, cs.data.udfSelectAllAvailableCheckBox);
});
},
/**
* Method to setup js tree and register events
* action : the action that caused the selection to change
* selected: the current selection
* event : the event (if any) that triggered this changed event
*/
setupSelectedJsTree : function(cs, data, selectedJsTree){
$(selectedJsTree).jstree({
'plugins' : ["checkbox", "sort", "wholerow"],
"checkbox" : {
},
'core' : {
'check_callback' : true,
'themes' : {
'icons' : false,
'responsive' : true
},
'data' : data.rightPanel
}
}).bind("changed.jstree", function (node, action, selected, event) {
cs.bindRightCheckBoxEvent(cs.data.selectedDiv, cs.data.udfSelectAllSelectedCheckBox, cs.data.udfMoveLeftBtn);
cs.addGrayColorText(cs);
}).bind("ready.jstree", function(){
$(selectedJsTree).jstree("open_all");
cs.addGrayColorText(cs);
cs.showDefaultRightPaneText(cs.data.selectedDiv, cs.data.selectedListPlaceHolder);
cs.bindRightCheckBoxEvent(cs.data.selectedDiv, cs.data.udfSelectAllSelectedCheckBox, cs.data.udfMoveLeftBtn);
cs.enableOrDisableSelectAllCheckBoxOfSelected(cs.data.selectedDiv, cs.data.udfSelectAllSelectedCheckBox);
}).bind("open_node.jstree", function(){
cs.addGrayColorText(cs);
});
},
/* Binding search operation */
setupJSSearch : function(searchInpubox){
var cs = this;
//Preventing the default submit action for the search box.
$(searchInpubox).keydown(function(e) {
if (e.keyCode == 13) {
e.preventDefault();
}
});
// Clear
$(searchInpubox).focusout(function(e) {
if (searchInpubox.val().length < 3) {
searchInpubox.val('');
}
});
},
/**
* Method moves selected nodes right to left
*/
moveNodesToRight : function(availableJsTree, selectedJsTree, classificationVal, cs){
var availableJsTreeRef = $(availableJsTree).jstree(true);
var selectedJsTreeRef = $(selectedJsTree).jstree(true);
// User can't move more than 250 to Selected list .
var availableSelCount = availableJsTreeRef.get_selected().length;
var selectedCount = 0;
$(selectedJsTreeRef.get_json()).each(function(i, selectedJsonobject) {
$(selectedJsonobject.children).each(function(k, selchildobj) {
selectedCount ++;
});
});
var unCheckCount = selectedCount - (cs.data.maxRecordCount - availableSelCount);
if(unCheckCount > 0 ){
var msgModal = $(cs.data.selectedItemsCountMsgDivID).modal();
msgModal.find('.modal-body').text((cs.data.selectedMaxOutMessage).replace("<UNCHECK_COUNT>", unCheckCount)).end();
return false;
}
//Read Available Js Tree
//Read include selected jS Tree Nodes
var AvailableNodes = [];
var availableCount = 0;
var availableJson = availableJsTreeRef.get_json();
$(availableJson).each(function(i, availableJsonobject) {
/* Don't include selected nodes*/
if(availableJsonobject.state.selected == false){
AvailableNodes.push({"id" : availableJsonobject.id,
"text" : availableJsonobject.text,
"children" : []});
}
availableCount ++;
});
/*Search for parent node, if not create it*/
var selectedNodes = [];
var selectedChildNodes = [];
var parentNodeObj = selectedJsTreeRef.get_node(classificationVal);
if(!parentNodeObj){
//Creating parent node
parentNodeObj = selectedJsTreeRef.create_node("#", {"id":classificationVal,"text":classificationVal});
}
//Read selected Js tree
var selectedJson = selectedJsTreeRef.get_json();
$(selectedJson).each(function(i, selectedJsonobject) {
selectedChildNodes = [];
$(selectedJsonobject.children).each(function(k, selchildobj) {
selectedChildNodes.push({"id":selchildobj.id, "text": selchildobj.text});
});
if(selectedJsonobject.text == classificationVal){
$(availableJsTreeRef.get_selected(true)).each(function(i,obj){
selectedChildNodes.push({"id":obj.id, "text": obj.text});
});
}
selectedNodes.push({"id" : selectedJsonobject.id,
"text" : selectedJsonobject.text,
"children" : selectedChildNodes});
});
var data = {"leftPanel" : AvailableNodes,
"rightPanel" : selectedNodes};
/**
* Remove search criteria if user is moving all nodes
*/
if(availableCount == availableSelCount && $(cs.data.searchUDFInputBox).val().length > 2 ){
$(cs.data.searchUDFInputBox).val("");
$(cs.data.searchUDFInputBox).keyup();
}
else{
//Destroy and reload
$(availableJsTree).jstree("destroy");
cs.setupAvailableJsTree(cs, data, availableJsTree);
}
$(selectedJsTree).jstree("destroy");
cs.setupSelectedJsTree(cs, data, selectedJsTree);
cs.callPatientCountAjax(selectedNodes, cs);
},
/**
* Method moves selected nodes right to left
*/
moveNodesToLeft : function(availableJsTree, selectedJsTree, classificationVal, cs){
var availableJsTreeRef = $(availableJsTree).jstree(true);
var selectedJsTreeRef = $(selectedJsTree).jstree(true);
/*Read selected js Tree*/
var selectedNodes = [];
var selectedChildNodes = [];
var selectedNodesToMoveRight = [];
var selectedJson = selectedJsTreeRef.get_json();
$(selectedJson).each(function(i, selectedJsonobject) {
selectedChildNodes = [];
$(selectedJsonobject.children).each(function(k, selchildobj) {
if(selchildobj.state.selected == false){
selectedChildNodes.push({"id":selchildobj.id, "text": selchildobj.text});
}
else{
/**
* Move node parent should match with classification drop down value
* and Node Id should not be in out of stock ids list
*/
if(selectedJsonobject.text == classificationVal && $.inArray( selchildobj.id , cs.data.outOfStockIds ) == -1){
selectedNodesToMoveRight.push({"id":selchildobj.id, "text": selchildobj.text});
}
}
});
if(selectedJsonobject.state.selected == false){
selectedNodes.push({"id" : selectedJsonobject.id,
"text" : selectedJsonobject.text,
"children" : selectedChildNodes});
}
});
//Read Available Js Tree
var AvailableNodes = [];
var availableJson = availableJsTreeRef.get_json();
$(availableJson).each(function(i, availableJsonobject) {
AvailableNodes.push({"id" : availableJsonobject.id,
"text" : availableJsonobject.text,
"children" : []});
});
$(selectedNodesToMoveRight).each(function(i, availableJsonobject) {
AvailableNodes.push({"id" : availableJsonobject.id,
"text" : availableJsonobject.text,
"children" : []});
});
var data = {"leftPanel" : AvailableNodes,
"rightPanel" : selectedNodes};
if($(cs.data.searchUDFInputBox).val().length >= 3 ){
$(cs.data.searchUDFInputBox).keyup();
}
else{
$(cs.data.searchUDFInputBox).val("");
$(availableJsTree).jstree("destroy");
cs.setupAvailableJsTree(cs, data, availableJsTree);
}
//Destroy and reload
$(selectedJsTree).jstree("destroy");
cs.setupSelectedJsTree(cs, data, selectedJsTree);
cs.callPatientCountAjax(selectedNodes, cs);
},
callPatientCountAjax : function(selectedNodes, cs) {
var cs = this;
var selectedNodesJson = [];
$(selectedNodes).each(function(i, selectedParentobject) {
$(selectedParentobject.children).each(function(k, selchildobj) {
selectedNodesJson.push({"id": selchildobj.id,"text": selchildobj.text, "topValue":selectedParentobject.id});
});
});
createTemplateJs.updatePatientCountAjax(cs.data.GET_PROVIDER_COUNT_UDFs, "&selectedUDFs=" + encodeURIComponent(JSON.stringify(selectedNodesJson)));
},
dataSetChangeCallBack : function(cs, data){
//Destroy and reload
$(cs.data.availableDiv).jstree("destroy");
$(cs.data.selectedDiv).jstree("destroy");
cs.updateOutOfStockNodes(cs, data.rightPanel);
cs.setupAvailableJsTree(cs, data, cs.data.availableDiv);
cs.setupSelectedJsTree(cs, data, cs.data.selectedDiv);
},
/**
* Method to identify out stock nodes
*/
updateOutOfStockNodes : function(cs, rightPanelData){
var outOfStockIds = [];
$.each(rightPanelData, function(i) {
$.each(rightPanelData[i].children, function(j, itrObj){
if (itrObj.grayOut) {
outOfStockIds.push(itrObj.id);
}
});
});
cs.data.outOfStockIds = outOfStockIds;
},
addGrayColorText : function(cs){
jQuery.each(cs.data.outOfStockIds, function(index,value) {
$('#'+value).addClass('ln-ppm-jsTreetext-light-grey');
});
},
showDefaultLeftPanelText : function(jsTreeNodeId, placeHolderdivId, cs) {
/*alert($(jsTreeNodeCheck)+'----->'+$(jsTreeNodeCheck).length)*/
var jsTreeNodeCheck = (jsTreeNodeId)+" > ul >li";
if($(jsTreeNodeCheck).length > 0) {
$(placeHolderdivId).hide();
$(cs.data.noMatchFound).hide();
}
else {
if($(cs.data.searchUDFInputBox).val().length >= 3 ){
$(placeHolderdivId).hide();
$(cs.data.noMatchFound).show();
}
else{
$(cs.data.noMatchFound).hide();
$(placeHolderdivId).show();
$(placeHolderdivId).text("No " + $(cs.data.udfClassDefault).text() + " available");
}
}
},
showDefaultRightPaneText : function(jsTreeNodeId, placeHolderdivId) {
var cs = this;
/*alert($(jsTreeNodeCheck)+'----->'+$(jsTreeNodeCheck).length)*/
var jsTreeNodeCheck = (jsTreeNodeId)+" > ul >li";
if($(jsTreeNodeCheck).length > 0) {
$(placeHolderdivId).hide();
}
else {
$(placeHolderdivId).show();
}
},
enableOrDisableSelectAllCheckBoxOfAvailable : function(jsTreeNodeId, availableCheckbox){
//Disable/Enable select check box
var AvailableDiv = $((jsTreeNodeId + " > ul >li"));
if(AvailableDiv.length > 0) {
$(availableCheckbox).prop('disabled', false);
}
else{
$(availableCheckbox).prop('disabled', true);
}
},
enableOrDisableSelectAllCheckBoxOfSelected : function(jsTreeNodeId, selectedCheckbox){
var selectedDiv = $((jsTreeNodeId + "> ul >li"));
if(selectedDiv.length > 0) {
$(selectedCheckbox).prop('disabled', false);
}
else{
$(selectedCheckbox).prop('disabled', true);
}
},
/*Method to handle when user selected all check boxes manually , Select All check box
//shold get selected automatically.
*/
bindLeftCheckBoxEvent : function(availableJsTree, selectAllAvailableCheckBox, moveRightButton){
var selectedArrayLength = $(availableJsTree).jstree(true).get_selected(false).length;
var allNodesArrayLength = $(availableJsTree).jstree(true).get_json('#', { 'flat': true }).length;
if(selectedArrayLength > 0 && selectedArrayLength == allNodesArrayLength){
$(selectAllAvailableCheckBox).prop('checked', true);
}
else{
$(selectAllAvailableCheckBox).prop('checked', false);
}
if(selectedArrayLength > 0){
$(moveRightButton).prop('disabled', false);
}else{
$(moveRightButton).prop('disabled', true);
}
},
bindRightCheckBoxEvent : function(selectedJsTree, selectAllSelectedCheckBox, moveLeftButton){
var selectedArrayLength = $(selectedJsTree).jstree(true).get_selected(false).length;
var allNodesArrayLength = $(selectedJsTree).jstree(true).get_json('#', { 'flat': true }).length;
if( selectedArrayLength > 0 && selectedArrayLength == allNodesArrayLength){
$(selectAllSelectedCheckBox).prop('checked', true);
}
else{
$(selectAllSelectedCheckBox).prop('checked', false);
}
if(selectedArrayLength > 0){
$(moveLeftButton).prop('disabled', false);
}else{
$(moveLeftButton).prop('disabled', true);
}
}
});