Skip to main content

Preset Ext

General​

This extension provides ability to create preseted widgets in the composer. The main idea is to create a number of widget options with preconfigured settings. It could be usefull when you want to free a user from the setup commonly used widget configuration.

Backend part​

By default, there is no BE part for this ext. But you can create it. If you don't want to store preset configs on client.

Configuration​

Inside BFF project create ext file with ext configuration

const localDevExtHost = `http://localhost:${process.env.PORT}`;
const extHost = process.env.MY_HOST
? `${process.env.MY_HOST}:1337`
: localDevExtHost;

export const presetExt = {
id: 123,
name: "@invent/preset-{CUSROMER_SLUG}-companion-ext",
extHost,
version: "{VERSION}",
module: "./Preset{CustomerSlug}Ext",
scope: "preset_{customer_slug}_ext",
useSharedExts: false,
dependencies: [],
companion: "{EXT_STATIC_FILES_HOST}/remoteEntry.js",
pathList: [],
author: "{AUTHOR_NAME}",
};

Example

  • Register of letters are important
const localDevExtHost = `http://localhost:${process.env.PORT}`;
const extHost = process.env.MY_HOST
? `${process.env.MY_HOST}:1337`
: localDevExtHost;

export const presetExt = {
id: 111,
name: "@invent/preset-invent-companion-ext",
extHost,
version: "0.0.1",
module: "./PresetInventExt",
scope: "preset_invent_ext",
useSharedExts: false,
dependencies: [],
companion:
"https://inventwidgetextensions.z19.web.core.windows.net/111/remoteEntry.js", // 111 - stands for gitlab-repo-id
pathList: [],
author: "Invent",
};

Init & expose​

import { presetExt } from './src/extentions/preset-extention';

....
app.use(
validateRequestTokenMiddlewareFabric([
'/images',
'/templates/assets/fonts',
'/theme',
'/theme/my-default-theme',
'/tenent',
])
);
overrideRoutes();
let extentions = [presetExt];
exposeExtensions(extentions);
endpointConfig.forEach((domain) => hydrate(app, domain));

Exposed extensions in this example​

[
{
"id": 111,
"author": "Invent",
"companion": "https://inventwidgetextensions.z19.web.core.windows.net/111/remoteEntry.js",
"dependencies": [],
"extHost": "https://fe-be.dev.clic.apptrium.cloud:1337",
"module": "./PresetInventExt",
"name": "@invent/preset-invent-companion-ext",
"pathList": [],
"scope": "preset_invent_ext",
"useSharedExts": false,
"version": "0.0.1"
}
]

Companion​

Ext companion works automaticly inside composer menu and should implement two methods.

  • Main class
import { presets } from "./presets";
import type { KnownPresetsT } from "./presets";
export default class PresetInventExt {
presetsByWidgetName = (widgetTypeName: KnownPresetsT): unknown[] => {
if (presets.has(widgetTypeName)) {
return presets.get(widgetTypeName) as unknown[];
}
return [];
};
knownPresets = (): string[] => {
return Array.from(presets.keys());
};
}
  • Preset dict
export type KnownPresetsT = "{CUSTOMER_SLUG}_WidgetName";
export const presets = new Map<KnownPresetsT, unknown>([
["{CUSTOMER_SLUG}_WidgetName", widgetConfig],
]);
  • Example
import { grid } from "./grid";
export type KnownPresetsT = "INVENT_Datagrid";
export const presets = new Map<KnownPresetsT, unknown>([
["INVENT_Datagrid", datagrid],
]);
  • Widget preset configuration
export const gridAccounts = {
name: "INVENT_Datagrid",
_id: "72a1ab32-adce-4492-a726-dd2c341f470d",
repoId: 999,
isPreset: true,
widgetDetails: {
description: "Datagrid widget preconfigured for accounts",
title: "Accounts Datagrid",
type: "Datagrid",
},
layout: {
minW: 16,
minH: 12,
},
type: "INVENT_Datagrid",
props: {
fromExternalProps: true,
avoidLoadData: "",
selectable: true,
singleTotalAtBottom: "",
title: "Accounts List View",
apiUrl: API_BASE_URL,
searchSettingsPanelUrl: "accounts/search-settings-panel",
searchPanelUrl: "accounts/search-panel",
searchUrl: "accounts/search",
singleTotalKeys: "totalAccountValue",
singleTotalTitles: "Total Accounts",
linkedColumn: "id",
dashboardRedirectUrl: "/dashboard/account-details?accountId={id}",
type: "accounts",
preferenceKey: 100,
actionBarWidgetId: "777",
subcomponentWidgetId: "",
subgridSearchUrl: "",
subgridSearchSettingsPanelUrl: "",
subgridQueryProp: "",
},
};
export const grid = [gridAccounts];

Tweaks​

As you can see from the widget preset config section, you can use global variables like API_BASE_URL. You can find more info in env-vars section. This approach could give you the ability to use env based URL in a different deploy.