new record custom save action on spark

  • 1
  • Problem
  • Updated 2 weeks ago
  • In Progress
Since upgrading a test environment to Spark I have found a number of our pages are behaving differently when a user hits our custom "Save & Close" button (screenshot of the high level actions below). 


When the user hits "Save & Close" the page hangs and permanently freezes. (screenshot below)


In another test environment.on Skuid version 11.2.10 I am able to create records of the same type and page xml, using the same "Save & Close" button without issue.

Affected page XML below

<skuidpage unsavedchangeswarning="yes" personalizationmode="server" useviewportmeta="true" showsidebar="true" showheader="true" cachepage="true">
    <models>
        <model id="Task" limit="1" query="false" createrowifnonefound="true" datasource="salesforce" sobject="Task" processonclient="true">
            <fields>
                <field id="Subject" overridemetadata="true" ogdisplaytype="COMBOBOX" displaytype="TEXT" picklistsource="manual"/>
                <field id="OwnerId"/>
                <field id="Owner.Name"/>
                <field id="ActivityDate"/>
                <field id="WhatId"/>
                <field id="What.Name"/>
                <field id="WhoId"/>
                <field id="Who.Name"/>
                <field id="Format__c"/>
                <field id="Status"/>
                <field id="Priority"/>
                <field id="Description"/>
                <field id="Category__c"/>
                <field id="Cluster__c"/>
                <field id="IsRecurrence"/>
                <field id="ReminderDateTime"/>
                <field id="IsReminderSet"/>
                <field id="CreatedDate"/>
                <field id="Id"/>
            </fields>
            <conditions>
                <condition type="param" value="WhoId" field="WhoId" operator="=" enclosevalueinquotes="true" novaluebehavior="" state=""/>
                <condition type="param" value="WhatId" field="WhatId" state="" operator="=" enclosevalueinquotes="true" novaluebehavior=""/>
                <condition type="userinfo" value="" field="OwnerId" fieldtargetobjects="User" operator="=" enclosevalueinquotes="true" userinfotype="userid"/>
            </conditions>
            <actions/>
        </model>
        <model id="TaskRelation" limit="20" query="false" createrowifnonefound="false" datasource="salesforce" sobject="TaskRelation" processonclient="true">
            <fields>
                <field id="IsWhat"/>
                <field id="RelationId"/>
                <field id="Relation.Name"/>
                <field id="TaskId"/>
                <field id="Task.Subject"/>
                <field id="Id"/>
                <field id="Relation.Id"/>
            </fields>
            <conditions>
                <condition type="modelmerge" value="" field="TaskId" fieldtargetobjects="Task" operator="=" model="Task" enclosevalueinquotes="true" mergefield="Id" novaluebehavior="deactivate"/>
            </conditions>
            <actions/>
        </model>
    </models>
    <components>
        <buttonset model="Task" uniqueid="sk-3dfmhM-307">
            <buttons>
                <button type="multi" label="Save &amp; Close" uniqueid="sk-1BoZDZ-81">
                    <actions>
                        <action type="blockUI" message="Saving..."/>
                        <action type="save">
                            <models>
                                <model>Task</model>
                                <model>TaskRelation</model>
                            </models>
                            <onerroractions>
                                <action type="unblockUI" message="There was an error" timeout="3000"/>
                            </onerroractions>
                        </action>
                        <action type="requeryModel" model="Task" behavior="standard"/>
                        <action type="closeAllPopups"/>
                        <action type="custom" snippet="PageRefresh"/>
                        <action type="unblockUI"/>
                    </actions>
                    <hotkeys/>
                    <renderconditions logictype="and"/>
                    <enableconditions/>
                </button>
            </buttons>
        </buttonset>
        <basicfieldeditor showheader="true" showsavecancel="false" showerrorsinline="true" model="Task" uniqueid="sk-3IgwET-164" mode="edit">
            <columns>
                <column width="50%">
                    <sections>
                        <section title="Task Information" collapsible="no">
                            <fields>
                                <field id="Subject" valuehalign="" type="" required="true" uniqueid="sk-1BoZDi-87">
                                    <renderconditions logictype="and" onhidedatabehavior="keep"/>
                                    <enableconditions/>
                                </field>
                                <field id="Format__c" valuehalign="" type="" uniqueid="sk-1BoZDk-89"/>
                                <field id="OwnerId" valuehalign="" type="" required="true" uniqueid="sk-1BoZDm-91">
                                    <label>Assigned To</label>
                                    <filters>
                                        <filter type="fieldvalue" operator="=" enclosevalueinquotes="true"/>
                                    </filters>
                                </field>
                                <field id="Description" valuehalign="" type="" uniqueid="sk-1BoZDq-93">
                                    <label>Comments</label>
                                </field>
                            </fields>
                        </section>
                    </sections>
                </column>
                <column width="50%">
                    <sections>
                        <section title="Date Information" collapsible="no">
                            <fields>
                                <field id="Status" valuehalign="" type="" required="true" uniqueid="sk-1BoZD--97"/>
                                <field id="Priority" valuehalign="" type="" required="true" uniqueid="sk-1BoZE3-99"/>
                                <field id="ActivityDate" valuehalign="" type="" uniqueid="sk-1BoZE5-101">
                                    <label>Due Date</label>
                                </field>
                            </fields>
                        </section>
                    </sections>
                </column>
            </columns>
            <renderconditions logictype="and"/>
        </basicfieldeditor>
        <wrapper uniqueid="sk-1pac-553">
            <components>
                <grid uniqueid="sk-1pac-360">
                    <divisions>
                        <division behavior="flex" verticalalign="top" minwidth="100%" ratio="1">
                            <components>
                                <basicfieldeditor showheader="true" showsavecancel="false" showerrorsinline="true" model="Task" uniqueid="sk-1pac-652" mode="read">
                                    <columns>
                                        <column width="100%">
                                            <sections>
                                                <section title="Description" collapsible="no">
                                                    <fields/>
                                                </section>
                                            </sections>
                                        </column>
                                    </columns>
                                </basicfieldeditor>
                            </components>
                        </division>
                        <division behavior="flex" minwidth="19%" ratio="1" verticalalign="top">
                            <components>
                                <richtext multiple="false" uniqueid="sk-1pac-401">
                                    <contents>&lt;p&gt;&lt;strong&gt;&amp;nbsp; Related To&lt;/strong&gt;&lt;/p&gt;
