Lightning Component with Custom Search and Sorting

Lightning aura component with custom search and sorting.

Screenshots: -






Component: -

<aura:component controller="getProducts">
<!--handler-->
    <aura:handler name="init" value="{!this}" action="{!c.doInit}" />
    
    <!--attributes-->
    <aura:attribute name="products" type="List" />
    
    <aura:attribute name="queryTerm" type="String" default="" />
    <aura:attribute name="isSearching" type="Boolean" default="false" />
    
    <aura:attribute name="sortBy" type="String" default="name" />
    <aura:attribute name="sortOrder" type="String" default="asc" />
    
    <aura:attribute name="showSpinner" type="Boolean" default="false" />
    
    <!--spinner-->
    <aura:if isTrue="{!v.showSpinner}">
        <lightning:spinner alternativeText="Loading" size="large" />
    </aura:if>
    
    <div class="slds-grid">
        <div class="slds-col slds-size_12-of-12">
            <div class="slds-float_left search-box">
                <lightning:input
                                 aura:id="enter-search"
                                 name="enter-search"
                                 class="slds-m-right_medium"
                                 label="Search Product"
                                 onchange="{!c. handleKeyUp}"
                                 isLoading="{!v. isSearching}"
                                 type="search"
                                 />
            </div>
        </div>
    </div>
    
    <!--product list-->
    <div class="slds-grid slds-m-top_medium">
        <div class="slds-col table-container">
            <!--table come here-->
            <table class="slds-table slds-table_bordered">
                <thead>
                    <tr>
                        <th width="40%">
                            <span class="slds-truncate slds-p-right_x-small" title="cMembers">Product</span>
                            <span><lightning:buttonIcon iconName="utility:arrowup" size="small" variant="bare" onclick="{!c.handleSorting}" alternativeText="Order" aura:id="name" name="name" class="btn-sort" /></span>
                        </th>
                        <th width="40%">
                            <span class="slds-truncate slds-p-right_x-small" title="cMembers">Category</span>
                        </th>
                        <th width="20%">
                            <span class="slds-truncate slds-p-right_x-small" title="cMembers">Amount</span>
                            <span><lightning:buttonIcon iconName="utility:arrowup" size="small" variant="bare" onclick="{!c.handleSorting}" alternativeText="Order" aura:id="amount" name="amount" class="btn-sort" /></span>
                        </th>
                    </tr>
                </thead>
                <tbody>
                    <aura:iteration items="{!v.products}" var="product">
                        <tr id="{!product.Id}">
                            <td class="slds-cell-wrap">
                                <div>{!product.Name}</div>
                            </td>
                            <td class="slds-cell-wrap">
                                <div>{!product.Category__c}</div>
                            </td>
                            <td class="slds-cell-wrap">
                                <div>{!product.Amount__c}</div>
                            </td>
                        </tr>
                    </aura:iteration>
                </tbody>
            </table>
        </div>
    </div>
</aura:component>

Controller: -

