0
votes

Custom Lightning App named "Stack" giving "You dont have access to this record Contact " Trying to follow steps in How To Implement Full Search in Case Type using Salesforce?

enter image description here

Here is Org wide defaults of the custom object ERT Case Type data enter image description here

Here is Apex code of stack.aspx

                public class Stack {
                      @AuraEnabled(cacheable=true)
                    public static List<LookupSearchResult> search(String searchTerm, List<String> selectedIds){
                        if(String.isBlank(searchTerm) || searchTerm.length() < 2){
                            return null;
                        }
                        String t = '%' + searchTerm + '%'; // decide how you want to search, "starts with", "includes" or what
                        
                        List<ERT_Case_Type_Data__c> records = [SELECT Id, Name, Level_1__c, Level_2__c, Level_3__c
                            FROM ERT_Case_Type_Data__c
                            WHERE Level_1__c LIKE :t OR Level_2__c LIKE :t OR Level_3__c LIKE :t
                            ORDER BY Level_1__c, Level_2__c, Level_3__c
                            LIMIT 20];
                        
                        /* You could also experiment with SOSL?
                        records =  [FIND :('*' + searchTerm + '*') IN ALL FIELDS 
                            RETURNING Case_Type_Data__c(Id, Name, Level_1__c, Level_2__c, Level_3__c)][0];
                        */
                        
                        List<LookupSearchResult> results = new List<LookupSearchResult>();
                        for(ERT_Case_Type_Data__c ctd : records){
                            results.add(new LookupSearchResult(ctd.Id, 'ERT_Case_Type_Data__c', 'standard:case_wrap_up', ctd.Name,
                                String.join(new List<String>{ctd.Level_1__c , ctd.Level_2__c, ctd.Level_3__c}, '; ')
                            ));
                        }
                        return results;
                    } 

                }

Here is Aura component(html part)

                <aura:component implements="force:hasRecordId,force:appHostable,flexipage:availableForAllPageTypes,force:lightningQuickAction" access="global" controller="Stack">
                    <aura:attribute access="global" type="List" name="selection" default="[]"/>
                    <aura:attribute access="global" type="List" name="errors" default="[]"/>

                    <lightning:card title="New Case Type">
                        
                        <lightning:recordEditForm aura:id="myForm" objectApiName="ERT_Case_Type__c" onsubmit="{!c.onSubmit}" onsuccess="{!c.onSuccess}">
                        <lightning:messages />
                        <c:Lookup selection="{!v.selection}" onSearch="{!c.lookupSearch}" onSelection="{!c.useSelected}" errors="{!v.errors}" label="Search" placeholder="Search Case Types Data"/>
                        <lightning:inputField aura:id="Level_1__c" fieldName="Level_1__c" />
                        <lightning:inputField aura:id="Level_2__c" fieldName="Level_2__c" />
                        <lightning:inputField aura:id="Level_3__c" fieldName="Level_3__c" />
                        <lightning:button class="slds-m-top_small" variant="brand" type="submit" name="save" label="Save" />
                    </lightning:recordEditForm>
                    </lightning:card>
                </aura:component>

Here is Aura component - JS controller part

({
    lookupSearch : function(component, event, helper) {
    // Get the lookup component that fired the search event
    const lookupComponent = event.getSource();
    const serverSearchAction = component.get('c.search');
    lookupComponent.search(serverSearchAction);
},

useSelected: function(component, event, helper) {
    const selection = component.get('v.selection');
    const errors = component.get('v.errors');
    
    if (selection.length) {
        if(errors.length){  // Clear errors, if any
            component.set('v.errors', []);
        }
        let levels = selection[0].subtitle.split('; ');
        component.find('Level_1__c').set('v.value', levels[0]);
        component.find('Level_2__c').set('v.value', levels[1]);
        component.find('Level_3__c').set('v.value', levels[2]);
    }
},
onSubmit: function(component, event, helper) {
    debugger;
    event.preventDefault();       // stop the form from submitting
    var fields = event.getParam('fields');
    fields.Case__c = component.get('v.recordId'); // link to "this" Case
    component.find('myForm').submit(fields);
},
onSuccess: function(component, event, helper){
    var toastEvent = $A.get("e.force:showToast");
    toastEvent.setParams({
        "title": "Success!",
        "message": "Case Type saved OK, refreshing",
        "type": "success"
    });
    toastEvent.fire();
    $A.get('e.force:refreshView').fire(); // reload page
   }
})

Please help me in removing this access error

Regards, Carolyn

1

1 Answers

1
votes

I doubt it's sharing related (so not the org-wide settings). If it was sharing it'd simply always return 0 results but no big red errors.

If you remove the line with <c:Lookup selection="{!v.selection}" onSearch="{!c.lookupSearch}" onSelection="{!c.useSelected}" errors="{!v.errors}" label="Search" placeholder="Search Case Types Data"/> does the error go away? If it stays - it's problem with permissions around the custom code or Case_Type_Data__c). If it goes away - it's something with creating ERT_Case_Type__c)

Check the Profile (or Permission Sets if you use them) rights to:

  • Read the source object (Case_Type_Data__c) and all referenced fields (Level_1__c...)
  • Create the target object (ERT_Case_Type__c) and read/edit all referenced fields (Level1__c... but also Case__c)
  • Read on the Case object and Case.CaseNumber, Case.Subject fields
  • Permission to execute the Apex class (renamed to Stack, right?). And maybe add permission to run LookupSearchResult too.

I suspect you have enabled some critical updates (Setup -> Critical updates or Setup -> Release Updates) like "Restrict Access to @AuraEnabled Apex Methods for Authenticated Users Based on User Profile" or "Require Permission to View Record Names in Lookup Fields"