Page Include Input Parameters as Query Strings Params aren't Accessible or Easily Managed

Pat VachonPat Vachon ✭✭
edited June 25 in Ideas
I have page includes that I use everywhere that I'd like to conditionally render certain things based on the query string. ie. table columns, row actions, mass action, global actions.

In my use case, I have accounting journal entries that are related to one of many types of accounting records. Each of which I typically display these entries in varying ways.

I can also do the model hack, but it really isn't intuitive. Unless I could create one UI only model with a series of UI only checkbox field for each element on the page I'd like to conditionally render.

Better yet, it would be great to be able to set to page input parameters on the page. Then when setting up the Page Include component, a tab dedicated to page input parameter parameters could be set. Much cleaner UX. :D

I would also use with Task and Event page includes.
6
6 votes

Under Consideration · Last Updated

Comments

  • Mark DeSimoneMark DeSimone 🛠️ 
    edited June 25
    Hi Pat, if you are after a way to bring page parameters into the page to make them more accessible, I may have an example of how to accomplish that. The XML below has a UI-Only model with formula fields that are pulling the page params in. 

    If you test this page out, test it with a URL that ends with this:
    /apex/skuid__ui?page=UI-Model-From-Params&id=0015C000004dSefQAE&industry=Government&ownername=Pat%20Vachan&accountname=YoYos%20INC

    and the preview should grab those params and display them in a field editor. 

    From there, of course, you can easily grab those values and do with them whatever you would normally with field values. 
    <skuidpage unsavedchangeswarning="yes" personalizationmode="server" showsidebar="true" useviewportmeta="true" showheader="true">    <models>
            <model id="URL-Params" query="true" createrowifnonefound="true" datasource="Ui-Only" processonclient="true">
                <fields>
                    <field id="Account ID" displaytype="FORMULA" label="Account ID" ogdisplaytype="TEXT" readonly="true" returntype="TEXT" defaultvaluetype="fieldvalue">
                        <formula>{{$Param.id}}</formula>
                    </field>
                    <field id="Industry" displaytype="FORMULA" label="Industry" ogdisplaytype="TEXT" readonly="true" returntype="TEXT">
                        <formula>{{$Param.industry}}</formula>
                    </field>
                    <field id="Account Name" displaytype="FORMULA" label="Account Name" ogdisplaytype="TEXT" readonly="true" returntype="TEXT">
                        <formula>{{$Param.accountname}}</formula>
                    </field>
                    <field id="Owner ID" displaytype="FORMULA" label="Owner ID" ogdisplaytype="TEXT" readonly="true" returntype="TEXT" datasource="salesforce" rel="owner.id" keyfield="id">
                        <batchfields/>
                        <formula>{{$Param.ownername}}</formula>
                    </field>
                </fields>
                <conditions/>
                <actions/>
            </model>
        </models>
        <components>
            <basicfieldeditor showheader="true" showsavecancel="true" showerrorsinline="true" model="URL-Params" buttonposition="" uniqueid="sk-3Teqr7-489" mode="read">
                <columns>
                    <column width="50%">
                        <sections>
                            <section title="Section A" collapsible="no">
                                <fields>
                                    <field id="Account Name" valuehalign="" type=""/>
                                    <field id="Industry"/>
                                </fields>
                            </section>
                        </sections>
                    </column>
                    <column width="50%">
                        <sections>
                            <section title="Section B" collapsible="no">
                                <fields>
                                    <field id="Account ID" valuehalign="" type=""/>
                                    <field id="Owner ID" valuehalign="" type=""/>
                                </fields>
                            </section>
                        </sections>
                    </column>
                </columns>
            </basicfieldeditor>
        </components>
        <resources>
            <labels/>
            <javascript/>
            <css/>
        </resources>
        <styles>
            <styleitem type="background" bgtype="none"/>
        </styles>
    </skuidpage>
  • Pat VachonPat Vachon ✭✭
    edited March 2017
    Hi Mark,

    Page URL parameters I can work with easily. It's the Page Include Query String Parameters that I can't access.

    image
  • Mark DeSimoneMark DeSimone 🛠️ 
    edited March 2017
    To help me understand: Can you access those query string params from within the page include? It should be possible to do so. Trying to access the page include's query string params from its parent page would present problems though. Is that more aligned with what you're suggesting? It sounds like you've already done some good brainstorming on methods that are currently possible. 
  • Pat VachonPat Vachon ✭✭
    edited March 2017
    Yes. This is what I'm trying to accomplish. Better yet would be Skuid Page input parameters set on the page itself so I can conditionally to my hearts content based on names variables. ie. dispagePageTitle, displayRowActions, displayWhatId, etc
  • Pat VachonPat Vachon ✭✭
    edited June 25
    K. I'm really thinking more votes are needed on this. Think of the number of pages that can be created to be a building block in any place. This would significantly reduce the number of pages required to maintain.

    Detail Pages (ie. Tasks, Events, Contacts,)
    • as a view detail page
    • as a view detail page in a popup or panel
    • as a new record page
    • as a new record page in a popup or panel
    Tab Pages (any object where it's records are displayed in a tab on a detail page) (ie. Opps, Contact, Cases, Tasks, Events, etc)
    • as a tab page
    • as a subtab in a detail page
    Page Variables
    • displayPageTitle
    • displayWhatId
    • displayWhoId
    • displayColumnXYZ
    • displayButtonXYZ
    • displayComponentXYZ
    • anything that can be conditionally rendered
  • Pat VachonPat Vachon ✭✭
    edited June 25
    This is what I want but without having to add the following to enable:
    • Model w/ one condition and a UI only field for each input
    • Snippet



  • Pat VachonPat Vachon ✭✭
    edited June 25
    Here's the test XML page for it.
    <skuidpage unsavedchangeswarning="yes" personalizationmode="server" showsidebar="true" useviewportmeta="true" showheader="true">      <models>          <model id="contactPageVariables" limit="1" query="false" createrowifnonefound="true" datasource="salesforce" type="" sobject="Contact" doclone="" unloadwarningifunsavedchanges="false">              <fields>                  <field id="displayPageTitle" uionly="true" displaytype="BOOLEAN" label="displayPageTitle" ogdisplaytype="TEXT" defaultvaluetype="fieldvalue" defaultValue="true"/>                  <field id="displayAccount" uionly="true" displaytype="BOOLEAN" label="displayAccount" defaultvaluetype="fieldvalue" ogdisplaytype="TEXT" defaultValue="true"/>              </fields>              <conditions logic="">                  <condition type="param" value="contactPageVariables" field="AssistantName" operator="=" enclosevalueinquotes="true" novaluebehavior="noquery"/>              </conditions>              <actions/>          </model>          <model id="ContactDetail" limit="20" query="true" createrowifnonefound="false" datasource="salesforce" type="" sobject="Contact">              <fields>                  <field id="FirstName"/>                  <field id="LastName"/>                  <field id="AccountId"/>                  <field id="Account.Name"/>              </fields>              <conditions>                  <condition type="param" value="id" field="Id" operator="=" enclosevalueinquotes="true" novaluebehavior="noquery"/>              </conditions>              <actions/>          </model>      </models>      <components>          <pagetitle model="ContactDetail" uniqueid="sk-3YPd6U-160">              <maintitle>                  <template>{{Name}}</template>              </maintitle>              <subtitle>                  <template>{{Model.label}}</template>              </subtitle>              <actions>                  <action type="savecancel" label="New Button">                      <renderconditions logictype="and"/>                      <enableconditions/>                  </action>              </actions>              <renderconditions logictype="and">                  <rendercondition type="fieldvalue" operator="=" enclosevalueinquotes="false" fieldmodel="contactPageVariables" sourcetype="fieldvalue" nosourcerowbehavior="deactivate" field="displayPageTitle" value="true"/>              </renderconditions>          </pagetitle>          <basicfieldeditor showheader="true" showsavecancel="false" showerrorsinline="true" model="ContactDetail" buttonposition="" uniqueid="sk-3YPbRJ-150" mode="read">              <columns>                  <column width="100%">                      <sections>                          <section title="Section A" collapsible="no" showheader="false">                              <fields>                                  <field id="FirstName" valuehalign="" type=""/>                                  <field id="LastName"/>                                  <field id="AccountId" valuehalign="" type="">                                      <renderconditions logictype="and" onhidedatabehavior="keep">                                          <rendercondition type="fieldvalue" operator="=" enclosevalueinquotes="false" fieldmodel="contactPageVariables" sourcetype="fieldvalue" nosourcerowbehavior="deactivate" field="displayAccount" value="true"/>                                      </renderconditions>                                      <enableconditions/>                                  </field>                              </fields>                          </section>                      </sections>                  </column>              </columns>              <renderconditions logictype="and"/>          </basicfieldeditor>      </components>      <resources>          <labels/>          <javascript>              <jsitem location="inline" name="onPageLoad" cachelocation="false" url="">(function(skuid){   var $ = skuid.$;   $(document.body).one('pageload',function(){        var snip = skuid.snippet.getSnippet('processcontactPageVariables');                    snip('contactPageVariables');   });  })(skuid);</jsitem>              <jsitem location="inlinesnippet" name="processcontactPageVariables" cachelocation="false">var modelName = arguments[0],   model = skuid.$M(modelName),   inputParameters = model.conditions[0].value,   inputArray = inputParameters.split(','),   inputName,   inputValue,   inputPair = [],   $ = skuid.$;      $.each(inputArray, function (i, input){       inputPair = input.split(':'),       fieldName = inputPair[0];       fieldValue = inputPair[1];       model.updateRow(model.getFirstRow(),fieldName,fieldValue);   });</jsitem>          </javascript>          <css/>      </resources>      <styles>          <styleitem type="background" bgtype="none"/>      </styles>  </skuidpage>  
  • Mark DeSimoneMark DeSimone 🛠️ 
    edited February 4
    Pat, this certainly sounds useful to me. In my original post, I was hoping I had a solution ready to go for you. Alas, it wasn't true; however, I'm glad (but not surprised) that you've found one approach to get this working. Thank you for sharing the idea and the approaches you've taken so far!
  • edited March 2017
    At the 2:30min mark - I really like your suggestion of being able to conditionally set the Default Mode of a Field Editor or Table component!

    As you say, it would help greatly in reducing the number of pages one would need to manage. Because you could use the same page include for both a New Record Popup and Detail Page Popup. +1
  • Barry SchnellBarry Schnell 💎💎
    edited June 25
    Like the ideas here Pat!  Not sure why you comma-delimited the param list instead of just having explicitly param=value combo for each but the intent is clear.  Really need a way to declaratively handle param pages in a more intuitive manner - both on "main" pages and definitely on "include" pages.
  • Pat VachonPat Vachon ✭✭
    edited April 2017
    I setup one condition on a model so that I can use one snippet to set values on UI only fields in the same model for page input variables. Janky, but it works well. Use the comma the comma to split and update the values accordingly.

    inline js on page
    (function(skuid){  var $ = skuid.$;  $(document.body).one('pageload',function(){      var snip = skuid.snippet.getSnippet('processInputVariables');                   // model name for input         snip('caseTabPageVariables');  }); })(skuid);
    snippet on master
    var modelName = arguments[0],  model = skuid.$M(modelName),  inputParameters = model.conditions[0].value,  inputArray = inputParameters.split(','),  inputName,  inputValue,  inputPair = [],  $ = skuid.$;    $.each(inputArray, function (i, input){      inputPair = input.split(':'),      fieldName = inputPair[0];      fieldValue = inputPair[1];      model.updateRow(model.getFirstRow(),fieldName,fieldValue);  });
  • Barry SchnellBarry Schnell 💎💎
    edited April 2017
    Ah, I see why you used comma delimited now :)  One note - I haven't tested myself to be sure but you'll want to be careful to ensure that Skuid properly encodes the url string passed in to the page include.  I'm assuming they do but if you have param values with spaces, special characters (e.g. & sign, etc.) these need to be url encoded to function properly.  Again, I'm assuming Skuid does this but just something to test to avoid unexpected behavior.
  • Pat VachonPat Vachon ✭✭
    edited April 2017
    Yup. Tested. Working and implemented in almost all page includes. Skuid ought to have this feature though.
  • Barry SchnellBarry Schnell 💎💎
    edited April 2017
    Agreed that there should be a stock feature in place that makes passing/handling page params simpler.

    I just tested url encoding and it does not look like Skuid properly encodes all special characters in query strings.  See the issue I just posted here.  For now, you must use {{#urlEncode}}...{{/urlEncode}} around the querystring or at the very least, individual parameter values.
  • Pat VachonPat Vachon ✭✭
    edited April 2017
    Got it. Thanks for this.
  • Barry SchnellBarry Schnell 💎💎
    edited April 2017
    Np!
Sign In or Register to comment.