({
doInit : function(component, event, helper) {
component.set('v.showSpinner', true);
        
        var queryTerm = component.get("v.queryTerm");
        
        var searchstring = queryTerm;
        var sortBy = component.get("v.sortBy");
        var sortOrder = component.get("v.sortOrder");
        
        var action = component.get("c.getProducts");
        
        action.setParams({"searchString": searchstring,
                          "sortby": sortBy,
                          "sortorder": sortOrder});
        
        action.setCallback(this, function(response){
            var state = response.getState();
            
            if(state == "SUCCESS") {
                var products = response.getReturnValue();
                component.set('v.products', products);
                
                component.set('v.showSpinner', false);
            }
        });
        $A.enqueueAction(action)
},
    
    handleKeyUp : function(component, event, helper) {
        var queryTerm = component.find('enter-search').get('v.value');
        component.set('v.queryTerm', queryTerm);
        component.set('v.isSearching', true);
        
        if(queryTerm.length>1 || queryTerm.length<1)
            helper.searchKey(component, event, helper, queryTerm);
        else
            component.set('v.isSearching', false);
    },
    
    handleSorting : function(component, event, helper) {
        var sortBtn = event.currentTarget;
        $A.util.toggleClass(sortBtn, 'sort-btn');
        $A.util.addClass(sortBtn, 'selected-btn');
        
        var sortByclicked = event.getSource().get("v.name");
        var currentSortBy = component.get('v.sortBy');
        
        //to reset arrow
        if(sortByclicked == 'name'){
            var cat = component.find('category');
            $A.util.removeClass(cat, 'sort-btn');
        $A.util.removeClass(cat, 'selected-btn');
            
var amnt = component.find('amount');
            $A.util.removeClass(amnt, 'sort-btn');
        $A.util.removeClass(amnt, 'selected-btn');            
        }
        else if(sortByclicked == 'amount'){
            var cat = component.find('category');
            $A.util.removeClass(cat, 'sort-btn');
        $A.util.removeClass(cat, 'selected-btn');
            
var nme = component.find('name');
            $A.util.removeClass(nme, 'sort-btn');
        $A.util.removeClass(nme, 'selected-btn');
        }
        
        var sortOrder = component.get('v.sortOrder');
        var queryTerm = component.get('v.queryTerm');
        
        if(sortByclicked != currentSortBy){
            component.set('v.sortBy', sortByclicked);
            component.set('v.sordOrder', 'desc');
            
            helper.searchKey(component, event, helper, queryTerm);
        }
        else{
            if(sortOrder == 'desc')
                component.set('v.sortOrder', 'asc');
            else if(sortOrder == 'asc')
                component.set('v.sortOrder', 'desc');
            
            helper.searchKey(component, event, helper, queryTerm);
        }
    },
})

Helper: -

({
searchKey : function(component, event, helper, searchString) {
component.set('v.showSpinner', true);
        
        var searchstring = searchString;
        var sortBy = component.get("v.sortBy");
        var sortOrder = component.get("v.sortOrder");
        
        var action = component.get("c.getProducts");
        
        action.setParams({"searchString": searchstring,
                          "sortby": sortBy,
                          "sortorder": sortOrder
                         });
        
        
        action.setCallback(this, function(response){
            var state = response.getState();
            
            if(state == "SUCCESS") {
                var products = response.getReturnValue();
                component.set('v.products', products);
                
                component.set('v.isSearching', false);
                component.set('v.showSpinner', false);
            }
        });
        $A.enqueueAction(action)
}
})

CSS: -

.THIS .search-box{
    display: inline-flex;
}
.THIS .search-box > .uiInput{
    margin-top: 6px;
}
.THIS .btn-sort:focus{
    box-shadow: none !important;
}
.THIS .sort-btn{
    transform: rotate(180deg) !important;
}
.THIS .selected-btn{
    color: #005fb2 !important;
}

Apex: -

public class getProducts {
    @AuraEnabled
    public static List<Custom_Product__c> getProducts(String searchString, String sortby, String sortorder)
    {
        string searchKey = '%'+searchString+'%';
        
        string fieldName = 'Name';
        if(sortby.equalsIgnoreCase('name')){
            fieldName = 'Name';
        }
        else if(sortby.equalsIgnoreCase('amount')){
            fieldName = 'Amount__c';
        }
        
        List<Custom_Product__c> cusProduct = new List<Custom_Product__c>();
        
        if(searchString !='' || String.isNotBlank(searchString) || String.isNotEmpty(searchString)){
            cusProduct = Database.query('SELECT Id, Name, Category__c, Amount__c FROM Custom_Product__c WHERE Name LIKE :searchKey ORDER BY '+fieldName+' '+sortorder);
        }
        else{
            cusProduct = Database.query('SELECT Id, Name, Category__c, Amount__c FROM Custom_Product__c ORDER BY '+fieldName+' '+sortorder);
        }
        return cusProduct;
    }
}

App: -

<aura:application extends="force:slds">
    <c:demoSorting />
</aura:application>

Comments

Popular posts from this blog

Thank you page with simple HTML and CSS

Lightning component to display chart using Chart.Js

Lightning component with drag and drop feature