Challenge 1: Retrieve the list of Opportunity records and display on the page.
Review: Aman Pathak became winner because he added additional features apart from what were asked in the challenge.
Winner:- 2(Aura)Aman Pathak |
My name is Aman, based in Delhi.I did my B.Tech in Electronics Engineering(2017 passout) from UPES,Dehradun.
I have 1.5 years of experience in Salesforce domain, working as a Salesforce Developer in Birlasoft India Ltd.
A bit of nerdy,passionate about Salesforce technology,always trying to learn something new.
Key skils: Salesforce Admin,Apex,Lightning,Lightning Web Component
|
Features Added
- List of Opportunity Records
- Download Current list
- Download All
- Pagination
SfdcAmplified_Challange.cmp
<aura:component controller="Opportunityhandler" implements="force:appHostable,flexipage:availableForAllPageTypes,flexipage:availableForRecordHome,force:hasRecordId,forceCommunity:availableForAllPageTypes,force:lightningQuickAction" access="global" > <!-- aura:attribute declaration--> <aura:attribute name="data" type="Object"/> <aura:attribute name="columns" type="List"/> <aura:attribute name="selectedRowsCount" type="string[]"/> <!--Pagination attribute--> <aura:attribute name="allData" type="List"/> <aura:attribute name="currentPageNumber" type="Integer" default="1"/> <aura:attribute name="pageSize" type="Integer" default="10"/> <aura:attribute name="totalPages" type="Integer" default="0"/> <aura:attribute name="pageList" type="List"/> <!--Pagination attribute End--> <!-- handlers--> <aura:handler name="init" value="{!this }" action="{!c.init }"/> <!--Pagination heavily copied from SFDCFacts Credit: Manish Choudhari--> <div style="height: 300px"> <lightning:card title="SFDCAmplified Challenge Opportunity List with excel download option"> <lightning:layout multipleRows="true" horizontalAlign="center"> <lightning:layoutItem padding="around-small" size="12"> <lightning:datatable aura:id="accountDataTable" columns="{! v.columns }" data="{! v.data }" keyField="Id" onrowselection="{!c.PassToFun}" /> </lightning:layoutItem> <lightning:layoutItem padding="around-small" flexibility="auto"> <lightning:button name="CSV" label="Download Current List " onclick="{!c.downloadCSV}"/> <lightning:button name="CSV" label="Download All " onclick="{!c.downloadCSVFull}"/> <lightning:button label="First" iconName="utility:left" iconPosition="left" onclick="{!c.onFirst}" disabled="{! v.currentPageNumber == 1}"/> <lightning:button iconName="utility:chevronleft" iconPosition="left" onclick="{!c.onPrev}" disabled="{! v.currentPageNumber == 1}"/> <span class="slds-p-horizontal_x-small"> <a onclick="{!c.processMe}" name="1" class="{! (v.currentPageNumber == 1) ? 'selected' : ''}">1</a> </span> <span class="slds-p-horizontal_xxx-small"> <a>...</a> </span> <aura:iteration items="{!v.pageList}" var="item"> <span class="slds-p-horizontal_x-small"> <a onclick="{!c.processMe}" name="{!item}" class="{! (v.currentPageNumber == item) ? 'selected' : ''}">{!item}</a> </span> </aura:iteration> <span class="slds-p-horizontal_xxx-small"> <a>...</a> </span> <span class="slds-p-horizontal_x-small"> <a onclick="{!c.processMe}" name="{!v.totalPages}" class="{! (v.currentPageNumber == v.totalPages) ? 'selected' : ''}">{!v.totalPages}</a> </span> <lightning:button iconName="utility:chevronright" iconPosition="right" disabled="{! v.currentPageNumber == v.totalPages}" onclick="{!c.onNext}"/> <lightning:button label="Last" iconName="utility:right" iconPosition="right" disabled="{! v.currentPageNumber == v.totalPages}" onclick="{!c.onLast}"/> </lightning:layoutItem> </lightning:layout> </lightning:card> </div> </aura:component>
SFDCAmplified_ChallengeController
({ init: function (cmp, event, helper) { //var pageSize = component.get("v.pageSize"); cmp.set('v.columns', [ {label: 'Opportunity name', fieldName: 'Name', type: 'text', editable: true, typeAttributes: { required: true }}, { label: 'Close date', fieldName: 'CloseDate', type: 'date', editable: true, typeAttributes: { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' } }, {label: 'Amount', fieldName: 'Amount', type: 'currency', typeAttributes: { currencyCode: 'USD'}, editable: true, typeAttributes: { required: true } } ]); helper.getOpp(cmp,event,helper); }, PassToFun :function (cmp, event, helper) { var selectedRows = event.getParam('selectedRows'); cmp.set('v.selectedRowsCount', selectedRows) console.log(cmp.get('v.selectedRowsCount')); }, downloadCSV : function(component, event, helper,fileTitle) { var stockData = component.get("v.selectedRowsCount"); if(stockData.length == 0){ alert('Select atleast one opportunity from the list') return;} else{ var csv = helper.convertArrayOfObjectsToCSV(component,stockData); var hiddenElement = document.createElement('a'); hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(csv); hiddenElement.target = '_blank'; hiddenElement.download = 'export'+'.csv'; hiddenElement.click(); } }, downloadCSVFull : function(component, event, helper,fileTitle) { var stockData = component.get("v.allData"); if(stockData.length == 0){ alert('Select atleast one opportunity from the list') return;} else{ var csv = helper.convertArrayOfObjectsToCSV(component,stockData); var hiddenElement = document.createElement('a'); hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(csv); hiddenElement.target = '_blank'; hiddenElement.download = 'export'+'.csv'; hiddenElement.click(); } }, onNext : function(component, event, helper) { var pageNumber = component.get("v.currentPageNumber"); component.set("v.currentPageNumber", pageNumber+1); helper.buildData(component, helper); }, onPrev : function(component, event, helper) { var pageNumber = component.get("v.currentPageNumber"); component.set("v.currentPageNumber", pageNumber-1); helper.buildData(component, helper); }, processMe : function(component, event, helper) { component.set("v.currentPageNumber", parseInt(event.target.name)); helper.buildData(component, helper); }, onFirst : function(component, event, helper) { component.set("v.currentPageNumber", 1); helper.buildData(component, helper); }, onLast : function(component, event, helper) { component.set("v.currentPageNumber", component.get("v.totalPages")); helper.buildData(component, helper); }, })
SfdcAmplified_ChallangeHelper
({ getOpp : function(component,event,helper) { var action= component.get('c.getOpportunityList'); //action.setStorable(); action.setCallback(this,function(response) { var state =response.getState(); if(state==="SUCCESS") { var result=response.getReturnValue(); //component.set('v.data',result); //alert('result '+result); component.set("v.totalPages", Math.ceil(response.getReturnValue().length/component.get("v.pageSize"))); component.set("v.allData", response.getReturnValue()); component.set("v.currentPageNumber",1); helper.buildData(component,helper); } else { console.log('Error'); } }); $A.enqueueAction(action); }, convertArrayOfObjectsToCSV : function(component,objectRecords){ // declare variables var csvStringResult, counter, keys, columnDivider, lineDivider,parentKey; // check if "objectRecords" parameter is null, then return from function if (objectRecords == null || !objectRecords.length) { return null; } // store ,[comma] in columnDivider variabel for sparate CSV values and // for start next line use '\n' [new line] in lineDivider varaible columnDivider = ','; lineDivider = '\n'; // in the keys valirable store fields API Names as a key // this labels use in CSV file header keys = ['Name','CloseDate','Amount' ]; csvStringResult = ''; csvStringResult += keys.join(columnDivider); csvStringResult += lineDivider; for(var i=0; i < objectRecords.length; i++){ counter = 0; for(var sTempkey in keys) { var skey = keys[sTempkey] ; // add , [comma] after every String value,. [except first] if(counter > 0){ csvStringResult += columnDivider; } csvStringResult += '"'+ objectRecords[i][skey]+'"'; counter++; } // inner for loop close csvStringResult += lineDivider; }// outer main for loop close // return the CSV formate String return csvStringResult; }, buildData : function(component,helper) { var data = []; var pageNumber = component.get("v.currentPageNumber"); var pageSize = component.get("v.pageSize"); var allData = component.get("v.allData"); var x = (pageNumber-1)*pageSize; //creating data-table data for(; x<=(pageNumber)*pageSize; x++){ if(allData[x]){ data.push(allData[x]); } } component.set("v.data", data); helper.generatePageList(component, pageNumber); }, /* * this function generate page list * */ generatePageList : function(component, pageNumber){ pageNumber = parseInt(pageNumber); var pageList = []; var totalPages = component.get("v.totalPages"); if(totalPages > 1){ if(totalPages <= 10){ var counter = 2; for(; counter < (totalPages); counter++){ pageList.push(counter); } } else{ if(pageNumber < 5){ pageList.push(2, 3, 4, 5, 6); } else{ if(pageNumber>(totalPages-5)){ pageList.push(totalPages-5, totalPages-4, totalPages-3, totalPages-2, totalPages-1); } else{ pageList.push(pageNumber-2, pageNumber-1, pageNumber, pageNumber+1, pageNumber+2); } } } } component.set("v.pageList", pageList); }, })
sfdcAmplifiedChallange.app
<aura:application extends="force:slds"> <c:SFDCAmplified_Challenge/> </aura:application>
OpportunityHandler
public class Opportunityhandler { @auraenabled public static List<opportunity> getOpportunityList() { return [select Name,closeDate,Amount from opportunity]; } }