Is it possible to add a unsaved record as a draft? Yes, it is possible. It is possible using our form script capability of object.
I assume that the reader of this article has a good understanding of Java script, Jquery. User should have some knowledge on add or delete DOM elements. User should have some knowledge on Agileapps exposed Rest API and Ajax calls.
In draft capability of a record has following challenges.
In reusable script function write below
/************* set a object model and add record in draft data *****************/
function getData() {
var objectModel = '{';
var sections = $('aac-record-form .mat-tab-label');
var sectionCount=0;
if(sectionCount < sections.length) {
traverseSections(sectionCount);
}
/************ Iterate to all the sections and get the field informations **************/
function traverseSections(sectionCount) {
$('aac-record-form .mat-tab-label')[sectionCount].click();
/*********** Added a delay of 0.3 second for each section to get data **************/
setTimeout(function(){
var sectionName = $('aac-record-form .mat-tab-label')[sectionCount].getElementsByTagName('span')[0].innerText;
objectModel = objectModel+'"'+sectionName+'":{';
var formGroups = $('aac-record-form .mat-tab-body-content')[sectionCount].getElementsByClassName('form-group');
var formGroupCount=0;
/*********** Iteraing to all fields of a section **************/
while(formGroupCount<formGroups.length) {
objectModel = objectModel+'"'+'formgroup'+formGroupCount+'": {';
var fieldLabel = formGroups[formGroupCount].getElementsByTagName('label')[0].innerText;
objectModel = objectModel+'"title":"'+fieldLabel+'",';
if(formGroups[formGroupCount].getElementsByClassName('form-control')[0]) {
var fieldVal=formGroups[formGroupCount].getElementsByClassName('form-control')[0].value;
objectModel = objectModel+'"value": "'+fieldVal+'"},';
}
else {
objectModel = objectModel+'"value":""},';
}
if (formGroupCount==formGroups.length-1) { objectModel=objectModel.slice(0,-1); }
formGroupCount++;
}
sectionCount++;
if(sectionCount<sections.length) {
objectModel=objectModel+'},'
traverseSections(sectionCount);
}
else {
objectModel = objectModel+'}}';
if ($('#applyDraft').length==0) {
addDataToDraft(objectModel);
}
else {
getDraftId(objectModel);
}
}
}, 300);
}
}
/************
Add unsaved record data to Draft object as a draft recrod
it should have the fields draft_data,related_object,related_record,user_id
****************/
function addDataToDraft(modeldata) {
var oid = currentObjectId;
var rid = recordId;
var paramValue = modeldata;
var inputXML = "<platform><record><draft_data>"+modeldata+"</draft_data>"
+"<related_object>"+oid+"</related_object>"
+"<related_record>"+rid+"</related_record>"
+"<user_id>"+userId+"</user_id>"
+"</record></platform>";
// Use jQuery's ajax method to invoke the REST API
$.ajax({
type: 'POST',
url: '/networking/rest/record/'+draftObjectId,
contentType: 'application/xml',
Accept:'application/xml',
data: inputXML,
dataType: 'json',
success: function (data)
{
$applyDraft.appendTo($(".left-container")[0]);
$('#applyDraft').click(function() {
var x = JSON.parse(modeldata);
var id = data.platform.message.id;
fetchData(x, id);
})
alert('success');
}
});
}
/********** Over ride a existing draft ************/
function updateDraft(objectModel, draftId) {
var inputXML= '<platform><record><draft_data>'+objectModel+'</draft_data></record></platform>';
$.ajax({
type: 'PUT',
url: '/networking/rest/record/'+draftObjectId+'/'+draftId,
contentType: 'application/xml',
Accept:'application/xml',
data: inputXML,
dataType: 'json',
success: function (data)
{
alert('success');
}
})
}
/********* get the id of existing draft **********/
function getDraftId(objectModel) {
$.ajax({
type: 'GET',
url: "/networking/rest/execSQL?sql=select * from "+draftObjectName+" where related_record="+recordId+" AND related_object='"+currentObjectId+"' AND user_id='"+userId+"'",
contentType: 'application/xml',
Accept:'application/json',
dataType: 'json',
success: function (data)
{
updateDraft(objectModel,data.platform.record.id);
}
})
}
/************* get Draft Data onload of the record *****************/
function getDrafts() {
$.ajax({
type: 'GET',
url: "/networking/rest/execSQL?sql=select * from "+draftObjectName+" where related_record="+recordId+" AND related_object='"+currentObjectId+"' AND user_id='"+userId+"'",
contentType: 'application/xml',
Accept:'application/json',
dataType: 'json',
success: function (data)
{
if (data.platform.record) {
$applyDraft.appendTo($(".left-container")[0]);
$('#applyDraft').click(function() {
var x = JSON.parse(data.platform.record.draft_data);
var id = data.platform.record.id;
fetchData(x, id);
})
}
}
});
}
/************* apply draft to record *****************/
function fetchData(draftData, id) {
var sections = $('aac-record-form .mat-tab-label');
var sectionCount=0;
if(sectionCount < sections.length) {
fetchSections()
}
/************* apply draft data to all sections *****************/
function fetchSections() {
$('aac-record-form .mat-tab-label')[sectionCount].click();
setTimeout(function(){
var sectionName = $('aac-record-form .mat-tab-label')[sectionCount].innerText;
var formGroups = $('aac-record-form .mat-tab-body-content')[sectionCount].getElementsByClassName('form-group');
var formGroupCount=0;
while(formGroupCount<formGroups.length) {
if(formGroups[formGroupCount].getElementsByClassName('form-control')[0]) {
var fieldTitle = formGroups[formGroupCount].getElementsByTagName('label')[0].innerText;
var sectionMeta= Object.values(draftData[sectionName]);
var fieldMeta = sectionMeta.find(sm=>sm.title==fieldTitle);
if (fieldMeta) {
formGroups[formGroupCount].getElementsByClassName('form-control')[0].value = fieldMeta.value;
}
}
formGroupCount++;
}
sectionCount++;
if(sectionCount < sections.length) {
fetchSections();
}
else {
deleteDraft(id);
}
}, 300);
}
/************* delete draft record after apply *****************/
function deleteDraft(id) {
$.ajax({
type: 'DELETE',
url: '/networking/rest/record/'+draftObjectId+'/'+id,
contentType: 'application/xml',
Accept:'application/json',
dataType: 'json',
success: function (data)
{
alert('Applied');
$('#applyDraft').remove();
}
});
}
}