</contents>
                                </richtext>
                            </components>
                        </division>
                        <division behavior="flex" verticalalign="top" minwidth="81%" ratio="1">
                            <components>
                                <basicfieldeditor showheader="true" showsavecancel="false" showerrorsinline="true" model="Task" uniqueid="sk-1pac-410" mode="edit">
                                    <columns>
                                        <column width="100%">
                                            <sections>
                                                <section title="Section A" collapsible="no" showheader="false">
                                                    <fields>
                                                        <field uniqueid="sk-Q1m-404" type="COMBO" editmodebehavior="autopopup" readonly="true">
                                                            <label>{{WhatId}}</label>
                                                            <template>
                                                                <contents/>
                                                            </template>
                                                        </field>
                                                    </fields>
                                                </section>
                                            </sections>
                                        </column>
                                    </columns>
                                </basicfieldeditor>
                                <search uniqueid="sk-KiB-396" soslfields="Name Fields" placeholdertext="To change the default 'related to' record, enter search term here " boxwidth="50px" cssclass="seniorSearch" preventchange="true">
                                    <resultactions/>
                                    <focushotkeys/>
                                    <objects>
                                        <object datasource="salesforce" id="Account" headername="Accounts" displaytemplate="{{Name}}" fields="Id">
                                            <fields>
                                                <field id="Name"/>
                                            </fields>
                                        </object>
                                        <object datasource="salesforce" id="Campaign" headername="Campaigns" displaytemplate="{{Name}}" fields="Id">
                                            <fields>
                                                <field id="Name"/>
                                            </fields>
                                        </object>
                                        <object datasource="salesforce" id="Cluster__c" headername="Clusters" fields="Id" displaytemplate="{{Name}}">
                                            <fields>
                                                <field id="Name"/>
                                            </fields>
                                        </object>
                                        <object datasource="salesforce" id="BMCServiceDesk__Incident__c" headername="Tickets" displaytemplate="{{Name}}" fields="Id">
                                            <fields>
                                                <field id="Name"/>
                                                <field id="COL_JIS_Subject__c"/>
                                            </fields>
                                        </object>
                                        <object datasource="salesforce" id="Merger__c" headername="Mergers" displaytemplate="{{Name}}" fields="Id">
                                            <fields>
                                                <field id="Name"/>
                                            </fields>
                                        </object>
                                        <object datasource="salesforce" id="Opportunity" headername="Opportunities" displaytemplate="{{Name}} {{Account.Name}}" fields="Account.Name" fieldtargetobjects="Account">
                                            <fields>
                                                <field id="Name"/>
                                                <field id="AccountId"/>
                                                <field id="Account.Name"/>
                                            </fields>
                                        </object>
                                        <object datasource="salesforce" id="Quote" headername="Proposals" displaytemplate="{{Name}} {{Account.Name}}" fields="Account.Name" fieldtargetobjects="Account">
                                            <fields>
                                                <field id="Name"/>
                                                <field id="AccountId"/>
                                                <field id="Account.Name"/>
                                            </fields>
                                        </object>
                                        <object datasource="salesforce" headername="Services" displaytemplate="{{Name}} - {{Unique_Identifier__c}}" id="Product2" fields="Unique_Identifier__c" fieldtargetobjects="RecordType">
                                            <fields>
                                                <field id="Name"/>
                                                <field id="RecordTypeId"/>
                                                <field id="RecordType.Name"/>
                                                <field id="Unique_Identifier__c"/>
                                            </fields>
                                        </object>
                                    </objects>
                                    <selectactions>
                                        <action type="updateRow" fieldmodel="Task" affectedrows="context" field="WhatId" fieldtargetobjects="Account,Asset,AssetRelationship,BMCServiceDesk__CMDB_log__c,BMCServiceDesk__DiscoveryAuditLog__c,BMCServiceDesk__Incident__c,COL_JIS_Jisc_Domain_Account_Reference__c,Campaign,Case,Cluster__c,Contract,Internal_Contacts__c,Knowledge_Article_Changes__c,Knowledge_Article_Versions__c,Merger__c,Opportunity,Order,Product2,Product__c,Quote,SFSSDupeCatcher__Duplicate_Warning__c,SFSSDupeCatcher__Potential_Duplicate__c,SFSSDupeCatcher__Scenario__c,Solution,cwbtool__AnalysisSummary__c,cwbtool__FieldTrack__c,efconnector__EF_Event__c,npe03__Recurring_Donation__c,npo02__Household__c,npsp__Engagement_Plan_Template__c,npsp__Engagement_Plan__c,npsp__Fund__c,npsp__General_Accounting_Unit__c,npsp__Grant_Deadline__c" enclosevalueinquotes="true" value="{{Id}}"/>
                                    </selectactions>
                                </search>
                            </components>
                        </division>
                    </divisions>
                    <styles>
                        <styleitem type="background" bgtype="color">
                            <styles>
                                <styleitem property="background-color" value="#fafafa"/>
                            </styles>
                        </styleitem>
                    </styles>
                </grid>
            </components>
            <styles>
                <styleitem type="background" bgtype="color">
                    <styles>
                        <styleitem property="background-color" value="#fafafa"/>
                    </styles>
                </styleitem>
                <styleitem type="border"/>
                <styleitem type="size"/>
            </styles>
        </wrapper>
        <basicfieldeditor showheader="true" showsavecancel="false" showerrorsinline="true" model="Task" uniqueid="sk-1pac-469" mode="read">
            <columns>
                <column width="100%">
                    <sections>
                        <section title="Description" collapsible="no" showheader="false">
                            <fields>
                                <field type="COMBO" editmodebehavior="custompopup" uniqueid="sk-1BoZEB-107">
                                    <label>Name</label>
                                    <template>Add Name(s)</template>
                                    <editmodepopup title="Name" width="450">
                                        <components>
                                            <skootable showconditions="true" showsavecancel="false" showerrorsinline="true" searchmethod="server" searchbox="false" showexportbuttons="false" pagesize="10" createrecords="true" model="TaskRelation" buttonposition="" mode="read" allowcolumnreordering="false" uniqueid="sk-Bl6tR-338" emptysearchbehavior="query" cssclass="hidetablefooter">
                                                <fields>
                                                    <field id="RelationId" hideable="false" uniqueid="fi-BlO3V-380" valuehalign="" type="CUSTOM" snippet="relatedToRenderer" showbydefault="true">
                                                        <label>Name</label>
                                                    </field>
                                                </fields>
                                                <rowactions>
                                                    <action type="edit"/>
                                                    <action type="delete"/>
                                                </rowactions>
                                                <massactions usefirstitemasdefault="true"/>
                                                <views>
                                                    <view type="standard"/>
                                                </views>
                                                <searchfields/>
                                            </skootable>
                                        </components>
                                    </editmodepopup>
                                </field>
                            </fields>
                        </section>
                    </sections>
                </column>
            </columns>
        </basicfieldeditor>
        <grid uniqueid="sk-BjRmp-146">
            <divisions>
                <division behavior="flex" minwidth="100px" ratio="1">
                    <components>
                        <skootable showconditions="true" showsavecancel="false" showerrorsinline="true" searchmethod="server" searchbox="false" showexportbuttons="false" pagesize="10" createrecords="false" model="TaskRelation" mode="readonly" allowcolumnreordering="false" uniqueid="sk-Bjv_n-203" emptysearchbehavior="query">
                            <fields>
                                <field id="RelationId" hideable="false" uniqueid="fi-BkczU-283" showbydefault="true">
                                    <label>Name</label>
                                </field>
                            </fields>
                            <rowactions/>
                            <massactions usefirstitemasdefault="true"/>
                            <views>
                                <view type="standard"/>
                            </views>
                            <searchfields/>
                            <renderconditions logictype="and">
                                <rendercondition type="fieldvalue" enclosevalueinquotes="true" fieldmodel="TaskRelation" sourcetype="modelproperty" nosourcerowbehavior="deactivate" sourceproperty="hasRows"/>
                            </renderconditions>
                        </skootable>
                    </components>
                </division>
            </divisions>
            <styles>
                <styleitem type="background" bgtype="none"/>
            </styles>
        </grid>
        <basicfieldeditor showheader="true" showsavecancel="false" showerrorsinline="true" model="Task" uniqueid="sk-BjTBE-153" mode="edit">
            <columns>
                <column width="100%">
                    <sections>
                        <section title="Section A" collapsible="no" showheader="false">
                            <fields>
                                <field id="Category__c" selectedlist="3" valuehalign="" type="" uniqueid="sk-1BoZEz-120"/>
                                <field id="Cluster__c" selectedlist="3" valuehalign="" type="" uniqueid="sk-1BoZE--122"/>
                            </fields>
                        </section>
                    </sections>
                </column>
                <column width="50%">
                    <sections>
                        <section title="New Section" collapsible="no" showheader="false">
                            <fields>
                                <field id="IsReminderSet" valuehalign="" type="" uniqueid="sk-1BoZF7-126"/>
                            </fields>
                        </section>
                    </sections>
                </column>
                <column width="50%">
                    <sections>
                        <section title="New Section" collapsible="no" showheader="false">
                            <fields>
                                <field id="ReminderDateTime" valuehalign="" type="" uniqueid="sk-1BoZFF-130"/>
                            </fields>
                        </section>
                    </sections>
                </column>
            </columns>
        </basicfieldeditor>
        <buttonset model="Task" uniqueid="sk-3j8oP8-182">
            <buttons>
                <button type="multi" label="Save &amp; Add Attachment" uniqueid="sk-1BoZFW-133">
                    <actions>
                        <action type="save">
                            <models>
                                <model>Task</model>
                            </models>
                        </action>
                    </actions>
                </button>
                <button type="multi" label="Save &amp; Close" uniqueid="sk-1lKl-397">
                    <actions>
                        <action type="blockUI" message="Saving..."/>
                        <action type="save">
                            <models>
                                <model>Task</model>
                                <model>TaskRelation</model>
                            </models>
                            <onerroractions>
                                <action type="unblockUI" message="There was an error" timeout="3000"/>
                            </onerroractions>
                        </action>
                        <action type="requeryModel" behavior="standard" model="Task"/>
                        <action type="closeAllPopups"/>
                        <action type="custom" snippet="PageRefresh"/>
                        <action type="unblockUI"/>
                    </actions>
                </button>
            </buttons>
        </buttonset>
        <file storeas="record" displayas="filename" uniqueid="sk-3j8qU5-185" datasource="salesforce" model="Task"/>
    </components>
    <resources>
        <labels/>
        <javascript>
            <jsitem location="inlinesnippet" name="PageRefresh" cachelocation="false">location.reload();</jsitem>
            <jsitem location="inlinesnippet" name="relatedToRenderer" cachelocation="false">//
