-
ChatterFeed
-
0Best Answers
-
0Likes Received
-
0Likes Given
-
2Questions
-
4Replies
dynamic insert parent and child from Lightning component
We want to add rows of a parent on button click and also add multiple child records again each record.we are facing the issue for child rows.
-
- Touqeer khan
- September 23, 2019
- Like
- 0
Classic Calendar in Lightning Salesforce
Can anyone provide the workaround how we can use and show classic calendar in Lightning?
-
- Touqeer khan
- April 25, 2018
- Like
- 0
dynamic insert parent and child from Lightning component
We want to add rows of a parent on button click and also add multiple child records again each record.we are facing the issue for child rows.

- Touqeer khan
- September 23, 2019
- Like
- 0
dynamic insert parent and child in salesforce
I want to insert Multiple parent and child (Account and contacts) in Salesforce lightning. One parent and child set, multiple children if required.
Parent component :
<!--Parent-->
<aura:component controller="AuraSampleController" Implements="flexipage:availableForRecordHome,force:hasRecordId">
<!--Init handler which is call doInit js function on component Load-->
<aura:handler name="init" value="{!this}" action="{!c.doInit}"/>
<!--Event handler for Add and Delete Row Event which is execute from Child Component-->
<aura:handler name="DeleteRowEvent" event="c:DeleteRowEvent" action="{!c.removeDeletedRow}"/>
<aura:handler name="AddRowEvent" event="c:AddRowEvent" action="{!c.addRow}"/>
<!--Aura Attribute for store Account Object List as Array-->
<aura:attribute name="AccountList" type="Account[]"/>
<!--Header Part-->
<div class="slds-page-header">
<h1 class="slds-page-header__title">Create Multiple Accounts and contacts in Lightning</h1>
</div>
<!--Table Part-->
<table class="slds-table slds-table_bordered slds-table_cell-buffer">
<thead>
<tr class="slds-text-title_caps">
<th scope="col">
<div class="slds-truncate">#</div>
</th>
<th scope="col">
<div class="slds-truncate" title="Account Name">Account Name</div>
</th>
<th scope="col">
<div class="slds-truncate" title="Account Number">Account Number</div>
</th>
<th scope="col">
<div class="slds-truncate" title="Phone">Phone</div>
</th>
<th scope="col">
<div class="slds-truncate" title="Action">Action</div>
</th>
</tr>
</thead>
<tbody>
<!--Iterate the child Component for display Table rows
with pass the List Item Index for track the Every child Component
and pass each List Account Instance -->
<aura:iteration items="{!v.AccountList}" var="item" indexVar="index">
<c:Child AccountInstance="{!item}" rowIndex="{!index}" />
</aura:iteration>
</tbody>
</table>
<br/>
<!--Save Button which is call Save js function on click -->
<button class="slds-button slds-button_brand" onclick="{!c.Save}">Save</button>
</aura:component>
parent controller :
({
// function call on component Load
doInit: function(component, event, helper) {
// create a Default RowItem [Account Instance] on first time Component Load
// by call this helper function
helper.createObjectData(component, event);
},
// function for save the Records
Save: function(component, event, helper) {
// first call the helper function in if block which will return true or false.
// this helper function check the "Account Name" will not be blank on each row.
if (helper.validate(component, event)) {
// call the apex class method for save the Account List
// with pass the contact List attribute to method param.
var action = component.get("c.SaveAccounts");
action.setParams({
"accList": component.get("v.AccountList")
});
// set call back
action.setCallback(this, function(response) {
var state = response.getState();
if (state === "SUCCESS") {
// if response if success then reset the 'AccountList' Attribute
// and call the common helper method for create a default Object Data to Account List
component.set("v.AccountList", []);
helper.createObjectData(component, event);
alert('Account records saved successfully');
}
});
// enqueue the server side action
$A.enqueueAction(action);
}
},
// function for create new object Row in Contact List
addRow: function(component, event, helper) {
// call the comman "createObjectData" helper method for add new Object Row to List
helper.createObjectData(component, event);
},
// function for delete the row
removeDeletedRow: function(component, event, helper) {
//get the selected row Index for delete, from Lightning Event Attribute
var index = event.getParam("indexVar");
//get the all List (AccountList attribute) and remove the Object Element Using splice method
var AllRowsList = component.get("v.AccountList");
AllRowsList.splice(index, 1);
//set the AccountList after remove selected row element
component.set("v.AccountList", AllRowsList);
},
})
Parent Helper :
({
createObjectData: function(component, event) {
//get the AccountList from component and add(push) New Object to List
var RowItemList1 = component.get("v.AccountList");
RowItemList1.push({
'sobjectType': 'Account',
'Name': '',
'AccountNumber': '',
'Phone': ''
});
// set the updated list to attribute (AccountList) again
component.set("v.AccountList", RowItemList1);
},
//helper function for check if Account Name is not null/blank on save
validate: function(component, event) {
var isValid = true;
var allAccountRows = component.get("v.AccountList");
for (var indexVar = 0; indexVar < allAccountRows.length; indexVar++) {
if (allAccountRows[indexVar].Name == '') {
isValid = false;
alert('Account Name Cannot be blank on row number ' + (indexVar + 1));
}
}
return isValid;
},
})
Child Component :
<!-- Register 2 Lightning Event for handle add or Delete rows on Parent Component -->
<aura:registerEvent name="DeleteRowEvent" type="c:DeleteRowEvent"/>
<aura:registerEvent name="AddRowEvent" type="c:AddRowEvent"/>
<!-- Table Row -->
<tr class="slds-text-title_caps">
<td>
{!v.rowIndex + 1}
</td>
<td>
<ui:inputText class="slds-input" value="{!v.AccountInstance.Name}"/>
</td>
<td>
<ui:inputText class="slds-input" value="{!v.AccountInstance.AccountNumber}"/>
</td>
<td>
<ui:inputPhone class="slds-input" value="{!v.AccountInstance.Phone}"/>
</td>
<td>
<!-- conditionally Display Add or Delete Icons, if rowIndex is 0 then show add row Icon else show delete Icon-->
<aura:if isTrue="{!v.rowIndex == 0}">
<a onclick="{!c.addRow}">
<lightning:icon iconName="utility:add" class="slds-icon slds-icon_small" size="small" alternativeText="Add"/>
<span class="slds-assistive-text">Add</span>
</a>
<aura:set attribute="else">
<a onclick="{!c.deleteRow}">
<lightning:icon variant="error" iconName="utility:delete" class="slds-icon slds-icon_small" size="small" alternativeText="Delete"/>
<span class="slds-assistive-text">Delete</span>
</a>
</aura:set>
</aura:if>
</td>
</tr>
<br/>
<table class="slds-table slds-table_bordered slds-table_cell-buffer">
<thead>
<tr class="slds-text-title_caps">
<th scope="col">
<div class="slds-truncate" title="No">S.NO</div>
</th>
<th scope="col">
<div class="slds-truncate" title="First Name">Contact Name</div>
</th>
<th scope="col">
<div class="slds-truncate" title="Action">Action</div>
</th>
</tr>
</thead>
<tbody>
<!--Iterate the child Component for display Table rows
with pass the List Item Index for track the Every child Component
and pass each List Account Instance -->
<aura:iteration items="{!v.ContactList}" var="item" indexVar="index">
<c:Contact ContactInstance="{!item}" rowIndex="{!index}"/>
</aura:iteration>
</tbody>
</table>
child js :
({
// function call on component Load
doInit: function(component, event, helper) {
// create a Default RowItem [contact Instance] on first time Component Load
// by call this helper function
helper.createObjectData1(component, event);
},
addRow : function(component, event, helper){
//Execute the AddRowEvent Lightning Event
component.getEvent("AddRowEvent").fire();
},
deleteRow : function(component, event, helper){
//Execute the DeleteRowEvent Lightning Event and pass the deleted Row Index to Event attribute
component.getEvent("DeleteRowEvent").setParams({"indexVar" : component.get("v.rowIndex") }).fire();
},
// function for create new object Row in Contact List
addingRow: function(component, event, helper) {
// call the comman "createObjectData" helper method for add new Object Row to List
helper.createObjectData1(component, event);
},
// function for delete the row
removeDeletedRow: function(component, event, helper) {
//get the selected row Index for delete, from Lightning Event Attribute
var index = event.getParam("indexVar");
//get the all List (ContactList attribute) and remove the Object Element Using splice method
var AllRowsList = component.get("v.ContactList");
AllRowsList.splice(index, 1);
//set the ContactList after remove selected row element
component.set("v.ContactList", AllRowsList);
}
})
child helper :
({
createObjectData1: function(component, event) {
//get the ContactList from component and add(push) New Object to List
var RowItemList = component.get("v.ContactList");
RowItemList.push({
'sobjectType': 'Contact',
'FirstName': ''
});
// set the updated list to attribute (ContactList) again
component.set("v.ContactList", RowItemList);
},
//helper function for check if Contact Name is not null/blank on save
validate: function(component, event) {
var isValid = true;
var allContactRows = component.get("v.ContactList");
for (var indexVar = 0; indexVar < allContactRows.length; indexVar++) {
if (allContactRows[indexVar].FirstName == '') {
isValid = false;
alert('Contact Name Cannot be blank on row number ' + (indexVar + 1));
}
}
return isValid;
},
})
Contact Component :
<!--Child-->
<aura:component >
<!--Attribute for store single Contact object instance-->
<aura:attribute name="ContactInstance" type="Contact"/>
<!--Attribute for store Index of Particular Instance -->
<aura:attribute name="rowIndex" type="String"/>
<!-- Register 2 Lightning Event for handle add or Delete rows on Parent Component -->
<aura:registerEvent name="DeleteRowEvent" type="c:DeleteRowEvent"/>
<aura:registerEvent name="AddRowEvent" type="c:AddRowEvent"/>
<!-- Table Row -->
<tr class="slds-text-title_caps">
<td>
{!v.rowIndex + 1}
</td>
<td>
<ui:inputText class="slds-input" value="{!v.ContactInstance.FirstName}"/>
</td>
<td>
<!-- conditionally Display Add or Delete Icons, if rowIndex is 0 then show add row Icon else show delete Icon-->
<aura:if isTrue="{!v.rowIndex == 0}">
<a onclick="{!c.addRow}">
<lightning:icon iconName="utility:add" class="slds-icon slds-icon_small" size="small" alternativeText="Add"/>
<span class="slds-assistive-text">Add</span>
</a>
<aura:set attribute="else">
<a onclick="{!c.deleteRow}">
<lightning:icon variant="error" iconName="utility:delete" class="slds-icon slds-icon_small" size="small" alternativeText="Delete"/>
<span class="slds-assistive-text">Delete</span>
</a>
</aura:set>
</aura:if>
</td>
</tr>
</aura:component>
Contact Controller :
({
addRow : function(component, event, helper){
//Execute the AddRowEvent Lightning Event
component.getEvent("AddRowEvent").fire();
},
deleteRow : function(component, event, helper){
//Execute the DeleteRowEvent Lightning Event and pass the deleted Row Index to Event attribute
component.getEvent("DeleteRowEvent").setParams({"indexVar" : component.get("v.rowIndex") }).fire();
}
})
When I click on iteration add button.The iteration is happening for parent and child.By using this code you can see two add button in both parent and child . when i clik on child add.It is adding parent as well.I want to add child when i click on child button.I want to parent and child set when i click on parent button.

