Skip to main content

Custom Components & Pages

note

This page covers the code side of External Objects — patterns and implementation examples. For configuration (object creation, fields, rights), see External Objects.

Introduction​

External Objects are implemented through three resources (HTML, STYLES, CLASS) and an optional Java class. This page provides code patterns for the two main scenarios:

Embedded components​

CLASS resource structure​

Simplicite.UI.ExternalObjects.MyComponent = class extends Simplicite.UI.ExternalObject {
async render(params, data = {}) {
const $content = this.ctn;
$content.html('<p>Hello World</p>');
}
};

Accessing Business Objects​

async render(params, data = {}) {
const product = $app.getBusinessObject('DemoProduct');
product.search().then(rows => {
const list = $('<ul>');
for (const row of rows) {
list.append($('<li>').text(row.demoPrdName));
}
this.ctn.append(list);
});
}

Getting the current user​

const grant = $ui.getGrant();
const login = grant.login;

Displaying native UI elements​

// Open a record's form in the WORK area
$ui.displayForm(null, 'DemoProduct', rowId, {
nav: 'add',
target: 'work'
});

Using standard widgets​

To use a predefined Simplicité widget, set the Class field on the External Object to the appropriate widget class and configure it via the Settings field. No CLASS resource code is needed in this case.

See Standard Widgets for available widget classes and their expected JSON configuration.

Standalone pages​

Standalone pages (Web Page nature) require a Java class as the backend entry point.

Java class​

package com.simplicite.extobjects.MyModule;

import com.simplicite.util.*;
import com.simplicite.util.tools.*;
import com.simplicite.webapp.web.BootstrapWebPage;

public class MyWebPage extends com.simplicite.webapp.web.WebPageExternalObject {
private static final long serialVersionUID = 1L;

@Override
public Object display(Parameters params) {
try {
BootstrapWebPage wp = new BootstrapWebPage(params.getRoot(), getDisplay());

wp.appendJSInclude(HTMLTool.getResourceJSURL(this, "CLASS"));
wp.appendCSSInclude(HTMLTool.getResourceCSSURL(this, "STYLES"));
wp.appendHTML(HTMLTool.getResourceHTMLContent(this, "HTML"));

wp.setReady(getName() + ".render(" + params.toJSONObject() + ");");
return wp.toString();
} catch (Exception e) {
AppLog.error(null, e, getGrant());
return e.getMessage();
}
}
}

Passing server-side data to the front-end​

JSONObject p = params.toJSONObject();
p.put("imageUrl", HTMLTool.getResourceImageURL(this, "MY_IMAGE"));
wp.setReady(getName() + ".render(" + p.toString() + ");");
async render(params) {
const imageUrl = params.imageUrl;
this.ctn.append($('<img>').attr('src', imageUrl));
}

Enabling frameworks​

BootstrapWebPage provides convenience methods for loading common libraries:

FrameworkMethod
Vue.jswp.appendVue()
Mustachewp.appendMustache()
jQuerywp.appendJQuery()
Chart.jswp.appendChartjs()
Moment.jswp.appendMoment()

Vue.js example​

var MyPage = MyPage || (() => {
function render(params) {
const app = typeof $ui !== 'undefined'
? $app
: new Simplicite.Ajax(params.root, 'uipublic');

Vue.createApp({
data() { return { products: [] }; },
mounted() {
app.getBusinessObject('DemoProduct').search().then(rows => {
this.products = rows;
});
}
}).mount('#mypage');
}
return { render };
})();

Access control​

Standalone pages can be configured for authenticated users or for unauthenticated access depending on their intended audience. The access model is governed by rights configuration on the External Object.

For public-facing pages (no login required), specific grant configuration is needed. See External Objects — Access & Rights.

Deprecated patterns​

danger

The following patterns come from older platform versions. Do not use them in new projects.

V5 — namespace pattern (replaced by class syntax)

var CustomComponent = CustomComponent || (function($) {
function render(url) { /* ... */ }
return { render: render };
})(jQuery);

Old Ajax instantiation (replaced by WebPageExternalObject and the in-platform global objects)

app = new Simplicite.Ajax("", "uipublic");

Old base class for web pages (replaced by WebPageExternalObject)

public class MyPage extends ExternalObject { ... }