Generic File Related List Lightning Component
Apex Class:
/* @Author : Biswajeet Samal @CreatedDate : 08th Aug 2020 @Description : Related Files Controller */ public class RelatedFilesController { @AuraEnabled public static List<ContentDocument> getRelatedDocs(Id recordId){ List<ContentDocument> cdList = new List<ContentDocument>(); List<ContentDocumentLink> cdlList = [SELECT ContentDocumentId FROM ContentDocumentLink WHERE LinkedEntityId = :recordId]; Set<Id> cdIds = new Set<Id>(); for (ContentDocumentLink cdl : cdlList) { cdIds.add(cdl.ContentDocumentId); } cdList = [SELECT Id, Title, FileType, OwnerId, Owner.Name, CreatedDate, CreatedById, CreatedBy.Name, ContentSize FROM ContentDocument WHERE Id IN :cdIds]; return cdList; } @AuraEnabled public static string getDocURL(Id docId){ ContentVersion cv = [SELECT Id FROM ContentVersion WHERE ContentDocumentId = :docId AND IsLatest = true]; String cvDownloadURL = URL.getSalesforceBaseUrl().toExternalForm() + '/sfc/servlet.shepherd/version/download/' + cv.Id; return cvDownloadURL; } @AuraEnabled public static void deleteDoc(Id docId){ ContentDocument conDoc = new ContentDocument(Id = docId); delete conDoc; } }
Lightning Component:
<aura:component implements="force:appHostable,flexipage:availableForAllPageTypes,flexipage:availableForRecordHome,force:hasRecordId,forceCommunity:availableForAllPageTypes,force:lightningQuickAction" access="global" controller="RelatedFilesController"> <!--Attributes--> <aura:attribute name="cdList" type="List"/> <!--Handlers--> <aura:handler name="init" value="{!this}" action="{!c.doInit}"/> <!--Component Start--> <table class="slds-table slds-table_cell-buffer slds-table_bordered"> <thead> <tr class="slds-line-height_reset"> <th class="slds-text-title_caps" scope="col"> <div class="slds-truncate" title="Title">Title</div> </th> <th class="slds-text-title_caps" scope="col"> <div class="slds-truncate" title="File Type">File Type</div> </th> <th class="slds-text-title_caps" scope="col"> <div class="slds-truncate" title="Created By">Created By</div> </th> <th class="slds-text-title_caps" scope="col"> <div class="slds-truncate" title="Created Date">Created Date</div> </th> <th class="slds-text-title_caps" scope="col"> </th> </tr> </thead> <tbody> <aura:iteration items="{!v.cdList}" var="cd"> <tr> <th scope="row"> <div class="slds-truncate" title="{!cd.Title}"> <a onclick="{!c.handleSelectedDocPreview}" data-Id="{!cd.Id}">{!cd.Title}</a> </div> </th> <th scope="row"> <div class="slds-truncate" title="{!cd.FileType}"> {!cd.FileType} </div> </th> <th scope="row"> <div class="slds-truncate" title="{!cd.CreatedBy.Name}"> <a onclick="{!c.handleRedirectToUserRecord}" data-Id="{!cd.CreatedById}">{!cd.CreatedBy.Name}</a> </div> </th> <th scope="row"> <div class="slds-truncate" title="{!cd.CreatedDate}"> <lightning:formattedDateTime value="{!cd.CreatedDate}"/> </div> </th> <th scope="row"> <lightning:buttonMenu alternativeText="Show menu" menuAlignment="auto" onselect="{!c.handleSelectedAction}" value="{!cd.Id}"> <lightning:menuItem value="Download" label="Download" iconName="utility:download" title="Download" /> <lightning:menuItem value="Delete" label="Delete" iconName="utility:delete" title="Delete"/> </lightning:buttonMenu> </th> </tr> </aura:iteration> </tbody> </table> <!--Component End--> </aura:component>
Lightning Component JS Controller:
({ //Get Related Docs doInit : function(component, event, helper) { helper.getRelatedDocuments(component, event); }, //Redirect To User Record handleRedirectToUserRecord: function (component, event, helper) { var recordId = event.currentTarget.getAttribute("data-Id") var navEvt = $A.get("e.force:navigateToSObject"); navEvt.setParams({ "recordId": recordId, "slideDevName": "Detail" }); navEvt.fire(); }, //Preview Selected File handleSelectedDocPreview : function(component,event,helper){ $A.get('e.lightning:openFiles').fire({ recordIds: [event.currentTarget.getAttribute("data-Id")] }); }, //Handle Selected Action handleSelectedAction: function(component, event, helper) { var docId = event.getSource().get("v.value"); var selectedMenuValue = event.detail.menuItem.get("v.value"); switch(selectedMenuValue) { case "Delete": helper.deleteDocument(component, event, docId); break; case "Download": helper.downloadDocument(component, event, docId); break; } } })
Lightning Component JS Helper:
({ getRelatedDocuments : function(component, event) { var action = component.get("c.getRelatedDocs"); action.setParams({ recordId : component.get("v.recordId") }); action.setCallback(this, function(response) { var state = response.getState(); if(state === "SUCCESS"){ component.set('v.cdList', response.getReturnValue()); }else if(state === "INCOMPLETE") { console.log("INCOMPLETE"); }else if(state === "ERROR"){ var errors = response.getError(); if(errors){ if (errors[0] && errors[0].message) { console.log("Error message: " + errors[0].message); } }else{ console.log("Unknown error"); } } }); $A.enqueueAction(action); }, deleteDocument : function(component, event, docId) { var action = component.get("c.deleteDoc"); action.setParams({ docId : docId }); action.setCallback(this, function(response) { var state = response.getState(); if(state === "SUCCESS"){ this.getRelatedDocuments(component, event); }else if(state === "INCOMPLETE") { console.log("INCOMPLETE"); }else if(state === "ERROR"){ var errors = response.getError(); if(errors){ if (errors[0] && errors[0].message) { console.log("Error message: " + errors[0].message); } }else{ console.log("Unknown error"); } } }); $A.enqueueAction(action); }, downloadDocument : function(component, event, docId) { var action = component.get("c.getDocURL"); action.setParams({ docId : docId }); action.setCallback(this, function(response) { var state = response.getState(); if(state === "SUCCESS"){ var urlEvent = $A.get("e.force:navigateToURL"); urlEvent.setParams({ "url": response.getReturnValue() }); urlEvent.fire(); }else if(state === "INCOMPLETE") { console.log("INCOMPLETE"); }else if(state === "ERROR"){ var errors = response.getError(); if(errors){ if (errors[0] && errors[0].message) { console.log("Error message: " + errors[0].message); } }else{ console.log("Unknown error"); } } }); $A.enqueueAction(action); } })