// CONFIGURATION 
// 
// Define the possible target objects 
var targetObjects = ['Contact','User']; 
// Render as a Picklist instead of an Autocomplete? 
var renderAsPicklist = false; 
var field = arguments[0], 
    value = skuid.utils.decodeHTML(arguments[1]), 
    metadata = field.metadata, 
    $ = skuid.$; 
if (field.mode == 'edit') { 
    // Limit the set of target objects 
    var targets = [], 
       uniqueTargets = {}; 
    $.each(metadata.referenceTo,function(i,r){ 
       if (($.inArray(r.objectName,targetObjects) != -1) &amp;&amp; (!uniqueTargets[r.objectName])) { 
          targets.push(r); 
          uniqueTargets[r.objectName] = 1; 
          if (targets.length == targetObjects.length) return false; 
        } 
    }); 
    if (targets.length) { 
       // Make this field render as a picklist? 
       if (renderAsPicklist) field.options.type = 'REFPICK'; 
       // Override the current referenceTo 
       metadata.referenceTo.length = 0; 
       metadata.ref = $.map(targets,function(targ){return targ.objectName;}).join();
       metadata.referenceTo = targets; 
    } 

// Run the standard renderer 
skuid.ui.fieldRenderers[metadata.displaytype][field.mode](field,value); </jsitem>
        </javascript>
        <css>
            <cssitem location="inline" name="hidetablefooter" cachelocation="false">/* hide footer in table */
.hidetablefooter .nx-list-footer {
    display:none;
}</cssitem>
            <cssitem location="inline" name="seniorCss" cachelocation="false">body { 
    font-family: "Stag Sans Web Light","HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",Arial,sans-serif;
}

.seniorSearch.sk-search .ui-autocomplete-input {
    background: #FFF;
    color: #000;
    border: 1px solid #D0D0D0;
    border-radius: 8px;
    font-size: 1.2em;
}

.sk-navigation-item.top-level {
    color: #000;
}

.sk-navigation-item.top-level:hover {
    color: #e85e13;
}

.sk-search-result-header,
.sk-search-results .sk-icon,
.sk-search-summary {
    background: #ffccaf;
    color: #000;
}

.sk-search-result.ui-menu-item {
    background: #D0D0D0;
    color: #000;
    font-size: 1.1em;
}

.sk-search-summary {
    border-bottom: solid black 1px;
    border-top: solid black 1px;
}


.ui-dialog .ui-dialog-titlebar {
    background: #383126;
    border-color: #383126;
}














</cssitem>
        </css>
        <actionsequences/>
    </resources>
    <styles>
        <styleitem type="background" bgtype="none"/>
    </styles>
</skuidpage>



Photo of Glenn Daly

Glenn Daly

  • 1,392 Points 1k badge 2x thumb

Posted 4 weeks ago

  • 1
Photo of Mike Dwyer

Mike Dwyer, Champion

  • 3,790 Points 3k badge 2x thumb
Is the javascript hanging? Any developer console error messages? Can you compare the results of console.log(arguments); between Spark and Millau?
Photo of Glenn Daly

Glenn Daly

  • 1,392 Points 1k badge 2x thumb
Hi Mike, thanks for getting back to me. I've attached a couple of screenshots which may help. If not, are you able to point me in the right direction as to what I should be looking for?

Salesforce developer console alongisde skuid page in spark, no errors



Browser developer console when saving in spark, again no errors from what I can see.


Photo of Rob Hatch

Rob Hatch, Official Rep

  • 44,148 Points 20k badge 2x thumb
Here is the block of xml you have to study: 

<buttons>
                <button type="multi" label="Save &amp; Close" uniqueid="sk-1BoZDZ-81">
                    <actions>
                        <action type="blockUI" message="Saving..."/>
                        <action type="save">
                            <models>
                                <model>Task</model>
                                <model>TaskRelation</model>
                            </models>
                            <onerroractions>
                                <action type="unblockUI" message="There was an error" timeout="3000"/>
                            </onerroractions>
                        </action>
                        <action type="requeryModel" model="Task" behavior="standard"/>
                        <action type="closeAllPopups"/>
                        <action type="custom" snippet="PageRefresh"/>
                        <action type="unblockUI"/>
                    </actions>


You already have "on error actions" on the save action.  So it looks like that is working.  Can you tell if the task records are getting created?  Next start adding "on error actions" to the subsequent action steps.  They should be available on the Requery and on the Snippet actions.  
Photo of Glenn Daly

Glenn Daly

  • 1,392 Points 1k badge 2x thumb
Thanks Rob, the task records are being created.

Below is a screenshot of the on error actions I've added. If I now go ahead and try to create a task nothing different happens, the page hangs saying "Saving..." no error message is produced.

Photo of Mike Dwyer

Mike Dwyer, Champion

  • 3,790 Points 3k badge 2x thumb
Glenn, sorry for the long delay. Also, I had misread the javascript tag and thought the "PageRefresh" snippet was including code that I now see as the "relatedToRenderer" snippet.

But, I also notice that the onerroraction highlighted by Rob is an unblockUI. This action type would not display the "There was an error" message. For grins, remove the "un" from the xml, or in the composer, delete and recreate the onerror action. That doesn't look like a problem that would hang the action script, however.

The next thing I would try it to change the blockUI action to expire after 1 second, or even remove the action entirely for the time being. See if other errors are displayed without the block on the UI.

Following that, add a console.log("Got Here"); statement to the PageRefresh javascript. I'm not sure if it would make sense to add a second console.log() after the location.reload(), but that might show something. You could also execute the location.reload() statement right from the browser console.

Actually, I'm wondering about the sequence of actions: If you block the ui, then do a location.reload(), and then unblock the UI, does the unblock execute? Should you reverse those actions? Of course, one also wonders why that would be a problem in Spark but not Millau. But different architecture: in Millau, the javascript may actually execute after the unblockUI action.