Custom Component componentRenderer example for builders.js?

  • 1
  • Question
  • Updated 3 years ago
  • Answered
Does anyone have one?

Do I build it with xml the same way that I do for rendering the component in runtime?
Photo of Matt Sones

Matt Sones, Champion

  • 31,478 Points 20k badge 2x thumb

Posted 4 years ago

  • 1
Photo of Matt Sones

Matt Sones, Champion

  • 31,478 Points 20k badge 2x thumb
Is there a similar function to skuid.component.factory() that renders builder-side versions?

I've resported to something almost completely static for now:

componentRenderer : function (component) {            // Set title
            component.setTitle(component.builder.name);
            // Shortcuts
            var state = component.state;
            // Load script model
            var scriptModelId = state.attr('scriptmodel');
            // skuid.model.Model(scriptModelId).initialize().register().load();
            // Build containers and contents
            var helpContainer = $('<div>').html('The Script Component expects a model on the Script__c sObject with a single row. ' 
                + 'Create a condition on the model using the Name or Assing_Code__c field.<br/>');
            var scriptContainer = $('<div>').html('<div class="nx-pagebuilder-component-body"><div class="nx-basicfieldeditor-section-wrapper"><div class="nx-basicfieldeditor-section"><div class="nx-basicfieldeditor-section-body"><div class="nx-pagebuilder-acceptor" style="border: 0px solid white;"><div class="nx-pagebuilder-component nx-pagebuilder-component-hidewrapper ui-draggable ui-draggable-handle nx-pagebuilder-field" '
                +'data-model="' + scriptModelId
                + '" style="background: inherit;"><div class="nx-pagebuilder-component-header"><div class="nx-pagebuilder-component-actionbar"><div class="nx-pagebuilder-component-actionitem"><div class="nx-pagebuilder-component-actionicon sk-icon sk-icon-delete"></div><div class="nx-pagebuilder-component-actionspacer"></div></div></div><span></span></div><div class="nx-pagebuilder-component-body nx-basicfieldeditor-item" style="border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(242, 242, 242); padding: 0px 8px; overflow: hidden; background: inherit;"><div class="nx-basicfieldeditor-item-label nx-layout-above">'
                + component.builder.name
                + '</div><div class="nx-field nx-layout-above"><div class="nx-fieldtext">'
                + 'RICHTEXT'
                + '</div></div></div></div></div></div></div></div></div>'
                );
            
            // Add contents to DOM
            component.body.append(helpContainer,scriptContainer); 
        },
Photo of Zach McElrath

Zach McElrath, Employee

  • 49,056 Points 20k badge 2x thumb
You can construct your componentRenderer using the actual Component's rendering logic, as long as you have requested that the Runtime JS logic gets loaded in the Builder via your Builders Manifest file (which it does NOT by default) --- e.g. if you have MyComponentBuilderJS and MyComponentJS, you would need to load both files in the Builders Manifest file's JS Resources list in order to use skuid.component.factory() in the Builder environment the way you're thinking.

So assuming that your Runtime JS is loaded in the builder, you could do something like this to have a live preview, BUT live previews are very often NOT ideal. However... here is a super-basic idea of what it would look like to do this:

componentRenderer : function (component) {            
   component.setTitle(component.builder.name);
   component.body.append(skuid.component.factory({ xmlDefinition: component.state }));
}
(Edited)
Photo of Matt Sones

Matt Sones, Champion

  • 31,478 Points 20k badge 2x thumb
Makes sense. Thanks, Zach!