- d.tejdeep@nicomatic.in
- July 10, 2018
- Like
- 0
Insert Multiple parent and multiple child in single click salesforce lightning
I want to insert Multiple parent and child (Account and contacts) in Salesforce lightning.
One parent and child set, multiple children if required.
Child component - account Iteration
comtroller:
Parent component :
parent controller :
parent helper :

One parent and child set, multiple children if required.
Child component - account Iteration
<!--Child-->
<aura:component >
<!--Attribute for store single Account object instance-->
<aura:attribute name="AccountInstance" type="Account"/>
<!--Attribute for store Index of Particular Instance -->
<aura:attribute name="rowIndex" type="String"/>
<!-- Register 2 Lightning Event for handle add or Delete rows on Parent Component -->
<aura:registerEvent name="DeleteRowEvent" type="c:DeleteRowEvent"/>
<aura:registerEvent name="AddRowEvent" type="c:AddRowEvent"/>
<!-- Table Row -->
<tr class="slds-text-title_caps">
<td>
{!v.rowIndex + 1}
</td>
<td>
<ui:inputText class="slds-input" value="{!v.AccountInstance.Name}"/>
</td>
<td>
<ui:inputText class="slds-input" value="{!v.AccountInstance.AccountNumber}"/>
</td>
<td>
<ui:inputPhone class="slds-input" value="{!v.AccountInstance.Phone}"/>
</td>
<td>
<!-- conditionally Display Add or Delete Icons, if rowIndex is 0 then show add row Icon else show delete Icon-->
<a onclick="{!c.addRow}">
<lightning:icon iconName="utility:add" class="slds-icon slds-icon_small" size="small" alternativeText="Add"/>
<span class="slds-assistive-text">Add</span>
</a>
<a onclick="{!c.deleteRow}">
<lightning:icon variant="error" iconName="utility:delete" class="slds-icon slds-icon_small" size="small" alternativeText="Delete"/>
<span class="slds-assistive-text">Delete</span>
</a>
</td>
</tr>
</aura:component>
Childcontroller :
({
addRow : function(component, event, helper){
//Execute the AddRowEvent Lightning Event
component.getEvent("AddRowEvent").fire();
},
deleteRow : function(component, event, helper){
//Execute the DeleteRowEvent Lightning Event and pass the deleted Row Index to Event attribute
component.getEvent("DeleteRowEvent").setParams({"indexVar" : component.get("v.rowIndex") }).fire();
}
})
child component 2 - contact iteration:
<aura:component >
<!--Attribute for store single Account object instance-->
<aura:attribute name="ContactInstance" type="Contact"/>
<!--Attribute for store Index of Particular Instance -->
<aura:attribute name="BrowIndex" type="String"/>
<!-- Register 2 Lightning Event for handle add or Delete rows on Parent Component -->
<aura:registerEvent name="DeleteRowEvent" type="c:DeleteRowEvent"/>
<aura:registerEvent name="AddRowEvent" type="c:AddRowEvent"/>
<!-- Table Row -->
<tr class="slds-text-title_caps">
<td>
{!v.BrowIndex + 1}
</td>
<td>
<ui:inputText class="slds-input" value="{!v.ContactInstance.FirstName}"/>
</td>
<td>
<ui:inputText class="slds-input" value="{!v.ContactInstance.LastName}"/>
</td>
<td>
<!-- conditionally Display Add or Delete Icons, if rowIndex is 0 then show add row Icon else show delete Icon-->
<a onclick="{!c.BaddRow}">
<lightning:icon iconName="utility:add" class="slds-icon slds-icon_small" size="small" alternativeText="Add"/>
<span class="slds-assistive-text">Add</span>
</a>
<a onclick="{!c.BdeleteRow}">
<lightning:icon variant="error" iconName="utility:delete" class="slds-icon slds-icon_small" size="small" alternativeText="Delete"/>
<span class="slds-assistive-text">Delete</span>
</a>
</td>
</tr>
</aura:component>
comtroller:
({
BaddRow : function(component, event, helper){
//Execute the AddRowEvent Lightning Event
component.getEvent("AddRowEvent").fire();
},
BdeleteRow : function(component, event, helper){
//Execute the DeleteRowEvent Lightning Event and pass the deleted Row Index to Event attribute
component.getEvent("DeleteRowEvent").setParams({"indexVar" : component.get("v.BrowIndex") }).fire();
}
})
Parent component :
<!--Parent-->
<aura:component controller="addDeleteController" Implements="flexipage:availableForRecordHome,force:hasRecordId">
<!--Init handler which is call doInit js function on component Load-->
<aura:handler name="init" value="{!this}" action="{!c.doInit}"/>
<!--Event handler for Add and Delete Row Event which is execute from Child Component-->
<aura:handler name="DeleteRowEvent" event="c:DeleteRowEvent" action="{!c.removeDeletedRow}"/>
<aura:handler name="AddRowEvent" event="c:AddRowEvent" action="{!c.addRow}"/>
<aura:handler name="DeleteRowEvent" event="c:DeleteRowEvent" action="{!c.BremoveDeletedRow}"/>
<aura:handler name="AddRowEvent" event="c:AddRowEvent" action="{!c.BaddRow}"/>
<!--Aura Attribute for store Account Object List as Array-->
<aura:attribute name="AccountList" type="Account[]"/>
<aura:attribute name="ContactList" type="contact[]"/>
<!--Header Part-->
<div class="slds-page-header">
<h1 class="slds-page-header__title">Create Multiple Accounts in Lightning</h1>
</div>
<!--Table Part-->
<table class="slds-table slds-table_bordered slds-table_cell-buffer">
<thead>
<tr class="slds-text-title_caps">
<th scope="col">
<div class="slds-truncate">#</div>
</th>
<th scope="col">
<div class="slds-truncate" title="Account Name">Account Name</div>
</th>
<th scope="col">
<div class="slds-truncate" title="Account Number">Account Number</div>
</th>
<th scope="col">
<div class="slds-truncate" title="Phone">Phone</div>
</th>
<th scope="col">
<div class="slds-truncate" title="Action">Action</div>
</th>
</tr>
</thead>
<tbody>
<!--Iterate the child Component for display Table rows
with pass the List Item Index for track the Every child Component
and pass each List Account Instance -->
<aura:iteration items="{!v.AccountList}" var="item" indexVar="index">
<c:childcomponent AccountInstance="{!item}" rowIndex="{!index}" />
</aura:iteration>
</tbody>
</table>
<table>
<thead>
<tr class="slds-text-title_caps">
<th scope="col">
<div class="slds-truncate">#</div>
</th>
<th scope="col">
<div class="slds-truncate" title="Contact First Name">Contact First Name</div>
</th>
<th scope="col">
<div class="slds-truncate" title="Contact Last Name">Contact Last Name</div>
</th>
<th scope="col">
<div class="slds-truncate" title="Action">Action</div>
</th>
</tr>
</thead>
<tbody>
<!--Iterate the child Component for display Table rows
with pass the List Item Index for track the Every child Component
and pass each List Account Instance -->
<aura:iteration items="{!v.ContactList}" var="item" indexVar="index">
<c:childcomponent2 ContactInstance="{!item}" BrowIndex="{!index}" />
</aura:iteration>
</tbody>
</table>
<br/>
<!--Save Button which is call Save js function on click -->
<button class="slds-button slds-button_brand" onclick="{!c.Save}">Save</button>
</aura:component>
parent controller :
({
// function call on component Load
doInit: function(component, event, helper) {
// create a Default RowItem [Account Instance] on first time Component Load
// by call this helper function
helper.createObjectData(component, event);
},
// function for save the Records
Save: function(component, event, helper) {
// first call the helper function in if block which will return true or false.
// this helper function check the "Account Name" will not be blank on each row.
if (helper.validate(component, event)) {
// call the apex class method for save the Account List
// with pass the contact List attribute to method param.
var action = component.get("c.SaveAccounts");
action.setParams( {"accList": component.get("v.AccountList") });
// set call back
action.setCallback(this, function(response) {
var state = response.getState();
if (state === "SUCCESS") {
// if response if success then reset the 'AccountList' Attribute
// and call the common helper method for create a default Object Data to Account List
component.set("v.AccountList", []);
helper.createObjectData(component, event);
alert('Account records saved successfully');
}
});
// enqueue the server side action
$A.enqueueAction(action);
}
},
// function for create new object Row in Contact List
addRow: function(component, event, helper) {
// call the comman "createObjectData" helper method for add new Object Row to List
helper.createObjectData(component, event);
},
BaddRow: function(component, event, helper) {
// call the comman "createObjectData" helper method for add new Object Row to List
helper.BcreateObjectData(component, event);
},
// function for delete the row
removeDeletedRow: function(component, event, helper) {
//get the selected row Index for delete, from Lightning Event Attribute
var index = event.getParam("indexVar");
//get the all List (AccountList attribute) and remove the Object Element Using splice method
var AllRowsList = component.get("v.AccountList");
AllRowsList.splice(index, 1);
//set the AccountList after remove selected row element
component.set("v.AccountList", AllRowsList);
},
BremoveDeletedRow: function(component, event, helper) {
//get the selected row Index for delete, from Lightning Event Attribute
var index = event.getParam("indexVar");
//get the all List (AccountList attribute) and remove the Object Element Using splice method
var AllRowsList = component.get("v.ContactList");
AllRowsList.splice(index, 1);
//set the AccountList after remove selected row element
component.set("v.ContactList", AllRowsList);
},
})
parent helper :
({
createObjectData: function(component, event) {
//get the AccountList from component and add(push) New Object to List
var RowItemList = component.get("v.AccountList");
RowItemList.push({
'sobjectType': 'Account',
'Name': '',
'AccountNumber': '',
'Phone': ''
});
var BRowItemList = component.get("v.ContactList");
BRowItemList.push({
'sobjectType': 'Contact',
'FirstName': '',
'LastName': ''
});
// set the updated list to attribute (AccountList) again
component.set("v.AccountList", RowItemList);
component.set("v.ContactList", BRowItemList);
},
BcreateObjectData: function(component, event) {
//get the AccountList from component and add(push) New Object to List
var BRowItemList = component.get("v.ContactList");
BRowItemList.push({
'sobjectType': 'Contact',
'FirstName': '',
'LastName': ''
});
// set the updated list to attribute (AccountList) again
component.set("v.ContactList", BRowItemList);
},
//helper function for check if Account Name is not null/blank on save
validate: function(component, event) {
var isValid = true;
var allAccountRows = component.get("v.AccountList");
for (var indexVar = 0; indexVar < allAccountRows.length; indexVar++) {
if (allAccountRows[indexVar].Name == '') {
isValid = false;
alert('Account Name Cannot be blank on row number ' + (indexVar + 1));
}
}
return isValid;
},
})

- d.tejdeep@nicomatic.in
- July 03, 2018
- Like
- 0