The App Store is the in-editor application picker that lets content editors insert applications into pages. Registering your application makes it appear in this list with a name, icon, description, and configurable parameters.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/webjetcms/webjetcms/llms.txt
Use this file to discover all available pages before exploring further.
What the App Store is
When a content editor opens the page editor and inserts an application, they see a searchable grid of registered applications. Each entry shows an icon, a name, and a short description. Clicking an entry opens a property dialog where the editor can configure the application before it is embedded as an!INCLUDE()! tag in the page.
Registering a custom application
Add the@WebjetAppStore annotation to your component class alongside @WebjetComponent:
Annotation parameters
| Parameter | Description |
|---|---|
nameKey | Translation key (or direct text) for the application name shown in the App Store list. |
descKey | Translation key for the application description. Defaults to nameKey.desc (or replaces .title with .desc if nameKey ends in .title). |
itemKey | Unique identifier for access rights management, e.g. cmp_contact. |
variant | Application variant identifier. Use when multiple apps share the same itemKey. |
imagePath | Path to an icon image, or a Tabler Icons CSS class such as ti ti-id. See tabler.io/icons. |
galleryImages | Comma-separated list of screenshot paths shown in the app description dialog. |
componentPath | For legacy JSP applications: path(s) to the JSP file(s), e.g. /components/gallery/gallery.jsp. The first path is used when a new instance is inserted. |
domainName | Restrict the app to specific domains in multi-domain installations (comma-separated). |
commonSettings | Set to false to hide the View tab (device visibility settings) in the editor. Default is true. |
custom | Set to true for customer applications. They appear at the top of the App Store list. |
customHtml | Path to an HTML file with additional JavaScript executed in the editor when editing this app’s properties. |
Package scanning
WebJET scans the following packages for@WebjetAppStore annotations:
sk.iway.iwcm— standard WebJET applications (appear at the end of the list)sk.iway.INSTALL_NAME— customer applications (appear at the top of the list)sk.iway.LOG_INSTALL_NAME— applications by log install name- Packages listed in the
springAddPackagesconfiguration variable
appstorePromo configuration variable.
Application parameters dialog
Each field declared in the component class and annotated with@DataTableColumn becomes an editable field in the application’s property dialog. This works identically to DataTable editor columns.
!INCLUDE()! tag and re-injected into the class fields when the page renders.
Supported field types
TheDataTableColumnType enum provides the full range of input types available in the DataTable editor, including TEXT, CHECKBOX, TEXT_NUMBER, SELECT, DATETIME, JSON (for page/folder pickers), and IFRAME (for embedding an admin sub-page as a tab).
Organizing fields into tabs
Use@DataTableTabs at the class level and the tab attribute on each @DataTableColumn to group fields into named tabs:
Setting selection field options dynamically
To populate aSELECT field from a static method:
getAppOptions():
Data initialization before the editor opens
OverrideinitAppEditor() to execute code when the editor dialog is opened, for example to set default values based on the current page:
Conditional display settings
Device visibility
The View tab in the property dialog lets editors restrict the application to specific device types. The underlying mechanism is thedevice parameter in the !INCLUDE()! tag.
Detection is server-side using the User-Agent header:
| Device type | Detected when User-Agent contains |
|---|---|
phone | iphone, or mobile together with android |
tablet | ipad, tablet, kindle, or android without mobile |
pc | None of the above |
phone+tablet. An empty value displays the app on all devices.
Test device detection by appending ?forceBrowserDetector=phone (or tablet, pc) to any page URL.
Logged-in user visibility
The View tab also controls visibility based on login status via theshowForLoggedUser parameter:
| Value | Behavior |
|---|---|
| (empty) | Always displayed |
onlyLogged | Displayed only to logged-in users |
onlyNotLogged | Displayed only to users who are not logged in |
Buffer time
The Buffer time (minutes) setting caches the rendered HTML output of the application in memory. The cache is bypassed when:- the current user is an administrator (unless
cacheStaticContentForAdmin=true) - the
cacheMinutesvalue is less than 1 - the URL contains a
pageparameter with a value other than 1 - the URL contains
_disableCache=true
Additional HTML code in the editor
For advanced editor customization, setcustomHtml in @WebjetAppStore to point to an HTML file containing JavaScript hooks:
The FormProcessorInterface for form-handling apps
Multi-step forms support a Java class as a form processor. This allows custom validation, interception between steps, and custom save logic.Creating a form processor
Create a Spring component that implementsFormProcessorInterface:
FormSettingsService collects all registered processors.
Interface methods
FormProcessorInterface defines three methods:
validateStep
validateStep
Called during step validation, before saving. Perform any step-specific validation here. Return validation errors to prevent the form from advancing to the next step.
runStepInterceptor
runStepInterceptor
Called after step validation passes but before the step data is saved. Use this to execute side effects between steps — for example, sending a verification email or SMS with a code required in the next step.
handleFormSave
handleFormSave
Called when the entire multi-step form is submitted for final saving. Returns a
boolean: if true, the standard WebJET form saving is also executed; if false, only your custom save logic runs. Use this to integrate with external systems such as a CRM.FormProcessorInterface.java.