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);
}
})