Here is the entire code:
<aura:component >
<aura:attribute name="options" type="List" default="[{'label': 'New', 'value': 'new'},{'label': 'In Progress', 'value': 'inProgress'},{'label': 'Finished', 'value':'finished'},]"/>
<aura:handler name="init" value="{! this }" action="{! c.init }"/>
<aura:attribute name="RelatedTo" type="String" />
<div class="slds-grid">
<div class="slds-col slds-size_1-of-6">
<div class="slds-form-element">
<label class="slds-form-element__label" for="combobox-id-12">Relate to</label>
<div class="slds-form-element__control">
<div class="slds-combobox_container">
<div class="slds-combobox slds-dropdown-trigger slds-dropdown-trigger_click slds-is-open" aura:id="ddId" aria-expanded="false" aria-haspopup="listbox" role="combobox" onclick="{!c.toggleVisibility}" >
<div class="slds-combobox__form-element slds-input-has-icon slds-input-has-icon_right" role="none">
<input type="text" class="slds-input slds-combobox__input" id="combobox-id-12" aria-autocomplete="list" aria-controls="listbox-id-9" value="{!v.RelatedTo}" onkeyup="{!c.serverCall}" autoComplete="off" role="textbox" placeholder="Search..." onblur="{!c.blurtoggleVisibility}"/>
</div>
<div id="listbox-id-9" class="slds-dropdown slds-dropdown_length-5 slds-dropdown_fluid" role="listbox">
<ul class="slds-listbox slds-listbox_vertical" role="presentation">
<aura:iteration items="{!v.options}" var="item" indexVar="i">
<li role="presentation" class="slds-listbox__item" onclick="{!c.itemSelected}" data-selectedIndex="{#i}">
<span id="{#'listbox-option-unique-id-'+i+1}" class="slds-media slds-listbox__option slds-listbox__option_entity slds-listbox__option_has-meta" role="option">
<span class="slds-media__body singleRow">
<span class="optionTitle slds-listbox__option-text slds-listbox__option-text_entity">{#item.label}</span>
</span>
</span>
</li>
</aura:iteration>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</aura:component>
Controller :
({
toggleVisibility : function(component, event, helper)
{
var RelatedTo=component.get("v.RelatedTo");
if (RelatedTo==null || RelatedTo.length==0)
{
var ddDiv = component.find('ddId');
$A.util.toggleClass(ddDiv,'slds-is-open');
console.log("Toggle");
}
else
console.log('We will not toggle as the value is selected');
},
blurtoggleVisibility : function(component, event, helper)
{
var RelatedTo=component.get("v.RelatedTo");
if (RelatedTo==null || RelatedTo.length==0)
{
var ddDiv = component.find('ddId');
window.setTimeout(
$A.getCallback(function() {
$A.util.toggleClass(ddDiv,'slds-is-open');
console.log('Toggle on Blur event');
}), 250);
}
},
init: function(component, event, helper)
{
var ddDiv = component.find('ddId');
$A.util.toggleClass(ddDiv,'slds-is-open');
},
itemSelected : function(component, event, helper)
{
console.log('We are in Select function');
var target = event.target;
var SelIndex = helper.getIndexFrmParent(target,helper,"data-selectedIndex");
if(SelIndex){
var selectedOption = component.get("v.options");
var selItem = selectedOption[SelIndex];
if(selItem.label){
console.log('Selected Value : ',selItem.label);
component.set("v.RelatedTo",selItem.label);
}
}
},
serverCall : function(component, event, helper) {
var target = event.target;
var RelatedTo = target.value;
var PreviousRelatedValue=component.get("v.RelatedTo");
if (RelatedTo.length==0 || RelatedTo==null)
{
var ddDiv = component.find('ddId');
$A.util.toggleClass(ddDiv,'slds-is-open');
console.log('Value in input box is empty');
}
else if ((PreviousRelatedValue==undefined && (RelatedTo.length>0)) ||
((PreviousRelatedValue!=undefined) && (PreviousRelatedValue.length==0) && (RelatedTo.length>0)))
{
var ddDiv = component.find('ddId');
$A.util.toggleClass(ddDiv,'slds-is-open');
}
else
{
console.log('Value in the Input Box:',RelatedTo);
}
component.set("v.RelatedTo",RelatedTo);
console.log('Value in Variable :',component.get("v.RelatedTo"));
}
})
Helper:
({
getIndexFrmParent : function(target,helper,attributeToFind){
//User can click on any child element, so traverse till intended parent found
var SelIndex = target.getAttribute(attributeToFind);
while(!SelIndex){
target = target.parentNode ;
SelIndex = helper.getIndexFrmParent(target,helper,attributeToFind);
}
return SelIndex;
},
})
Above code is the use case for Lightning Combobox and hides the dropdown, when clicked outside.
Just copy paste the code. It would work.
You may further customize it.
<ui:menu>
- screencast.com/t/uhIKvfNJq ...onblur
event as mentioned by SantanuHalder will work if only if tabindex is added to the div because its a non-input element.check out this so answer