Lightning Layouts, Input Fields and Field Level Security
The more control you want (or need) to exercise over the page layouts presented to your users, the more details you need to take care of. While the default record details and the lightning-record-form
take care of hiding fields, without a trace, the current user doesn't have access to, you need to handle that yourself in a custom layout. Here is how.
Show me yours
A typical custom form layout might look like this:
<template>
<lightning-record-edit-form
record-id={recordId}
object-api-name="Contact"
onload={formLoadHandler}
onsubmit={formSubmitHandler}
onsuccess={formSuccessHandler}
>
<lightning-layout multiple-rows="true">
<lightning-layout-item size="12">
<lightning-messages> </lightning-messages>
</lightning-layout-item>
<lightning-layout-item padding="around-small" size="6">
<lightning-input-field field-name="Name">
</lightning-input-field>
</lightning-layout-item>
<lightning-layout-item padding="around-small" size="6">
<lightning-input-field field-name="Department">
</lightning-input-field>
</lightning-layout-item>
<lightning-layout-item padding="around-small" size="6">
<lightning-input-field field-name="HomePhone">
</lightning-input-field>
</lightning-layout-item>
<lightning-layout-item padding="around-small" size="6">
<lightning-input-field field-name="CleanStatus">
</lightning-input-field>
</lightning-layout-item>
<lightning-button
class="slds-m-top_small"
variant="brand"
type="submit"
name="save"
label="Save"
>
</lightning-button>
</lightning-layout>
</lightning-record-edit-form>
</template>
Now, when a user doesn't have field level access to, let's say HomePhone
(GDPR anyone?), the form would render with an empty space in the second row. To prevent this two steps are necessary:
- Add a render condition to the
lightning-layout-item
- Compute the value for it in the
onload
event of thelightning-record-edit-form
A lightning-layout-item
would look like this:
<lightning-layout-item padding="around-small" size="6" if:true={canSee.HomePhone}>
<lightning-input-field field-name="HomePhone">
</lightning-input-field>
</lightning-layout-item>
The only difference is the if:true={canSee.number}
In your JavaScript file you add @track canSee = {}
to initialize your visibility tracker. Finally you amend the formLoadHandler
to populate the canSee
variable:
formLoadHandler(event) {
let fields = event.detail.record.fields;
for (let f in fields) {
if (fields.hasOwnProperty(f)) {
this.canSee[f] = true;
}
}
}
As usual YMMV.
Posted by Stephan H Wissel on 11 April 2019 | Comments (0) | categories: Lightning Salesforce