diff --git a/server/src/controllers/apps.controller.v2.ts b/server/src/controllers/apps.controller.v2.ts
index 6ce6650776..a3fa3a39c9 100644
--- a/server/src/controllers/apps.controller.v2.ts
+++ b/server/src/controllers/apps.controller.v2.ts
@@ -35,6 +35,7 @@ import { CreateEventHandlerDto, UpdateEventHandlerDto } from '@dto/event-handler
import { APP_RESOURCE_ACTIONS } from 'src/constants/global.constant';
import { VersionReleaseDto } from '@dto/version-release.dto';
import { AppsServiceSep } from '@apps/services/apps.service.sep';
+import { mergeDefaultComponentData } from 'src/helpers/components.helper';
@Controller({
path: 'apps',
@@ -93,7 +94,7 @@ export class AppsControllerV2 {
response['data_queries'] = seralizedQueries;
response['definition'] = app.editingVersion?.definition;
- response['pages'] = pagesForVersion;
+ response['pages'] = mergeDefaultComponentData(pagesForVersion);
response['events'] = eventsForVersion;
//! if editing version exists, camelize the definition
@@ -148,7 +149,7 @@ export class AppsControllerV2 {
name: app.name,
slug: app.slug,
events: eventsForVersion,
- pages: pagesForVersion,
+ pages: mergeDefaultComponentData(pagesForVersion),
homePageId: versionToLoad.homePageId,
globalSettings: { ...versionToLoad.globalSettings, theme: appTheme },
showViewerNavigation: versionToLoad.showViewerNavigation,
@@ -198,7 +199,7 @@ export class AppsControllerV2 {
return {
...appData,
editing_version: editingVersion,
- pages: pagesForVersion,
+ pages: mergeDefaultComponentData(pagesForVersion),
events: eventsForVersion,
};
}
diff --git a/server/src/helpers/components.helper.ts b/server/src/helpers/components.helper.ts
index e562659c1a..9d7855d0df 100644
--- a/server/src/helpers/components.helper.ts
+++ b/server/src/helpers/components.helper.ts
@@ -1,3 +1,9 @@
+import { cloneDeep } from 'lodash';
+import { merge } from 'lodash';
+import { mergeWith } from 'lodash';
+import { isArray } from 'lodash';
+import { componentTypes } from './widget-config';
+
export enum LayoutDimensionUnits {
COUNT = 'count',
PERCENT = 'percent',
@@ -8,3 +14,58 @@ export const resolveGridPositionForComponent = (dimension: number, type: string)
const numberOfGrids = 43;
return Math.round((dimension * numberOfGrids) / 100);
};
+
+export const mergeDefaultComponentData = (pages) => {
+ return pages.map((page) => ({
+ ...page,
+ components: buildComponentMetaDefinition(page.components),
+ }));
+};
+
+export const buildComponentMetaDefinition = (components = {}) => {
+ for (const componentId in components) {
+ const currentComponentData = components[componentId];
+
+ const componentMeta = cloneDeep(
+ componentTypes.find((comp) => currentComponentData.component.component === comp.component)
+ );
+
+ const mergedDefinition = {
+ // ...componentMeta.definition,
+ properties: mergeWith(
+ componentMeta.definition.properties,
+ currentComponentData?.component?.definition?.properties,
+ (objValue, srcValue) => {
+ if (currentComponentData?.component?.component === 'Table' && isArray(objValue)) {
+ return srcValue;
+ }
+ }
+ ),
+ styles: merge(componentMeta.definition.styles, currentComponentData?.component.definition.styles),
+ generalStyles: merge(
+ componentMeta.definition.generalStyles,
+ currentComponentData?.component.definition.generalStyles
+ ),
+ validation: merge(componentMeta.definition.validation, currentComponentData?.component.definition.validation),
+ others: merge(componentMeta.definition.others, currentComponentData?.component.definition.others),
+ general: merge(componentMeta.definition.general, currentComponentData?.component.definition.general),
+ };
+
+ const mergedComponent = {
+ component: {
+ ...componentMeta,
+ ...currentComponentData.component,
+ },
+ layouts: {
+ ...currentComponentData.layouts,
+ },
+ withDefaultChildren: componentMeta.withDefaultChildren ?? false,
+ };
+
+ mergedComponent.component.definition = mergedDefinition;
+
+ components[componentId] = mergedComponent;
+ }
+
+ return components;
+};
diff --git a/server/src/helpers/widget-config/boundedBox.js b/server/src/helpers/widget-config/boundedBox.js
new file mode 100644
index 0000000000..926cf5bf8d
--- /dev/null
+++ b/server/src/helpers/widget-config/boundedBox.js
@@ -0,0 +1,121 @@
+export const boundedBoxConfig = {
+ name: 'BoundedBox',
+ displayName: 'Bounded Box',
+ description: 'An infinitely customizable image annotation widget',
+ component: 'BoundedBox',
+ defaultSize: {
+ width: 30,
+ height: 420,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ imageUrl: {
+ type: 'code',
+ displayName: 'Image URL',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: `https://exaple.com/photos/three-cars.jpg`,
+ },
+ },
+
+ defaultValue: {
+ type: 'code',
+ displayName: 'Default value',
+ validation: {
+ schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'array', element: { type: 'object' } }] },
+ defaultValue: "{{[{type: 'RECTANGLE',width: 40,height:24, x:41,y:62,text:'Car'}]}}",
+ },
+ },
+ selector: {
+ type: 'select',
+ displayName: 'Selector',
+ options: [
+ { name: 'Rectangle', value: 'RECTANGLE' },
+ { name: 'Point', value: 'POINT' },
+ ],
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'RECTANGLE',
+ },
+ },
+ labels: {
+ type: 'code',
+ displayName: 'List of labels',
+ validation: {
+ schema: { type: 'array' },
+ element: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] },
+ defaultValue: `{{['Car', 'Tree']}}`,
+ },
+ },
+ },
+ events: {
+ onChange: { displayName: 'On change' },
+ },
+ styles: {
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ },
+ exposedVariables: {
+ annotations: [
+ {
+ type: 'RECTANGLE',
+ x: 41,
+ y: 62,
+ width: 40,
+ height: 24,
+ text: 'Car',
+ id: 'ce103db2-b2a6-46f5-a4f0-5f4eaa6f3663',
+ },
+ {
+ type: 'RECTANGLE',
+ x: 41,
+ y: 12,
+ width: 40,
+ height: 24,
+ text: 'Tree',
+ id: 'b1a7315e-2b15-4bc8-a1c6-a042dab44f27',
+ },
+ ],
+ },
+ actions: [],
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ defaultValue: {
+ value:
+ "{{[\t{type: 'RECTANGLE',width: 40,height:24, x:41,y:62,text:'Car'},{type: 'RECTANGLE',width: 40,height:24, x:41,y:12,text:'Tree'}\t]}}",
+ },
+ imageUrl: {
+ value: `https://burst.shopifycdn.com/photos/three-cars-are-parked-on-stone-paved-street.jpg?width=746&format=pjpg&exif=1&iptc=1`,
+ },
+ selector: { value: `RECTANGLE` },
+ labels: { value: `{{['Tree', 'Car', 'Stree light']}}` },
+ },
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+
+ disabledState: { value: '{{false}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/button.js b/server/src/helpers/widget-config/button.js
new file mode 100644
index 0000000000..73b4a03bd4
--- /dev/null
+++ b/server/src/helpers/widget-config/button.js
@@ -0,0 +1,238 @@
+export const buttonConfig = {
+ name: 'Button',
+ displayName: 'Button',
+ description: 'Trigger actions: queries, alerts, set variables etc.',
+ component: 'Button',
+ defaultSize: {
+ width: 4,
+ height: 40,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ text: {
+ type: 'code',
+ displayName: 'Label',
+ validation: {
+ schema: { type: 'string' },
+ },
+ },
+ loadingState: {
+ type: 'toggle',
+ displayName: 'Loading state',
+ validation: { schema: { type: 'boolean' } },
+ section: 'additionalActions',
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: { schema: { type: 'boolean' } },
+ section: 'additionalActions',
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: { schema: { type: 'boolean' } },
+ section: 'additionalActions',
+ },
+ tooltip: {
+ type: 'code',
+ displayName: 'Tooltip',
+ validation: { schema: { type: 'string' } },
+ section: 'additionalActions',
+ placeholder: 'Enter tooltip text',
+ },
+ },
+ events: {
+ onClick: { displayName: 'On click' },
+ onHover: { displayName: 'On hover' },
+ },
+ styles: {
+ type: {
+ type: 'switch',
+ displayName: 'Type',
+ validation: { schema: { type: 'string' } },
+ options: [
+ { displayName: 'Solid', value: 'primary' },
+ { displayName: 'Outline', value: 'outline' },
+ ],
+ accordian: 'button',
+ },
+ backgroundColor: {
+ type: 'color',
+ displayName: 'Background',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: false,
+ },
+ conditionallyRender: {
+ key: 'type',
+ value: 'primary',
+ },
+ accordian: 'button',
+ },
+ textColor: {
+ type: 'color',
+ displayName: 'Text color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: false,
+ },
+ accordian: 'button',
+ },
+ borderColor: {
+ type: 'color',
+ displayName: 'Border color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: false,
+ },
+ accordian: 'button',
+ },
+ loaderColor: {
+ type: 'color',
+ displayName: 'Loader color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: false,
+ },
+ accordian: 'button',
+ },
+
+ icon: {
+ type: 'icon',
+ displayName: 'Icon',
+ validation: { schema: { type: 'string' } },
+ accordian: 'button',
+
+ visibility: false,
+ },
+ iconColor: {
+ type: 'color',
+ displayName: 'Icon color',
+ validation: { schema: { type: 'string' } },
+ accordian: 'button',
+ visibility: false,
+ },
+
+ direction: {
+ type: 'switch',
+ displayName: '',
+ validation: { schema: { type: 'string' } },
+ showLabel: false,
+ isIcon: true,
+ options: [
+ { displayName: 'alignleftinspector', value: 'left', iconName: 'alignleftinspector' },
+ { displayName: 'alignrightinspector', value: 'right', iconName: 'alignrightinspector' },
+ ],
+ accordian: 'button',
+ },
+ borderRadius: {
+ type: 'numberInput',
+ displayName: 'Border radius',
+ validation: {
+ validation: { schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] } },
+ defaultValue: false,
+ },
+ accordian: 'button',
+ },
+ boxShadow: {
+ type: 'boxShadow',
+ displayName: 'Box shadow',
+ validation: { schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] } },
+ accordian: 'button',
+ conditionallyRender: {
+ key: 'type',
+ value: 'primary',
+ },
+ },
+
+ padding: {
+ type: 'switch',
+ displayName: 'Padding',
+ validation: { schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] } },
+ options: [
+ { displayName: 'Default', value: 'default' },
+ { displayName: 'None', value: 'none' },
+ ],
+ accordian: 'container',
+ },
+ },
+ exposedVariables: {
+ buttonText: 'Button',
+ isVisible: true,
+ isDisabled: false,
+ isLoading: false,
+ },
+ actions: [
+ {
+ handle: 'click',
+ displayName: 'Click',
+ },
+ {
+ handle: 'setText',
+ displayName: 'Set text',
+ params: [{ handle: 'text', displayName: 'Text', defaultValue: 'New Text' }],
+ },
+ {
+ handle: 'setVisibility',
+ displayName: 'Set visibility',
+ params: [{ handle: 'disable', displayName: 'Value', defaultValue: '{{false}}', type: 'toggle' }],
+ },
+ {
+ handle: 'setDisable',
+ displayName: 'Set disable',
+ params: [{ handle: 'disable', displayName: 'Value', defaultValue: '{{false}}', type: 'toggle' }],
+ },
+ {
+ handle: 'setLoading',
+ displayName: 'Set loading',
+ params: [{ handle: 'loading', displayName: 'Value', defaultValue: '{{false}}', type: 'toggle' }],
+ },
+ {
+ handle: 'disable',
+ displayName: 'Disable(deprecated)',
+ params: [{ handle: 'disable', displayName: 'Value', defaultValue: `{{false}}`, type: 'toggle' }],
+ },
+ {
+ handle: 'visibility',
+ displayName: 'Visibility(deprecated)',
+ params: [{ handle: 'visible', displayName: 'Value', defaultValue: `{{false}}`, type: 'toggle' }],
+ },
+ {
+ handle: 'loading',
+ displayName: 'Loading(deprecated)',
+ params: [{ handle: 'loading', displayName: 'Value', defaultValue: `{{false}}`, type: 'toggle' }],
+ },
+ ],
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ text: { value: `Button` },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ loadingState: { value: '{{false}}' },
+ tooltip: { value: '' },
+ },
+ events: [],
+ styles: {
+ textColor: { value: '#FFFFFF' },
+ borderColor: { value: '#4368E3' },
+ loaderColor: { value: '#FFFFFF' },
+ borderRadius: { value: '{{6}}' },
+ backgroundColor: { value: '#4368E3' },
+ iconColor: { value: '#FFFFFF' },
+ direction: { value: 'left' },
+ padding: { value: 'default' },
+ boxShadow: { value: '0px 0px 0px 0px #00000090' },
+ icon: { value: 'IconAlignBoxBottomLeft' },
+ iconVisibility: { value: false },
+ type: { value: 'primary' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/buttonGroup.js b/server/src/helpers/widget-config/buttonGroup.js
new file mode 100644
index 0000000000..65b7e77807
--- /dev/null
+++ b/server/src/helpers/widget-config/buttonGroup.js
@@ -0,0 +1,153 @@
+export const buttonGroupConfig = {
+ name: 'ButtonGroup',
+ displayName: 'Button Group',
+ description: 'Group of buttons',
+ component: 'ButtonGroup',
+ properties: {
+ label: {
+ type: 'code',
+ displayName: 'label',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'Button group',
+ },
+ },
+ values: {
+ type: 'code',
+ displayName: 'values',
+ validation: {
+ schema: {
+ type: 'union',
+ schemas: [{ type: 'array', element: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] } }],
+ },
+ defaultValue: '[]',
+ },
+ },
+ labels: {
+ type: 'code',
+ displayName: 'Labels',
+ validation: {
+ schema: {
+ type: 'union',
+ schemas: [{ type: 'array', element: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] } }],
+ },
+ defaultValue: '[]',
+ },
+ },
+ defaultSelected: {
+ type: 'code',
+ displayName: 'Default selected',
+ validation: {
+ schema: {
+ type: 'union',
+ schemas: [{ type: 'array', element: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] } }],
+ },
+ defaultValue: '[1]',
+ },
+ },
+ multiSelection: {
+ type: 'toggle',
+ displayName: 'Enable multiple selection',
+
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ },
+ defaultSize: {
+ width: 12,
+ height: 80,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ events: {
+ onClick: { displayName: 'On click' },
+ },
+ styles: {
+ backgroundColor: {
+ type: 'color',
+ displayName: 'Background color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: false,
+ },
+ },
+ textColor: {
+ type: 'color',
+ displayName: 'Text color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: false,
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ borderRadius: {
+ type: 'number',
+ displayName: 'Border radius',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: false,
+ },
+ },
+ selectedTextColor: {
+ type: 'color',
+ displayName: 'Selected text colour',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#fff',
+ },
+ },
+ selectedBackgroundColor: {
+ type: 'color',
+ displayName: 'Selected background color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#007bff',
+ },
+ },
+ },
+ exposedVariables: {
+ selected: [1],
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ label: { value: `Button group` },
+ defaultSelected: { value: '{{[1]}}' },
+ values: { value: '{{[1,2,3]}}' },
+ labels: { value: '{{[]}}' },
+ multiSelection: { value: '{{false}}' },
+ },
+ events: [],
+ styles: {
+ backgroundColor: { value: '' },
+ textColor: { value: '' },
+ visibility: { value: '{{true}}' },
+ borderRadius: { value: '{{4}}' },
+ disabledState: { value: '{{false}}' },
+ selectedTextColor: { value: '' },
+ selectedBackgroundColor: { value: '' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/calendar.js b/server/src/helpers/widget-config/calendar.js
new file mode 100644
index 0000000000..da9f3aa811
--- /dev/null
+++ b/server/src/helpers/widget-config/calendar.js
@@ -0,0 +1,111 @@
+export const calendarConfig = {
+ name: 'Calendar',
+ displayName: 'Calendar',
+ description: 'Display calendar events',
+ component: 'Calendar',
+ defaultSize: {
+ width: 30,
+ height: 600,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ dateFormat: { type: 'code', displayName: 'Date format' },
+ defaultDate: { type: 'code', displayName: 'Default date' },
+ events: { type: 'code', displayName: 'Events' },
+ resources: { type: 'code', displayName: 'Resources' },
+ defaultView: { type: 'code', displayName: 'Default view' },
+ startTime: {
+ type: 'code',
+ displayName: 'Start time on week and day view',
+ },
+ endTime: { type: 'code', displayName: 'End time on week and day view' },
+ displayToolbar: { type: 'toggle', displayName: 'Show toolbar' },
+ displayViewSwitcher: {
+ type: 'toggle',
+ displayName: 'Show view switcher',
+ },
+ highlightToday: { type: 'toggle', displayName: 'Highlight today' },
+ showPopOverOnEventClick: {
+ type: 'toggle',
+ displayName: 'Show popover when event is clicked',
+ },
+ },
+ events: {
+ onCalendarEventSelect: { displayName: 'On Event Select' },
+ onCalendarSlotSelect: { displayName: 'On Slot Select' },
+ onCalendarNavigate: { displayName: 'On Date Navigate' },
+ onCalendarViewChange: { displayName: 'On View Change' },
+ },
+ styles: {
+ visibility: { type: 'toggle', displayName: 'Visibility' },
+ cellSizeInViewsClassifiedByResource: {
+ type: 'select',
+ displayName: 'Cell size in views classified by resource',
+ options: [
+ { name: 'Compact', value: 'compact' },
+ { name: 'Spacious', value: 'spacious' },
+ ],
+ },
+ weekDateFormat: {
+ type: 'code',
+ displayName: 'Header date format on week view',
+ },
+ },
+ exposedVariables: {
+ selectedEvent: {},
+ selectedSlots: {},
+ currentView: 'month',
+ currentDate: undefined,
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ dateFormat: {
+ value: 'MM-DD-YYYY HH:mm:ss A Z',
+ },
+ defaultDate: {
+ value: '{{moment().format("MM-DD-YYYY HH:mm:ss A Z")}}',
+ },
+ events: {
+ value:
+ "{{[\n\t\t{\n\t\t\t title: 'Sample event',\n\t\t\t start: `${moment().startOf('day').format('MM-DD-YYYY HH:mm:ss A Z')}`,\n\t\t\t end: `${moment().endOf('day').format('MM-DD-YYYY HH:mm:ss A Z')}`,\n\t\t\t allDay: false,\n\t\t\t color: '#4D72DA'\n\t\t}\n]}}",
+ },
+ resources: {
+ value: '{{[]}}',
+ },
+ defaultView: {
+ value: "{{'month'}}",
+ },
+ startTime: {
+ value: "{{moment().startOf('day').format('MM-DD-YYYY HH:mm:ss A Z')}}",
+ },
+ endTime: {
+ value: "{{moment().endOf('day').format('MM-DD-YYYY HH:mm:ss A Z')}}",
+ },
+ displayToolbar: {
+ value: true,
+ },
+ displayViewSwitcher: {
+ value: true,
+ },
+ highlightToday: {
+ value: true,
+ },
+ showPopOverOnEventClick: {
+ value: false,
+ },
+ },
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ cellSizeInViewsClassifiedByResource: { value: 'spacious' },
+ weekDateFormat: { value: 'DD MMM' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/chart.js b/server/src/helpers/widget-config/chart.js
new file mode 100644
index 0000000000..72ab688056
--- /dev/null
+++ b/server/src/helpers/widget-config/chart.js
@@ -0,0 +1,238 @@
+export const chartConfig = {
+ name: 'Chart',
+ displayName: 'Chart',
+ description: 'Visualize data',
+ component: 'Chart',
+ defaultSize: {
+ width: 20,
+ height: 400,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ title: {
+ type: 'code',
+ displayName: 'Title',
+ validation: {
+ schema: {
+ type: 'string',
+ },
+ defaultValue: 'This title can be changed',
+ },
+ },
+ data: {
+ type: 'json',
+ displayName: 'Data',
+ validation: {
+ schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'array' }] },
+ defaultValue: '',
+ },
+ },
+ loadingState: {
+ type: 'toggle',
+ displayName: 'Loading state',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ markerColor: {
+ type: 'color',
+ displayName: 'Marker color',
+ validation: {
+ schema: {
+ type: 'string',
+ },
+ defaultValue: '#CDE1F8',
+ },
+ },
+ showAxes: {
+ type: 'toggle',
+ displayName: 'Show axes',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defaultValue: true,
+ },
+ },
+ showGridLines: {
+ type: 'toggle',
+ displayName: 'Show grid lines',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defaultValue: true,
+ },
+ },
+ type: {
+ type: 'select',
+ displayName: 'Chart type',
+ options: [
+ { name: 'Line', value: 'line' },
+ { name: 'Bar', value: 'bar' },
+ { name: 'Pie', value: 'pie' },
+ ],
+ validation: {
+ schema: {
+ type: 'union',
+ schemas: [{ type: 'string' }, { type: 'boolean' }, { type: 'number' }],
+ },
+ defaultValue: 'line',
+ },
+ },
+ jsonDescription: {
+ type: 'json',
+ displayName: 'Json Description',
+ validation: {
+ schema: {
+ type: 'union',
+ schemas: [{ type: 'string' }, { type: 'object' }],
+ },
+ defaultValue: '{ "data": [ { "x": [ "Jan", "Feb", "Mar" ], "y": [ 100, 80, 40 ], "type": "bar" } ] }',
+ },
+ },
+ plotFromJson: {
+ type: 'toggle',
+ displayName: 'Use Plotly JSON schema',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defaultValue: false,
+ },
+ },
+ barmode: {
+ type: 'select',
+ displayName: 'Bar mode',
+ options: [
+ { name: 'Stack', value: 'stack' },
+ { name: 'Group', value: 'group' },
+ { name: 'Overlay', value: 'overlay' },
+ { name: 'Relative', value: 'relative' },
+ ],
+ validation: {
+ schema: {
+ schemas: { type: 'string' },
+ },
+ defaultValue: 'group',
+ },
+ },
+ },
+ actions: [
+ {
+ handle: 'clearClickedPoint',
+ displayName: 'Clear clicked point',
+ },
+ ],
+ events: {
+ onClick: { displayName: 'On data point click' },
+ onDoubleClick: { displayName: 'On double click' },
+ },
+ styles: {
+ backgroundColor: {
+ type: 'color',
+ displayName: 'Background color',
+ validation: { schema: { type: 'string' }, defaultValue: '#fff' },
+ },
+ padding: {
+ type: 'code',
+ displayName: 'Padding',
+ validation: {
+ schema: {
+ type: 'union',
+ schemas: [{ type: 'number' }, { type: 'string' }],
+ },
+ defaultValue: 50,
+ },
+ },
+ borderRadius: {
+ type: 'number',
+ displayName: 'Border radius',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 4,
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defaultValue: true,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defaultValue: false,
+ },
+ },
+ },
+ exposedVariables: {
+ show: null,
+ chartTitle: null,
+ xAxisTitle: null,
+ yAxisTitle: null,
+ clickedDataPoint: {},
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ title: { value: 'This title can be changed' },
+ markerColor: { value: '#CDE1F8' },
+ showAxes: { value: '{{true}}' },
+ showGridLines: { value: '{{true}}' },
+ plotFromJson: { value: '{{false}}' },
+ loadingState: { value: `{{false}}` },
+ barmode: { value: `group` },
+ jsonDescription: {
+ value: `{
+ "data": [
+ {
+ "x": [
+ "Jan",
+ "Feb",
+ "Mar"
+ ],
+ "y": [
+ 100,
+ 80,
+ 40
+ ],
+ "type": "bar"
+ }
+ ]
+ }`,
+ },
+ type: { value: `line` },
+ data: {
+ value: `[
+ { "x": "Jan", "y": 100},
+ { "x": "Feb", "y": 80},
+ { "x": "Mar", "y": 40}
+ ]`,
+ },
+ },
+ events: [],
+ styles: {
+ backgroundColor: { value: '#fff' },
+ padding: { value: '50' },
+ borderRadius: { value: '{{4}}' },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/checkbox.js b/server/src/helpers/widget-config/checkbox.js
new file mode 100644
index 0000000000..c9b6424020
--- /dev/null
+++ b/server/src/helpers/widget-config/checkbox.js
@@ -0,0 +1,198 @@
+export const checkboxConfig = {
+ name: 'Checkbox',
+ displayName: 'Checkbox',
+ description: 'Single checkbox toggle',
+ component: 'Checkbox',
+ defaultSize: {
+ width: 6,
+ height: 30,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ label: {
+ type: 'code',
+ displayName: 'Label',
+ validation: {
+ schema: { type: 'string' },
+ },
+ },
+ defaultValue: {
+ type: 'switch',
+ displayName: 'Default state',
+ validation: { schema: { type: 'boolean' } },
+ options: [
+ { displayName: 'On', value: '{{true}}' },
+ { displayName: 'Off', value: '{{false}}' },
+ ],
+ accordian: 'label',
+ },
+ loadingState: {
+ type: 'toggle',
+ displayName: 'Loading state',
+ validation: { schema: { type: 'boolean' } },
+ section: 'additionalActions',
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: { schema: { type: 'boolean' } },
+ section: 'additionalActions',
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: { schema: { type: 'boolean' } },
+ section: 'additionalActions',
+ },
+ tooltip: {
+ type: 'code',
+ displayName: 'Tooltip',
+ validation: { schema: { type: 'string' } },
+ section: 'additionalActions',
+ placeholder: 'Enter tooltip text',
+ },
+ },
+ validation: {
+ mandatory: { type: 'toggle', displayName: 'Make this field mandatory' },
+ customRule: {
+ type: 'code',
+ displayName: 'Custom validation',
+ placeholder: `{{components.text2.text=='yes'&&'valid'}}`,
+ },
+ },
+ events: {
+ onChange: { displayName: 'On change' },
+ onCheck: { displayName: 'On check (Deprecated)' },
+ onUnCheck: { displayName: 'On uncheck (Deprecated)' },
+ },
+ styles: {
+ textColor: {
+ type: 'color',
+ displayName: 'Text color',
+ validation: {
+ schema: { type: 'string' },
+ },
+ accordian: 'label',
+ },
+ borderColor: {
+ type: 'color',
+ displayName: 'Border color',
+ validation: {
+ schema: { type: 'string' },
+ },
+ accordian: 'switch',
+ },
+ checkboxColor: {
+ type: 'color',
+ displayName: 'Checked color',
+ validation: {
+ schema: { type: 'string' },
+ },
+ accordian: 'switch',
+ },
+ uncheckedColor: {
+ type: 'color',
+ displayName: 'Unchecked color',
+ validation: {
+ schema: { type: 'string' },
+ },
+ accordian: 'switch',
+ },
+ handleColor: {
+ type: 'color',
+ displayName: 'Handle color',
+ validation: {
+ schema: { type: 'string' },
+ },
+ accordian: 'switch',
+ },
+ boxShadow: {
+ type: 'boxShadow',
+ displayName: 'Box shadow',
+ validation: { schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] } },
+ accordian: 'switch',
+ },
+
+ alignment: {
+ type: 'switch',
+ displayName: 'Alignment',
+ validation: { schema: { type: 'string' } },
+ options: [
+ { displayName: 'Left', value: 'left' },
+ { displayName: 'Right', value: 'right' },
+ ],
+ accordian: 'label',
+ },
+ },
+ exposedVariables: {
+ value: false,
+ label: 'Label',
+ isMandatory: false,
+ isVisible: true,
+ isDisabled: false,
+ isLoading: false,
+ },
+ actions: [
+ {
+ handle: 'toggle',
+ displayName: 'toggle',
+ },
+ {
+ handle: 'setValue',
+ displayName: 'Set value',
+ params: [{ handle: 'value', displayName: 'value' }],
+ },
+ {
+ handle: 'setVisibility',
+ displayName: 'Set visibility',
+ params: [{ handle: 'disable', displayName: 'Value', defaultValue: '{{false}}', type: 'toggle' }],
+ },
+ {
+ handle: 'setDisable',
+ displayName: 'Set disable',
+ params: [{ handle: 'disable', displayName: 'Value', defaultValue: '{{false}}', type: 'toggle' }],
+ },
+ {
+ handle: 'setLoading',
+ displayName: 'Set loading',
+ params: [{ handle: 'loading', displayName: 'Value', defaultValue: '{{false}}', type: 'toggle' }],
+ },
+ {
+ handle: 'setChecked',
+ displayName: 'Set checked (Deprecated)',
+ params: [{ handle: 'status', displayName: 'status' }],
+ },
+ ],
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ label: { value: 'Label' },
+ defaultValue: { value: '{{false}}' },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ loadingState: { value: '{{false}}' },
+ tooltip: { value: '' },
+ },
+ events: [],
+ styles: {
+ disabledState: { value: '{{false}}' },
+ textColor: { value: '#1B1F24' },
+ checkboxColor: { value: '#4368E3' },
+ uncheckedColor: { value: '#E4E7EB' },
+ borderColor: { value: '#CCD1D5' },
+ handleColor: { value: '#FFFFFF' },
+ alignment: { value: 'right' },
+ boxShadow: { value: '0px 0px 0px 0px #00000090' },
+ },
+ validation: {
+ mandatory: { value: '{{false}}' },
+ customRule: { value: null },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/circularProgressbar.js b/server/src/helpers/widget-config/circularProgressbar.js
new file mode 100644
index 0000000000..a7ffd551af
--- /dev/null
+++ b/server/src/helpers/widget-config/circularProgressbar.js
@@ -0,0 +1,116 @@
+export const circularProgressbarConfig = {
+ name: 'CircularProgressBar',
+ displayName: 'Circular Progressbar',
+ description: 'Show circular progress',
+ component: 'CircularProgressBar',
+ defaultSize: {
+ width: 7,
+ height: 50,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ text: {
+ type: 'code',
+ displayName: 'Text',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'text',
+ },
+ },
+ progress: {
+ type: 'code',
+ displayName: 'Progress',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 50,
+ },
+ },
+ },
+ events: {},
+ styles: {
+ color: {
+ type: 'color',
+ displayName: 'Color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#375FCF',
+ },
+ },
+ textColor: {
+ type: 'color',
+ displayName: 'Text Color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#fff',
+ },
+ },
+ textSize: {
+ type: 'code',
+ displayName: 'Text size',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 16,
+ },
+ },
+ strokeWidth: {
+ type: 'code',
+ displayName: 'Stroke width',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 8,
+ },
+ },
+ counterClockwise: {
+ type: 'code',
+ displayName: 'Counter clockwise',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ circleRatio: {
+ type: 'code',
+ displayName: 'Circle ratio',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 1,
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ },
+ exposedVariables: {},
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ text: {
+ value: '',
+ },
+ progress: {
+ value: '{{50}}',
+ },
+ },
+ events: [],
+ styles: {
+ color: { value: '' },
+ textColor: { value: '' },
+ textSize: { value: '{{16}}' },
+ strokeWidth: { value: '{{8}}' },
+ counterClockwise: { value: '{{false}}' },
+ circleRatio: { value: '{{1}}' },
+ visibility: { value: '{{true}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/codeEditor.js b/server/src/helpers/widget-config/codeEditor.js
new file mode 100644
index 0000000000..d7ff03d9a8
--- /dev/null
+++ b/server/src/helpers/widget-config/codeEditor.js
@@ -0,0 +1,87 @@
+export const codeEditorConfig = {
+ name: 'CodeEditor',
+ displayName: 'Code Editor',
+ description: 'Edit source code',
+ component: 'CodeEditor',
+ defaultSize: {
+ width: 15,
+ height: 120,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ enableLineNumber: {
+ type: 'code',
+ displayName: 'Show line number',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ mode: {
+ type: 'code',
+ displayName: 'Mode',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'javascript',
+ },
+ },
+ placeholder: {
+ type: 'code',
+ displayName: 'Placeholder',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'placeholder',
+ },
+ },
+ },
+ events: {},
+ styles: {
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ borderRadius: {
+ type: 'code',
+ displayName: 'Border radius',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 4,
+ },
+ },
+ },
+ exposedVariables: {
+ value: '',
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ enableLineNumber: { value: '{{true}}' },
+ mode: { value: 'javascript' },
+ placeholder: { value: '' },
+ },
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ borderRadius: { value: '{{4}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/colorPicker.js b/server/src/helpers/widget-config/colorPicker.js
new file mode 100644
index 0000000000..b2fddd7e4c
--- /dev/null
+++ b/server/src/helpers/widget-config/colorPicker.js
@@ -0,0 +1,50 @@
+export const colorPickerConfig = {
+ name: 'ColorPicker',
+ displayName: 'Color Picker',
+ description: 'Choose colors from a palette',
+ component: 'ColorPicker',
+ properties: {
+ defaultColor: { type: 'color', displayName: 'Default color' },
+ },
+ defaultSize: {
+ width: 9,
+ height: 40,
+ },
+ actions: [
+ {
+ displayName: 'Set Color',
+ handle: 'setColor',
+ params: [{ handle: 'color', displayName: 'color', defaultValue: '#ffffff', type: 'color' }],
+ },
+ ],
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ events: {
+ onChange: { displayName: 'On change' },
+ },
+ styles: {
+ visibility: { type: 'toggle', displayName: 'Visibility' },
+ },
+ exposedVariables: {
+ selectedColorHex: '#000000',
+ selectedColorRGB: 'rgb(0,0,0)',
+ selectedColorRGBA: 'rgba(0, 0, 0, 1)',
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ defaultColor: {
+ value: '#000000',
+ },
+ },
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/container.js b/server/src/helpers/widget-config/container.js
new file mode 100644
index 0000000000..32d4158ffc
--- /dev/null
+++ b/server/src/helpers/widget-config/container.js
@@ -0,0 +1,89 @@
+export const containerConfig = {
+ name: 'Container',
+ displayName: 'Container',
+ description: 'Group components',
+ defaultSize: {
+ width: 5,
+ height: 200,
+ },
+ component: 'Container',
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ loadingState: {
+ type: 'toggle',
+ displayName: 'Loading state',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ },
+ events: {},
+ styles: {
+ backgroundColor: {
+ type: 'color',
+ displayName: 'Background color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#fff',
+ },
+ },
+ borderRadius: {
+ type: 'code',
+ displayName: 'Border radius',
+ validation: {
+ schema: {
+ type: 'union',
+ schemas: [{ type: 'string' }, { type: 'number' }],
+ },
+ defaultValue: 4,
+ },
+ },
+ borderColor: {
+ type: 'color',
+ displayName: 'Border color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#fff',
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: { type: 'boolean' },
+ },
+ defaultValue: false,
+ },
+ },
+ exposedVariables: {},
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ visible: { value: '{{true}}' },
+ loadingState: { value: `{{false}}` },
+ },
+ events: [],
+ styles: {
+ backgroundColor: { value: '#fff' },
+ borderRadius: { value: '4' },
+ borderColor: { value: '#fff' },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/customComponent.js b/server/src/helpers/widget-config/customComponent.js
new file mode 100644
index 0000000000..cc1dae2b3e
--- /dev/null
+++ b/server/src/helpers/widget-config/customComponent.js
@@ -0,0 +1,65 @@
+export const customComponentConfig = {
+ name: 'CustomComponent',
+ displayName: 'Custom Component',
+ description: 'Create React components',
+ component: 'CustomComponent',
+ properties: {
+ data: { type: 'code', displayName: 'Data', validation: { schema: { type: 'object' }, defaultValue: '{}' } },
+ code: { type: 'code', displayName: 'Code' },
+ },
+ defaultSize: {
+ width: 20,
+ height: 140,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ events: {},
+ styles: {
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: { schema: { type: 'boolean' }, defaultValue: true },
+ },
+ },
+ exposedVariables: {
+ data: { value: `{{{ title: 'Hi! There', buttonText: 'Update Title'}}}` },
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ visible: { value: '{{true}}' },
+ data: {
+ value: `{{{ title: 'Hi! There', buttonText: 'Update Title'}}}`,
+ },
+ code: {
+ value: `import React from 'https://cdn.skypack.dev/react';
+ import ReactDOM from 'https://cdn.skypack.dev/react-dom';
+ import { Button, Container } from 'https://cdn.skypack.dev/@material-ui/core';
+ const MyCustomComponent = ({data, updateData, runQuery}) => (
+
+ {data.title}
+
+
+ );
+ const ConnectedComponent = Tooljet.connectComponent(MyCustomComponent);
+ ReactDOM.render(, document.body);`,
+ skipResolve: true,
+ },
+ },
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/datepicker.js b/server/src/helpers/widget-config/datepicker.js
new file mode 100644
index 0000000000..44b3276678
--- /dev/null
+++ b/server/src/helpers/widget-config/datepicker.js
@@ -0,0 +1,113 @@
+export const datepickerConfig = {
+ name: 'Datepicker',
+ displayName: 'Date Picker',
+ description: 'Choose date and time',
+ component: 'Datepicker',
+ defaultSize: {
+ width: 5,
+ height: 30,
+ },
+ validation: {
+ customRule: { type: 'code', displayName: 'Custom validation' },
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ defaultValue: {
+ type: 'code',
+ displayName: 'Default value',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '01/01/2022',
+ },
+ },
+ format: {
+ type: 'code',
+ displayName: 'Format',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'DD/MM/YYYY',
+ },
+ },
+ enableTime: {
+ type: 'toggle',
+ displayName: 'Enable time selection?',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ enableDate: {
+ type: 'toggle',
+ displayName: 'Enable date selection?',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ disabledDates: {
+ type: 'code',
+ displayName: 'Disabled dates',
+ validation: {
+ schema: { type: 'array', element: { type: 'string' } },
+ defaultValue: "['01/01/2022']",
+ },
+ },
+ },
+ events: {
+ onSelect: { displayName: 'On select' },
+ },
+ styles: {
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ borderRadius: {
+ type: 'code',
+ displayName: 'Border radius',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 4,
+ },
+ },
+ },
+ exposedVariables: {
+ value: '',
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ validation: {
+ customRule: { value: '' },
+ },
+ properties: {
+ defaultValue: { value: '01/01/2022' },
+ format: { value: 'DD/MM/YYYY' },
+ enableTime: { value: '{{false}}' },
+ enableDate: { value: '{{true}}' },
+ disabledDates: { value: '{{[]}}' },
+ },
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ borderRadius: { value: '{{4}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/daterangepicker.js b/server/src/helpers/widget-config/daterangepicker.js
new file mode 100644
index 0000000000..d5c5c3d03b
--- /dev/null
+++ b/server/src/helpers/widget-config/daterangepicker.js
@@ -0,0 +1,104 @@
+export const daterangepickerConfig = {
+ name: 'DateRangePicker',
+ displayName: 'Range Picker',
+ description: 'Choose date ranges',
+ component: 'DaterangePicker',
+ defaultSize: {
+ width: 10,
+ height: 30,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ defaultStartDate: {
+ type: 'code',
+ displayName: 'Default start date',
+ validation: {
+ schema: {
+ type: 'string',
+ },
+ defautlValue: '01/04/2022',
+ },
+ },
+ defaultEndDate: {
+ type: 'code',
+ displayName: 'Default end date',
+ validation: {
+ schema: {
+ type: 'string',
+ },
+ defautlValue: '10/04/2022',
+ },
+ },
+ format: {
+ type: 'code',
+ displayName: 'Format',
+ validation: {
+ schema: {
+ type: 'string',
+ },
+ defautlValue: 'DD/MM/YYYY',
+ },
+ },
+ },
+ events: {
+ onSelect: { displayName: 'On select' },
+ },
+ styles: {
+ borderRadius: {
+ type: 'code',
+ displayName: 'Border radius',
+ validation: {
+ schema: {
+ type: 'union',
+ schemas: [{ type: 'number' }, { type: 'string' }],
+ },
+ defautlValue: 4,
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defautlValue: true,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defautlValue: false,
+ },
+ },
+ },
+ exposedVariables: {
+ endDate: {},
+ startDate: {},
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ defaultStartDate: { value: '01/04/2022' },
+ defaultEndDate: { value: '10/04/2022' },
+
+ format: { value: 'DD/MM/YYYY' },
+ },
+ events: [],
+ styles: {
+ borderRadius: { value: '4' },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/divider.js b/server/src/helpers/widget-config/divider.js
new file mode 100644
index 0000000000..045f894816
--- /dev/null
+++ b/server/src/helpers/widget-config/divider.js
@@ -0,0 +1,49 @@
+export const dividerConfig = {
+ name: 'Divider',
+ displayName: 'Divider',
+ description: 'Separator between components',
+ component: 'Divider',
+ defaultSize: {
+ width: 10,
+ height: 10,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {},
+ events: {},
+ styles: {
+ dividerColor: {
+ type: 'color',
+ displayName: 'Divider color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#000000',
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ },
+ exposedVariables: {
+ value: {},
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {},
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ dividerColor: { value: '#000000' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/dropdown.js b/server/src/helpers/widget-config/dropdown.js
new file mode 100644
index 0000000000..b2c58acc7a
--- /dev/null
+++ b/server/src/helpers/widget-config/dropdown.js
@@ -0,0 +1,205 @@
+export const dropdownConfig = {
+ name: 'DropdownLegacy',
+ displayName: 'Dropdown (Legacy)',
+ description: 'Single item selector',
+ defaultSize: {
+ width: 8,
+ height: 30,
+ },
+ component: 'DropDown',
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ validation: {
+ customRule: { type: 'code', displayName: 'Custom validation' },
+ },
+ properties: {
+ label: {
+ type: 'code',
+ displayName: 'Label',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'Select',
+ },
+ },
+ placeholder: {
+ type: 'code',
+ displayName: 'Placeholder',
+
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'Select an option',
+ },
+ },
+ advanced: {
+ type: 'toggle',
+ displayName: 'Advanced',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ value: {
+ type: 'code',
+ displayName: 'Default value',
+ conditionallyRender: {
+ key: 'advanced',
+ value: false,
+ },
+ validation: {
+ schema: {
+ type: 'union',
+ schemas: [{ type: 'string' }, { type: 'number' }, { type: 'boolean' }],
+ },
+ defaultValue: 2,
+ },
+ },
+ values: {
+ type: 'code',
+ displayName: 'Option values',
+ conditionallyRender: {
+ key: 'advanced',
+ value: false,
+ },
+ validation: {
+ schema: {
+ type: 'array',
+ element: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }, { type: 'boolean' }] },
+ },
+ defaultValue: "['one', 'two', 'three']",
+ },
+ },
+ display_values: {
+ type: 'code',
+ displayName: 'Option labels',
+ conditionallyRender: {
+ key: 'advanced',
+ value: false,
+ },
+ validation: {
+ schema: {
+ type: 'array',
+ element: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }, { type: 'boolean' }] },
+ },
+ defaultValue: "['one', 'two', 'three']",
+ },
+ },
+
+ schema: {
+ type: 'code',
+ displayName: 'Schema',
+ conditionallyRender: {
+ key: 'advanced',
+ value: true,
+ },
+ },
+ loadingState: {
+ type: 'toggle',
+ displayName: 'Options loading state',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ },
+ events: {
+ onSelect: { displayName: 'On select' },
+ onSearchTextChanged: { displayName: 'On search text changed' },
+ },
+ styles: {
+ borderRadius: {
+ type: 'code',
+ displayName: 'Border radius',
+ validation: {
+ schema: {
+ type: 'union',
+ schemas: [{ type: 'number' }, { type: 'string' }],
+ },
+ defaultValue: 4,
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ },
+ defaultValue: true,
+ },
+ selectedTextColor: {
+ type: 'color',
+ displayName: 'Selected text color',
+ validation: {
+ schema: {
+ type: 'string',
+ },
+ defaultValue: '#000000',
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defaultValue: false,
+ },
+ },
+ justifyContent: {
+ type: 'alignButtons',
+ displayName: 'Align Text',
+ validation: {
+ schema: {
+ type: 'string',
+ },
+ defaultValue: 'left',
+ },
+ },
+ },
+ exposedVariables: {
+ value: 2,
+ searchText: '',
+ label: 'Select',
+ optionLabels: ['one', 'two', 'three'],
+ selectedOptionLabel: 'two',
+ },
+ actions: [
+ {
+ handle: 'selectOption',
+ displayName: 'Select option',
+ params: [{ handle: 'select', displayName: 'Select' }],
+ },
+ ],
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ validation: {
+ customRule: { value: null },
+ },
+ properties: {
+ advanced: { value: `{{false}}` },
+ schema: {
+ value:
+ "{{[\t{label: 'One',value: 1,disable: false,visible: true,default: true},{label: 'Two',value: 2,disable: false,visible: true},{label: 'Three',value: 3,disable: false,visible: true}\t]}}",
+ },
+
+ label: { value: 'Select' },
+ value: { value: '{{2}}' },
+ values: { value: '{{[1,2,3]}}' },
+ display_values: { value: '{{["one", "two", "three"]}}' },
+ loadingState: { value: '{{false}}' },
+ placeholder: { value: 'Select an option' },
+ },
+ events: [],
+ styles: {
+ borderRadius: { value: '4' },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ justifyContent: { value: 'left' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/dropdownV2.js b/server/src/helpers/widget-config/dropdownV2.js
new file mode 100644
index 0000000000..247af3ccef
--- /dev/null
+++ b/server/src/helpers/widget-config/dropdownV2.js
@@ -0,0 +1,330 @@
+export const dropdownV2Config = {
+ name: 'Dropdown',
+ displayName: 'Dropdown',
+ description: 'Single item selector',
+ defaultSize: {
+ width: 10,
+ height: 40,
+ },
+ component: 'DropdownV2',
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ validation: {
+ mandatory: { type: 'toggle', displayName: 'Make this field mandatory' },
+ customRule: {
+ type: 'code',
+ displayName: 'Custom validation',
+ placeholder: `{{components.text2.text=='yes'&&'valid'}}`,
+ },
+ },
+ properties: {
+ label: {
+ type: 'code',
+ displayName: 'Label',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'Select',
+ },
+ accordian: 'Data',
+ },
+ placeholder: {
+ type: 'code',
+ displayName: 'Placeholder',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'Select an option',
+ },
+ accordian: 'Data',
+ },
+ advanced: {
+ type: 'toggle',
+ displayName: 'Dynamic options',
+ validation: {
+ schema: { type: 'boolean' },
+ },
+ accordian: 'Options',
+ },
+ schema: {
+ type: 'code',
+ displayName: 'Schema',
+ conditionallyRender: {
+ key: 'advanced',
+ value: true,
+ },
+ accordian: 'Options',
+ },
+ optionsLoadingState: {
+ type: 'toggle',
+ displayName: 'Options loading state',
+ validation: {
+ schema: { type: 'boolean' },
+ },
+ accordian: 'Options',
+ },
+ loadingState: {
+ type: 'toggle',
+ displayName: 'Loading state',
+ validation: { schema: { type: 'boolean' }, defaultValue: true },
+ section: 'additionalActions',
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: { schema: { type: 'boolean' }, defaultValue: true },
+
+ section: 'additionalActions',
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: { schema: { type: 'boolean' }, defaultValue: true },
+ section: 'additionalActions',
+ },
+ tooltip: {
+ type: 'code',
+ displayName: 'Tooltip',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'Enter tooltip text',
+ },
+ section: 'additionalActions',
+ placeholder: 'Enter tooltip text',
+ },
+ },
+ events: {
+ onSelect: { displayName: 'On select' },
+ onSearchTextChanged: { displayName: 'On search text changed' },
+ onFocus: { displayName: 'On focus' },
+ onBlur: { displayName: 'On blur' },
+ },
+ styles: {
+ labelColor: {
+ type: 'color',
+ displayName: 'Color',
+ validation: { schema: { type: 'string' }, defaultValue: '#1B1F24' },
+ accordian: 'label',
+ },
+ alignment: {
+ type: 'switch',
+ displayName: 'Alignment',
+ validation: { schema: { type: 'string' }, defaultValue: 'side' },
+ options: [
+ { displayName: 'Side', value: 'side' },
+ { displayName: 'Top', value: 'top' },
+ ],
+ accordian: 'label',
+ },
+ direction: {
+ type: 'switch',
+ displayName: 'Direction',
+ validation: { schema: { type: 'string' }, defaultValue: 'left' },
+ showLabel: false,
+ isIcon: true,
+ options: [
+ { displayName: 'alignleftinspector', value: 'left', iconName: 'alignleftinspector' },
+ { displayName: 'alignrightinspector', value: 'right', iconName: 'alignrightinspector' },
+ ],
+ accordian: 'label',
+ isFxNotRequired: true,
+ },
+ labelWidth: {
+ type: 'slider',
+ displayName: 'Width',
+ accordian: 'label',
+ conditionallyRender: {
+ key: 'alignment',
+ value: 'side',
+ },
+ isFxNotRequired: true,
+ },
+ auto: {
+ type: 'checkbox',
+ displayName: 'auto',
+ showLabel: false,
+ validation: { schema: { type: 'boolean' } },
+ accordian: 'label',
+ conditionallyRender: {
+ key: 'alignment',
+ value: 'side',
+ },
+ isFxNotRequired: true,
+ },
+
+ fieldBackgroundColor: {
+ type: 'color',
+ displayName: 'Background',
+ validation: { schema: { type: 'string' }, defaultValue: '#fff' },
+ accordian: 'field',
+ },
+ fieldBorderColor: {
+ type: 'color',
+ displayName: 'Border',
+ validation: { schema: { type: 'string' }, defaultValue: '#CCD1D5' },
+ accordian: 'field',
+ },
+ accentColor: {
+ type: 'color',
+ displayName: 'Accent',
+ validation: { schema: { type: 'string' }, defaultValue: '#4368E3' },
+ accordian: 'field',
+ },
+ selectedTextColor: {
+ type: 'color',
+ displayName: 'Text',
+ validation: { schema: { type: 'string' }, defaultValue: '#1B1F24' },
+ accordian: 'field',
+ },
+ errTextColor: {
+ type: 'color',
+ displayName: 'Error text',
+ validation: { schema: { type: 'string' }, defaultValue: '#D72D39' },
+ accordian: 'field',
+ },
+ icon: {
+ type: 'icon',
+ displayName: 'Icon',
+ validation: { schema: { type: 'string' }, defaultValue: 'IconHome2' },
+ accordian: 'field',
+ visibility: false,
+ },
+ iconColor: {
+ type: 'color',
+ displayName: '',
+ showLabel: false,
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#6A727C',
+ },
+ accordian: 'field',
+ },
+ fieldBorderRadius: {
+ type: 'input',
+ displayName: 'Border radius',
+ validation: { schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] }, defaultValue: '6' },
+ accordian: 'field',
+ },
+ boxShadow: {
+ type: 'boxShadow',
+ displayName: 'Box shadow',
+ validation: {
+ schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] },
+ defaultValue: '0px 0px 0px 0px #00000040',
+ },
+ accordian: 'field',
+ },
+ padding: {
+ type: 'switch',
+ displayName: 'Padding',
+ validation: {
+ schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] },
+ defaultValue: 'default',
+ },
+ options: [
+ { displayName: 'Default', value: 'default' },
+ { displayName: 'None', value: 'none' },
+ ],
+ accordian: 'container',
+ },
+ },
+ exposedVariables: {
+ searchText: '',
+ label: 'Select',
+ },
+ actions: [
+ {
+ handle: 'selectOption',
+ displayName: 'Select option',
+ params: [{ handle: 'select', displayName: 'Select' }],
+ },
+ {
+ handle: 'setVisibility',
+ displayName: 'Set visibility',
+ params: [{ handle: 'setVisibility', displayName: 'Value', defaultValue: `{{true}}`, type: 'toggle' }],
+ },
+ {
+ handle: 'clear',
+ displayName: 'Clear',
+ },
+ {
+ handle: 'setLoading',
+ displayName: 'Set loading',
+ params: [{ handle: 'setLoading', displayName: 'Value', defaultValue: `{{false}}`, type: 'toggle' }],
+ },
+ {
+ handle: 'setDisable',
+ displayName: 'Set disable',
+ params: [{ handle: 'setDisable', displayName: 'Value', defaultValue: `{{false}}`, type: 'toggle' }],
+ },
+ ],
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ validation: {
+ mandatory: { value: '{{false}}' },
+ customRule: { value: null },
+ },
+ properties: {
+ advanced: { value: `{{false}}` },
+ schema: {
+ value:
+ "{{[\t{label: 'option1',value: 1,disable: false,visible: true,default: true},{label: 'option2',value: 2,disable: false,visible: true},{label: 'option3',value: 3,disable: false,visible: true}\t]}}",
+ },
+ options: {
+ value: [
+ {
+ label: 'option1',
+ value: '1',
+ disable: { value: false },
+ visible: { value: true },
+ default: { value: false },
+ },
+ {
+ label: 'option2',
+ value: '2',
+ disable: { value: false },
+ visible: { value: true },
+ default: { value: true },
+ },
+ {
+ label: 'option3',
+ value: '3',
+ disable: { value: false },
+ visible: { value: true },
+ default: { value: false },
+ },
+ ],
+ },
+ label: { value: 'Select' },
+ value: { value: '{{"2"}}' },
+ optionsLoadingState: { value: '{{false}}' },
+ placeholder: { value: 'Select an option' },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ loadingState: { value: '{{false}}' },
+ tooltip: { value: '' },
+ },
+ events: [],
+ styles: {
+ labelColor: { value: '#1B1F24' },
+ labelWidth: { value: '33' },
+ auto: { value: '{{true}}' },
+ fieldBorderRadius: { value: '6' },
+ selectedTextColor: { value: '#1B1F24' },
+ fieldBorderColor: { value: '#CCD1D5' },
+ errTextColor: { value: '#D72D39' },
+ fieldBackgroundColor: { value: '#fff' },
+ direction: { value: 'left' },
+ alignment: { value: 'side' },
+ padding: { value: 'default' },
+ boxShadow: { value: '0px 0px 0px 0px #00000090' },
+ icon: { value: 'IconHome2' },
+ iconVisibility: { value: false },
+ iconColor: { value: '#6A727C' },
+ accentColor: { value: '#4368E3' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/filepicker.js b/server/src/helpers/widget-config/filepicker.js
new file mode 100644
index 0000000000..8df492daa5
--- /dev/null
+++ b/server/src/helpers/widget-config/filepicker.js
@@ -0,0 +1,192 @@
+export const filepickerConfig = {
+ name: 'FilePicker',
+ displayName: 'File Picker',
+ description: 'File Picker',
+ component: 'FilePicker',
+ defaultSize: {
+ width: 15,
+ height: 100,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ actions: [
+ {
+ handle: 'clearFiles',
+ displayName: 'Clear Files',
+ },
+ ],
+ properties: {
+ instructionText: {
+ type: 'code',
+ displayName: 'Instruction text',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'Instruction text',
+ },
+ },
+ enableDropzone: {
+ type: 'code',
+ displayName: 'Use drop zone',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ enablePicker: {
+ type: 'code',
+ displayName: 'Use file picker',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ enableMultiple: {
+ type: 'code',
+ displayName: 'Pick multiple files',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ maxFileCount: {
+ type: 'code',
+ displayName: 'Max file count',
+ validation: {
+ schema: {
+ type: 'union',
+ schemas: [{ type: 'string' }, { type: 'number' }],
+ },
+ defaultValue: 2,
+ },
+ },
+ fileType: {
+ type: 'code',
+ displayName: 'Accept file types',
+ validation: {
+ schema: {
+ type: 'string',
+ },
+ defaultValue: 'image/*',
+ },
+ },
+ maxSize: {
+ type: 'code',
+ displayName: 'Max size limit (Bytes)',
+ validation: {
+ schema: {
+ type: 'union',
+ schemas: [{ type: 'string' }, { type: 'number' }],
+ },
+ defaultValue: 1048576,
+ },
+ },
+ minSize: {
+ type: 'code',
+ displayName: 'Min size limit (Bytes)',
+ validation: {
+ schema: {
+ type: 'union',
+ schemas: [{ type: 'string' }, { type: 'number' }],
+ },
+ defaultValue: 50,
+ },
+ },
+ parseContent: {
+ type: 'toggle',
+ displayName: 'Parse content',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defaultValue: false,
+ },
+ },
+ parseFileType: {
+ type: 'select',
+ displayName: 'File type',
+ options: [
+ { name: 'Autodetect from extension', value: 'auto-detect' },
+ { name: 'CSV', value: 'csv' },
+ { name: 'Microsoft Excel - xls', value: 'vnd.ms-excel' },
+ {
+ name: 'Microsoft Excel - xlsx',
+ value: 'vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+ },
+ ],
+ validation: {
+ schema: {
+ type: 'string',
+ },
+ defaultValue: 'auto-detect',
+ },
+ },
+ },
+ events: {
+ onFileSelected: { displayName: 'On File Selected' },
+ onFileLoaded: { displayName: 'On File Loaded' },
+ onFileDeselected: { displayName: 'On File Deselected' },
+ },
+ styles: {
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defaultValue: true,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defaultValue: false,
+ },
+ },
+ borderRadius: {
+ type: 'code',
+ displayName: 'Border radius',
+ validation: {
+ schema: {
+ type: 'union',
+ schemas: [{ type: 'string' }, { type: 'number' }],
+ },
+ defaultValue: 4,
+ },
+ },
+ },
+ exposedVariables: {
+ file: [{ name: '', content: '', dataURL: '', type: '', parsedData: '' }],
+ isParsing: false,
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ instructionText: { value: 'Drag and drop files here or click to select files' },
+ enableDropzone: { value: '{{true}}' },
+ enablePicker: { value: '{{true}}' },
+ maxFileCount: { value: '{{2}}' },
+ enableMultiple: { value: '{{false}}' },
+ fileType: { value: '{{"image/*"}}' },
+ maxSize: { value: '{{1048576}}' },
+ minSize: { value: '{{50}}' },
+ parseContent: { value: '{{false}}' },
+ parseFileType: { value: 'auto-detect' },
+ },
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ borderRadius: { value: '{{4}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/form.js b/server/src/helpers/widget-config/form.js
new file mode 100644
index 0000000000..ac82fcb171
--- /dev/null
+++ b/server/src/helpers/widget-config/form.js
@@ -0,0 +1,330 @@
+export const formConfig = {
+ name: 'Form',
+ displayName: 'Form',
+ description: 'Wrapper for multiple components',
+ defaultSize: {
+ width: 13,
+ height: 330,
+ },
+ defaultChildren: [
+ {
+ componentName: 'Text',
+ layout: {
+ top: 40,
+ left: 10,
+ height: 30,
+ width: 17,
+ },
+ properties: ['text'],
+ styles: [
+ 'textSize',
+ 'fontWeight',
+ 'fontStyle',
+ 'textColor',
+ 'isScrollRequired',
+ 'lineHeight',
+ 'textIndent',
+ 'textAlign',
+ 'verticalAlignment',
+ 'decoration',
+ 'transformation',
+ 'letterSpacing',
+ 'wordSpacing',
+ 'fontVariant',
+ 'backgroundColor',
+ 'borderColor',
+ 'borderRadius',
+ 'boxShadow',
+ 'padding',
+ ],
+ defaultValue: {
+ text: 'User Details',
+ fontWeight: 'bold',
+ textSize: 18,
+ textColor: '#000',
+ backgroundColor: '#fff00000',
+ textAlign: 'left',
+ decoration: 'none',
+ transformation: 'none',
+ fontStyle: 'normal',
+ lineHeight: 1.5,
+ textIndent: '0',
+ letterSpacing: '0',
+ wordSpacing: '0',
+ fontVariant: 'normal',
+ verticalAlignment: 'top',
+ padding: 'default',
+ boxShadow: '0px 0px 0px 0px #00000090',
+ borderRadius: '0',
+ isScrollRequired: 'enabled',
+ },
+ },
+ {
+ componentName: 'Text',
+ layout: {
+ top: 90,
+ left: 10,
+ height: 30,
+ },
+ properties: ['text'],
+ styles: [
+ 'textSize',
+ 'fontWeight',
+ 'fontStyle',
+ 'textColor',
+ 'isScrollRequired',
+ 'lineHeight',
+ 'textIndent',
+ 'textAlign',
+ 'verticalAlignment',
+ 'decoration',
+ 'transformation',
+ 'letterSpacing',
+ 'wordSpacing',
+ 'fontVariant',
+ 'backgroundColor',
+ 'borderColor',
+ 'borderRadius',
+ 'boxShadow',
+ 'padding',
+ ],
+ defaultValue: {
+ text: 'Name',
+ fontWeight: 'normal',
+ textSize: 14,
+ textColor: '#000',
+ backgroundColor: '#fff00000',
+ textAlign: 'left',
+ decoration: 'none',
+ transformation: 'none',
+ fontStyle: 'normal',
+ lineHeight: 1.5,
+ textIndent: '0',
+ letterSpacing: '0',
+ wordSpacing: '0',
+ fontVariant: 'normal',
+ verticalAlignment: 'top',
+ padding: 'default',
+ boxShadow: '0px 0px 0px 0px #00000090',
+ borderRadius: '0',
+ isScrollRequired: 'enabled',
+ },
+ },
+ {
+ componentName: 'Text',
+ layout: {
+ top: 160,
+ left: 10,
+ height: 30,
+ },
+ properties: ['text'],
+ styles: [
+ 'textSize',
+ 'fontWeight',
+ 'fontStyle',
+ 'textColor',
+ 'isScrollRequired',
+ 'lineHeight',
+ 'textIndent',
+ 'textAlign',
+ 'verticalAlignment',
+ 'decoration',
+ 'transformation',
+ 'letterSpacing',
+ 'wordSpacing',
+ 'fontVariant',
+ 'backgroundColor',
+ 'borderColor',
+ 'borderRadius',
+ 'boxShadow',
+ 'padding',
+ ],
+ defaultValue: {
+ text: 'Age',
+ fontWeight: 'normal',
+ textSize: 14,
+ textColor: '#000',
+ backgroundColor: '#fff00000',
+ textAlign: 'left',
+ decoration: 'none',
+ transformation: 'none',
+ fontStyle: 'normal',
+ lineHeight: 1.5,
+ textIndent: '0',
+ letterSpacing: '0',
+ wordSpacing: '0',
+ fontVariant: 'normal',
+ verticalAlignment: 'top',
+ padding: 'default',
+ boxShadow: '0px 0px 0px 0px #00000090',
+ borderRadius: '0',
+ isScrollRequired: 'enabled',
+ },
+ },
+ {
+ componentName: 'TextInput',
+ layout: {
+ top: 120,
+ left: 10,
+ height: 30,
+ width: 25,
+ },
+ properties: ['placeholder', 'label'],
+ defaultValue: {
+ placeholder: 'Enter your name',
+ label: '',
+ },
+ },
+ {
+ componentName: 'NumberInput',
+ layout: {
+ top: 190,
+ left: 10,
+ height: 30,
+ width: 25,
+ },
+ properties: ['value', 'label'],
+ defaultValue: {
+ value: 24,
+ label: '',
+ },
+ },
+ {
+ componentName: 'Button',
+ layout: {
+ top: 240,
+ left: 10,
+ height: 30,
+ width: 10,
+ },
+ properties: ['text'],
+ defaultValue: {
+ text: 'Submit',
+ },
+ },
+ ],
+ component: 'Form',
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ buttonToSubmit: {
+ type: 'select',
+ displayName: 'Button to submit form',
+ options: [{ name: 'None', value: 'none' }],
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'none',
+ },
+ conditionallyRender: {
+ key: 'advanced',
+ value: false,
+ },
+ },
+ loadingState: {
+ type: 'toggle',
+ displayName: 'Loading state',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ advanced: {
+ type: 'toggle',
+ displayName: ' Use custom schema',
+ },
+ JSONSchema: {
+ type: 'code',
+ displayName: 'JSON Schema',
+ conditionallyRender: {
+ key: 'advanced',
+ value: true,
+ },
+ },
+ },
+ events: {
+ onSubmit: { displayName: 'On submit' },
+ onInvalid: { displayName: 'On invalid' },
+ },
+ styles: {
+ backgroundColor: {
+ type: 'color',
+ displayName: 'Background color',
+ validation: {
+ schema: { type: 'string' },
+ },
+ },
+ borderRadius: {
+ type: 'code',
+ displayName: 'Border radius',
+ validation: {
+ schema: {
+ type: 'union',
+ schemas: [{ type: 'string' }, { type: 'number' }],
+ },
+ defaultValue: 0,
+ },
+ },
+ borderColor: {
+ type: 'color',
+ displayName: 'Border color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#fff',
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ },
+ exposedVariables: {
+ data: {},
+ isValid: true,
+ },
+ actions: [
+ {
+ handle: 'submitForm',
+ displayName: 'Submit Form',
+ },
+ {
+ handle: 'resetForm',
+ displayName: 'Reset Form',
+ },
+ ],
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ loadingState: { value: '{{false}}' },
+ advanced: { value: '{{false}}' },
+ JSONSchema: {
+ value:
+ "{{ {title: 'User registration form', properties: {firstname: {type: 'textinput',value: 'Maria',label:'First name', validation:{maxLength:6}, styles: {backgroundColor: '#f6f5ff',textColor: 'black'},},lastname:{type: 'textinput',value: 'Doe', label:'Last name', styles: {backgroundColor: '#f6f5ff',textColor: 'black'},},age:{type:'number', label:'Age'},}, submitButton: {value: 'Submit', styles: {backgroundColor: '#3a433b',borderColor:'#595959'}}} }}",
+ },
+ },
+ events: [],
+ styles: {
+ backgroundColor: { value: '#fff' },
+ borderRadius: { value: '0' },
+ borderColor: { value: '#fff' },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/html.js b/server/src/helpers/widget-config/html.js
new file mode 100644
index 0000000000..85b16b4a21
--- /dev/null
+++ b/server/src/helpers/widget-config/html.js
@@ -0,0 +1,52 @@
+export const htmlConfig = {
+ name: 'Html',
+ displayName: 'HTML Viewer',
+ description: 'View HTML content',
+ component: 'Html',
+ defaultSize: {
+ width: 10,
+ height: 310,
+ },
+ properties: {
+ rawHtml: {
+ type: 'code',
+ displayName: 'Raw HTML',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: `
Hello World
`,
+ },
+ },
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ events: {},
+ styles: {
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ },
+ exposedVariables: {},
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ rawHtml: {
+ value: `You can build your custom HTML-CSS template here`,
+ },
+ },
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/icon.js b/server/src/helpers/widget-config/icon.js
new file mode 100644
index 0000000000..a64e7a486b
--- /dev/null
+++ b/server/src/helpers/widget-config/icon.js
@@ -0,0 +1,72 @@
+export const iconConfig = {
+ name: 'Icon',
+ displayName: 'Icon',
+ description: 'Icon',
+ defaultSize: {
+ width: 5,
+ height: 48,
+ },
+ component: 'Icon',
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ icon: {
+ type: 'iconPicker',
+ displayName: 'Icon',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'IconHome2',
+ },
+ },
+ },
+ events: {
+ onClick: { displayName: 'On click' },
+ onHover: { displayName: 'On hover' },
+ },
+ styles: {
+ iconColor: {
+ type: 'color',
+ displayName: 'Icon color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#000',
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ },
+ exposedVariables: {},
+ actions: [
+ {
+ handle: 'click',
+ displayName: 'Click',
+ },
+ {
+ displayName: 'Set Visibility',
+ handle: 'setVisibility',
+ params: [{ handle: 'value', displayName: 'Value', defaultValue: '{{true}}', type: 'toggle' }],
+ },
+ ],
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ icon: { value: 'IconHome2' },
+ },
+ events: [],
+ styles: {
+ iconColor: { value: '#000' },
+ visibility: { value: '{{true}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/iframe.js b/server/src/helpers/widget-config/iframe.js
new file mode 100644
index 0000000000..cbafe19d3a
--- /dev/null
+++ b/server/src/helpers/widget-config/iframe.js
@@ -0,0 +1,59 @@
+export const iframeConfig = {
+ name: 'Iframe',
+ displayName: 'Iframe',
+ description: 'Embed external content',
+ defaultSize: {
+ width: 10,
+ height: 310,
+ },
+ component: 'IFrame',
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ source: {
+ type: 'code',
+ displayName: 'URL',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'https://tooljet.io/',
+ },
+ },
+ },
+ events: {},
+ styles: {
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ },
+ exposedVariables: {},
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ source: { value: 'https://tooljet.io/' },
+ visible: { value: '{{true}}' },
+ },
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/image.js b/server/src/helpers/widget-config/image.js
new file mode 100644
index 0000000000..7f15fbb6c5
--- /dev/null
+++ b/server/src/helpers/widget-config/image.js
@@ -0,0 +1,145 @@
+export const imageConfig = {
+ name: 'Image',
+ displayName: 'Image',
+ description: 'Show image files',
+ defaultSize: {
+ width: 3,
+ height: 100,
+ },
+ component: 'Image',
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ source: {
+ type: 'code',
+ displayName: 'URL',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'https://www.svgrepo.com/image.svg',
+ },
+ },
+ loadingState: {
+ type: 'toggle',
+ displayName: 'Loading state',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ alternativeText: {
+ type: 'code',
+ displayName: 'Alternative text',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'this is an image',
+ },
+ },
+ zoomButtons: {
+ type: 'toggle',
+ displayName: 'Zoom button',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ rotateButton: {
+ type: 'toggle',
+ displayName: 'Rotate button',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ },
+ events: {
+ onClick: { displayName: 'On click' },
+ },
+ styles: {
+ borderType: {
+ type: 'select',
+ displayName: 'Border type',
+ options: [
+ { name: 'None', value: 'none' },
+ { name: 'Rounded', value: 'rounded' },
+ { name: 'Circle', value: 'rounded-circle' },
+ { name: 'Thumbnail', value: 'img-thumbnail' },
+ ],
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'none',
+ },
+ },
+ backgroundColor: {
+ type: 'color',
+ displayName: 'Background color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#ffffff',
+ },
+ },
+ padding: {
+ type: 'code',
+ displayName: 'Padding',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 0,
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ imageFit: {
+ type: 'select',
+ displayName: 'Image fit',
+ options: [
+ { name: 'fill', value: 'fill' },
+ { name: 'contain', value: 'contain' },
+ { name: 'cover', value: 'cover' },
+ { name: 'scale-down', value: 'scale-down' },
+ ],
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'contain',
+ },
+ },
+ },
+ exposedVariables: {},
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ source: { value: 'https://www.svgrepo.com/show/34217/image.svg' },
+ visible: { value: '{{true}}' },
+ loadingState: { value: '{{false}}' },
+ alternativeText: { value: '' },
+ zoomButtons: { value: '{{false}}' },
+ rotateButton: { value: '{{false}}' },
+ },
+ events: [],
+ styles: {
+ borderType: { value: 'none' },
+ padding: { value: '0' },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ imageFit: { value: 'contain' },
+ backgroundColor: { value: '' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/index.js b/server/src/helpers/widget-config/index.js
new file mode 100644
index 0000000000..54a6964eff
--- /dev/null
+++ b/server/src/helpers/widget-config/index.js
@@ -0,0 +1,158 @@
+import { buttonConfig } from './button';
+import { tableConfig } from './table';
+import { chartConfig } from './chart';
+import { modalConfig } from './modal';
+import { formConfig } from './form';
+import { textinputConfig } from './textinput';
+import { numberinputConfig } from './numberinput';
+import { passinputConfig } from './passwordinput';
+import { datepickerConfig } from './datepicker';
+import { checkboxConfig } from './checkbox';
+import { radiobuttonConfig } from './radiobutton';
+import { toggleswitchConfig } from './toggleswitch';
+import { toggleSwitchV2Config } from './toggleswitchv2';
+import { textareaConfig } from './textarea';
+import { daterangepickerConfig } from './daterangepicker';
+import { textConfig } from './text';
+import { imageConfig } from './image';
+import { containerConfig } from './container';
+import { dropdownConfig } from './dropdown';
+import { dropdownV2Config } from './dropdownV2';
+import { multiselectConfig } from './multiselect';
+import { multiselectV2Config } from './multiselectV2';
+import { richtextareaConfig } from './richtextarea';
+import { mapConfig } from './map';
+import { qrscannerConfig } from './qrscanner';
+import { starratingConfig } from './starrating';
+import { dividerConfig } from './divider';
+import { filepickerConfig } from './filepicker';
+import { calendarConfig } from './calendar';
+import { iframeConfig } from './iframe';
+import { codeEditorConfig } from './codeEditor';
+import { tabsConfig } from './tabs';
+import { timerConfig } from './timer';
+import { listviewConfig } from './listview';
+import { tagsConfig } from './tags';
+import { paginationConfig } from './pagination';
+import { circularProgressbarConfig } from './circularProgressbar';
+import { spinnerConfig } from './spinner';
+import { statisticsConfig } from './statistics';
+import { rangeSliderConfig } from './rangeslider';
+import { timelineConfig } from './timeline';
+import { svgImageConfig } from './svgImage';
+import { htmlConfig } from './html';
+import { verticalDividerConfig } from './verticalDivider';
+import { customComponentConfig } from './customComponent';
+import { buttonGroupConfig } from './buttonGroup';
+import { pdfConfig } from './pdf';
+import { stepsConfig } from './steps';
+import { kanbanConfig } from './kanban';
+import { colorPickerConfig } from './colorPicker';
+import { treeSelectConfig } from './treeSelect';
+import { linkConfig } from './link';
+import { iconConfig } from './icon';
+import { boundedBoxConfig } from './boundedBox';
+import { kanbanBoardConfig } from './kanbanBoard';
+
+const widgets = {
+ buttonConfig,
+ tableConfig,
+ chartConfig,
+ modalConfig,
+ formConfig,
+ textinputConfig,
+ numberinputConfig,
+ passinputConfig,
+ datepickerConfig,
+ checkboxConfig,
+ radiobuttonConfig,
+ toggleswitchConfig, //!Depreciated
+ toggleSwitchV2Config,
+ textareaConfig,
+ daterangepickerConfig,
+ textConfig,
+ imageConfig,
+ containerConfig,
+ dropdownConfig, //!Depreciated
+ dropdownV2Config,
+ multiselectConfig,
+ multiselectV2Config, //!Depreciated
+ richtextareaConfig,
+ mapConfig,
+ qrscannerConfig,
+ starratingConfig,
+ dividerConfig,
+ filepickerConfig,
+ calendarConfig,
+ iframeConfig,
+ codeEditorConfig,
+ tabsConfig,
+ timerConfig,
+ listviewConfig,
+ tagsConfig,
+ paginationConfig,
+ circularProgressbarConfig,
+ spinnerConfig,
+ statisticsConfig,
+ rangeSliderConfig,
+ timelineConfig,
+ svgImageConfig,
+ htmlConfig,
+ verticalDividerConfig,
+ customComponentConfig,
+ buttonGroupConfig,
+ pdfConfig,
+ stepsConfig,
+ kanbanConfig,
+ kanbanBoardConfig, //!Depreciated
+ colorPickerConfig,
+ treeSelectConfig,
+ linkConfig,
+ iconConfig,
+ boundedBoxConfig,
+};
+
+const universalProps = {
+ properties: {},
+ general: {
+ tooltip: { type: 'code', displayName: 'Tooltip', validation: { schema: { type: 'string' } } },
+ },
+ others: {},
+ events: {},
+ styles: {},
+ validate: true,
+ generalStyles: {
+ boxShadow: { type: 'boxShadow', displayName: 'Box Shadow' },
+ },
+ definition: {
+ others: {},
+ events: [],
+ styles: {},
+ generalStyles: {
+ boxShadow: { value: '0px 0px 0px 0px #00000040' },
+ },
+ },
+};
+
+const combineProperties = (widget, universal, isArray = false) => {
+ return {
+ ...universal,
+ ...widget,
+ properties: { ...universal.properties, ...widget.properties },
+ general: { ...universal.general, ...widget.general },
+ others: { ...universal.others, ...widget.others },
+ events: isArray ? [...universal.events, ...widget.events] : { ...universal.events, ...widget.events },
+ styles: { ...universal.styles, ...widget.styles },
+ generalStyles: { ...universal.generalStyles, ...widget.generalStyles },
+ exposedVariables: { ...universal.exposedVariables, ...widget.exposedVariables },
+ };
+};
+
+export const componentTypes = Object.values(widgets).map((widget) => {
+ return {
+ ...combineProperties(widget, universalProps),
+ definition: combineProperties(widget.definition, universalProps.definition, true),
+ };
+});
+
+export default widgets;
diff --git a/server/src/helpers/widget-config/kanban.js b/server/src/helpers/widget-config/kanban.js
new file mode 100644
index 0000000000..0705581c51
--- /dev/null
+++ b/server/src/helpers/widget-config/kanban.js
@@ -0,0 +1,163 @@
+export const kanbanConfig = {
+ name: 'Kanban',
+ displayName: 'Kanban',
+ description: 'Task management board',
+ component: 'Kanban',
+ defaultSize: {
+ width: 40,
+ height: 490,
+ },
+ defaultChildren: [
+ {
+ componentName: 'Text',
+ layout: {
+ top: 20,
+ left: 4,
+ height: 30,
+ },
+ properties: ['text'],
+ accessorKey: 'text',
+ styles: ['fontWeight', 'textSize', 'textColor'],
+ defaultValue: {
+ text: '{{cardData.title}}',
+ fontWeight: 'bold',
+ textSize: 16,
+ textColor: '#000',
+ },
+ },
+ {
+ componentName: 'Text',
+ layout: {
+ top: 50,
+ left: 4,
+ height: 30,
+ },
+ properties: ['text'],
+ accessorKey: 'text',
+ styles: ['textSize', 'textColor'],
+ defaultValue: {
+ text: '{{cardData.description}}',
+ textSize: 14,
+ textColor: '#000',
+ },
+ },
+ ],
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ columnData: { type: 'code', displayName: 'Column data' },
+ cardData: { type: 'code', displayName: 'Card data' },
+ cardWidth: {
+ type: 'code',
+ displayName: 'Card width',
+ validation: {
+ schema: { type: 'number' },
+ },
+ },
+ cardHeight: {
+ type: 'code',
+ displayName: 'Card height',
+ validation: {
+ schema: { type: 'number' },
+ },
+ },
+ enableAddCard: { type: 'toggle', displayName: 'Enable add card' },
+ showDeleteButton: { type: 'toggle', displayName: 'Show delete button' },
+ },
+ events: {
+ onUpdate: { displayName: 'On update' },
+ onAddCardClick: { displayName: 'On add card click' },
+ onCardRemoved: { displayName: 'Card removed' },
+ onCardAdded: { displayName: 'Card added' },
+ onCardMoved: { displayName: 'Card moved' },
+ onCardSelected: { displayName: 'Card selected' },
+ },
+ styles: {
+ disabledState: { type: 'toggle', displayName: 'Disable' },
+ visibility: { type: 'toggle', displayName: 'Visibility' },
+ accentColor: { type: 'color', displayName: 'Accent color' },
+ },
+ actions: [
+ {
+ handle: 'addCard',
+ displayName: 'Add Card',
+ params: [
+ {
+ handle: 'cardDetails',
+ displayName: 'Card Details',
+ defaultValue: `{{{ id: "c11", title: "Title 11", description: "Description 11", columnId: "r3" }}}`,
+ },
+ ],
+ },
+ {
+ handle: 'deleteCard',
+ displayName: 'Delete Card',
+ params: [{ handle: 'id', displayName: 'Card Id', defaultValue: `{{components.kanban1?.lastSelectedCard?.id}}` }],
+ },
+ {
+ handle: 'moveCard',
+ displayName: 'Move Card',
+ params: [
+ { handle: 'cardId', displayName: 'Card Id', defaultValue: `{{components.kanban1?.lastSelectedCard?.id}}` },
+ { handle: 'columnId', displayName: 'Destination Column Id', defaultValue: '' },
+ ],
+ },
+ {
+ handle: 'updateCardData',
+ displayName: 'Update Card Data',
+ params: [
+ { handle: 'id', displayName: 'Card Id', defaultValue: `{{components.kanban1?.lastSelectedCard?.id}}` },
+ {
+ handle: 'value',
+ displayName: 'Value',
+ defaultValue: `{{{...components.kanban1?.lastSelectedCard, title: 'New Title'}}}`,
+ },
+ ],
+ },
+ ],
+ exposedVariables: {
+ updatedCardData: {},
+ lastAddedCard: {},
+ lastRemovedCard: {},
+ lastCardMovement: {},
+ lastSelectedCard: {},
+ lastUpdatedCard: {},
+ lastCardUpdate: [],
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ columnData: {
+ value:
+ '{{[{ "id": "r1", "title": "To Do" },{ "id": "r2", "title": "In Progress" },{ "id": "r3", "title": "Done" }]}}',
+ },
+ cardData: {
+ value:
+ '{{[{ id: "c1", title: "Title 1", description: "Description 1", columnId: "r1" },{ id: "c2", title: "Title 2", description: "Description 2", columnId: "r1" },{ id: "c3", title: "Title 3", description: "Description 3",columnId: "r2" },{ id: "c4", title: "Title 4", description: "Description 4",columnId: "r3" },{ id: "c5", title: "Title 5", description: "Description 5",columnId: "r3" }, { id: "c6", title: "Title 6", description: "Description 6", columnId: "r1" },{ id: "c7", title: "Title 7", description: "Description 7", columnId: "r1" },{ id: "c8", title: "Title 8", description: "Description 8",columnId: "r2" },{ id: "c9", title: "Title 9", description: "Description 9",columnId: "r3" },{ id: "c10", title: "Title 10", description: "Description 10",columnId: "r3" }]}}',
+ },
+ cardWidth: {
+ value: '{{302}}',
+ },
+ cardHeight: {
+ value: '{{100}}',
+ },
+ enableAddCard: {
+ value: `{{true}}`,
+ },
+ showDeleteButton: {
+ value: `{{true}}`,
+ },
+ },
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ accentColor: { value: '#4d72fa' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/kanbanBoard.js b/server/src/helpers/widget-config/kanbanBoard.js
new file mode 100644
index 0000000000..4929bad9fe
--- /dev/null
+++ b/server/src/helpers/widget-config/kanbanBoard.js
@@ -0,0 +1,68 @@
+//! KanbanBoard widget is deprecated. This config allows backward compatibility with existing KanbanBoard widgets.
+
+export const kanbanBoardConfig = {
+ name: 'KanbanBoard',
+ displayName: 'Kanban Board',
+ description: 'Task management board',
+ component: 'KanbanBoard',
+ defaultSize: {
+ width: 40,
+ height: 490,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ columns: { type: 'code', displayName: 'Columns' },
+ cardData: { type: 'code', displayName: 'Card Data' },
+ enableAddCard: { type: 'toggle', displayName: 'Enable Add Card' },
+ },
+ events: {
+ onCardAdded: { displayName: 'Card added' },
+ onCardRemoved: { displayName: 'Card removed' },
+ onCardMoved: { displayName: 'Card moved' },
+ onCardSelected: { displayName: 'Card selected' },
+ onCardUpdated: { displayName: 'Card updated' },
+ },
+ styles: {
+ disabledState: { type: 'toggle', displayName: 'Disable' },
+ visibility: { type: 'toggle', displayName: 'Visibility' },
+ width: { type: 'number', displayName: 'Width' },
+ minWidth: { type: 'number', displayName: 'Min Width' },
+ accentColor: { type: 'color', displayName: 'Accent color' },
+ },
+ exposedVariables: {
+ columns: {},
+ lastAddedCard: {},
+ lastRemovedCard: {},
+ lastCardMovement: {},
+ lastUpdatedCard: {},
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ columns: {
+ value: '{{[{ "id": "1", "title": "to do" },{ "id": "2", "title": "in progress" }]}}',
+ },
+ cardData: {
+ value:
+ '{{[{ id: "01", title: "one", columnId: "1" },{ id: "02", title: "two", columnId: "1" },{ id: "03", title: "three", columnId: "2" }]}}',
+ },
+ enableAddCard: {
+ value: `{{true}}`,
+ },
+ },
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ width: { value: '{{400}}' },
+ minWidth: { value: '{{200}}' },
+ textColor: { value: '' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/link.js b/server/src/helpers/widget-config/link.js
new file mode 100644
index 0000000000..bf419e16c0
--- /dev/null
+++ b/server/src/helpers/widget-config/link.js
@@ -0,0 +1,111 @@
+export const linkConfig = {
+ name: 'Link',
+ displayName: 'Link',
+ description: 'Add link to the text',
+ defaultSize: {
+ width: 6,
+ height: 30,
+ },
+ component: 'Link',
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ linkTarget: {
+ type: 'code',
+ displayName: 'Link target',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'https://dev.to/',
+ },
+ },
+ linkText: {
+ type: 'code',
+ displayName: 'Link text',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'Click here',
+ },
+ },
+ targetType: {
+ type: 'select',
+ displayName: 'Target type',
+ options: [
+ { name: 'New Tab', value: 'new' },
+ { name: 'Same Tab', value: 'same' },
+ ],
+ validation: {
+ schema: { type: 'string' },
+ },
+ },
+ },
+ events: {
+ onClick: { displayName: 'On click' },
+ onHover: { displayName: 'On hover' },
+ },
+ styles: {
+ textColor: {
+ type: 'color',
+ displayName: 'Text color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#375FCF',
+ },
+ },
+ textSize: {
+ type: 'number',
+ displayName: 'Text size',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 14,
+ },
+ },
+ underline: {
+ type: 'select',
+ displayName: 'Underline',
+ options: [
+ { name: 'Never', value: 'no-underline' },
+ { name: 'On Hover', value: 'on-hover' },
+ { name: 'Always', value: 'underline' },
+ ],
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'on-hover',
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ },
+ exposedVariables: {},
+ actions: [
+ {
+ handle: 'click',
+ displayName: 'Click',
+ },
+ ],
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ linkTarget: { value: 'https://dev.to/' },
+ linkText: { value: 'Click here' },
+ targetType: { value: 'new' },
+ },
+ events: [],
+ styles: {
+ textColor: { value: '#375FCF' },
+ textSize: { value: '{{14}}' },
+ underline: { value: 'on-hover' },
+ visibility: { value: '{{true}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/listview.js b/server/src/helpers/widget-config/listview.js
new file mode 100644
index 0000000000..a813bb5a0b
--- /dev/null
+++ b/server/src/helpers/widget-config/listview.js
@@ -0,0 +1,198 @@
+export const listviewConfig = {
+ name: 'Listview',
+ displayName: 'List View',
+ description: 'List multiple items',
+ defaultSize: {
+ width: 30,
+ height: 300,
+ },
+ defaultChildren: [
+ {
+ componentName: 'Image',
+ layout: {
+ top: 15,
+ left: 3,
+ height: 100,
+ },
+ properties: ['source'],
+ accessorKey: 'imageURL',
+ },
+ {
+ componentName: 'Text',
+ layout: {
+ top: 50,
+ left: 11,
+ height: 30,
+ },
+ properties: ['text'],
+ accessorKey: 'text',
+ },
+ {
+ componentName: 'Button',
+ layout: {
+ top: 50,
+ left: 26,
+ height: 30,
+ },
+ incrementWidth: 2,
+ properties: ['text'],
+ accessorKey: 'buttonText',
+ },
+ ],
+ component: 'Listview',
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ data: {
+ type: 'code',
+ displayName: 'List data',
+ validation: {
+ schema: { type: 'array', element: { type: 'object' } },
+ defaultValue: "[{text: 'Sample text 1'}]",
+ },
+ },
+ mode: {
+ type: 'select',
+ displayName: 'Mode',
+ options: [
+ { name: 'list', value: 'list' },
+ { name: 'grid', value: 'grid' },
+ ],
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'list',
+ },
+ },
+ columns: {
+ type: 'number',
+ displayName: 'Columns',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 3,
+ },
+ conditionallyRender: {
+ key: 'mode',
+ value: 'grid',
+ },
+ },
+ rowHeight: {
+ type: 'code',
+ displayName: 'Row height',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 100,
+ },
+ },
+ showBorder: {
+ type: 'code',
+ displayName: 'Show bottom border',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ conditionallyRender: {
+ key: 'mode',
+ value: 'list',
+ },
+ },
+ enablePagination: {
+ type: 'toggle',
+ displayName: 'Enable pagination',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ rowsPerPage: {
+ type: 'code',
+ displayName: 'Rows per page',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 10,
+ },
+ },
+ },
+ events: {
+ onRowClicked: { displayName: 'Row clicked (Deprecated)' },
+ onRecordClicked: { displayName: 'Record clicked' },
+ },
+ styles: {
+ backgroundColor: {
+ type: 'color',
+ displayName: 'Background color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#fff',
+ },
+ },
+ borderColor: {
+ type: 'color',
+ displayName: 'Border color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#dadcde',
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ borderRadius: {
+ type: 'number',
+ displayName: 'Border radius',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 4,
+ },
+ },
+ },
+ exposedVariables: {
+ data: [{}],
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ data: {
+ value: `{{[
+ { imageURL: 'https://www.svgrepo.com/show/34217/image.svg', text: 'Sample text 1', buttonText: 'Button 1' },
+ { imageURL: 'https://www.svgrepo.com/show/34217/image.svg', text: 'Sample text 1', buttonText: 'Button 2' },
+ { imageURL: 'https://www.svgrepo.com/show/34217/image.svg', text: 'Sample text 1', buttonText: 'Button 3' },
+ ]}}`,
+ },
+ mode: { value: 'list' },
+ columns: { value: '{{3}}' },
+ rowHeight: {
+ value: '100',
+ },
+ visible: { value: '{{true}}' },
+ showBorder: { value: '{{true}}' },
+ rowsPerPage: { value: '{{10}}' },
+ enablePagination: { value: '{{false}}' },
+ },
+ events: [],
+ styles: {
+ backgroundColor: { value: '#fff' },
+ borderColor: { value: '#dadcde' },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ borderRadius: { value: '{{4}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/map.js b/server/src/helpers/widget-config/map.js
new file mode 100644
index 0000000000..fc8b04abd5
--- /dev/null
+++ b/server/src/helpers/widget-config/map.js
@@ -0,0 +1,152 @@
+export const mapConfig = {
+ name: 'Map',
+ displayName: 'Map',
+ description: 'Display map locations',
+ component: 'Map',
+ defaultSize: {
+ width: 16,
+ height: 420,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ initialLocation: {
+ type: 'code',
+ displayName: 'Initial location',
+ tip: 'This location will be the initial center of the map',
+ options: {
+ mode: 'javascript',
+ theme: 'duotone-light',
+ className: 'map-location-input pr-2',
+ },
+ validation: {
+ schema: {
+ type: 'union',
+ schemas: [{ type: 'array', element: { type: 'object' } }, { type: 'object' }],
+ },
+ defaultValue: `{{ {"lat": 40.7128, "lng": -73.935242} }}`,
+ },
+ },
+ defaultMarkers: {
+ type: 'code',
+ displayName: 'Default markers',
+ options: {
+ mode: 'javascript',
+ theme: 'duotone-light',
+ className: 'map-location-input pr-2',
+ },
+ validation: {
+ schema: {
+ type: 'union',
+ schemas: [{ type: 'array', element: { type: 'object' } }, { type: 'object' }],
+ },
+ defaultValue: `{{ [{"lat": 40.7128, "lng": -73.935242}] }}`,
+ },
+ },
+ polygonPoints: {
+ type: 'code',
+ displayName: 'Polygon points',
+ options: {
+ mode: 'javascript',
+ theme: 'duotone-light',
+ className: 'map-location-input pr-2',
+ },
+ validation: {
+ schema: {
+ type: 'union',
+ schemas: [{ type: 'array', element: { type: 'object' } }, { type: 'object' }],
+ },
+ defaultValue: `{{[{"lat": 40.7032, "lng": -73.975242},{"lat": 40.7532, "lng": -73.943242},{"lat": 40.7032, "lng": -73.916242}]}}`,
+ },
+ },
+ addNewMarkers: {
+ type: 'toggle',
+ displayName: 'Add new markers',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defaultValue: true,
+ },
+ },
+ canSearch: {
+ type: 'toggle',
+ displayName: 'Search for places',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defaultValue: true,
+ },
+ },
+ },
+ events: {
+ onBoundsChange: { displayName: 'On bounds change' },
+ onCreateMarker: { displayName: 'On create marker' },
+ onMarkerClick: { displayName: 'On marker click' },
+ onPolygonClick: { displayName: 'On polygon click' },
+ },
+ actions: [
+ {
+ handle: 'setLocation',
+ displayName: 'Set Location',
+ params: [
+ { handle: 'lat', displayName: 'Latitude' },
+ { handle: 'lng', displayName: 'Longitude' },
+ ],
+ },
+ ],
+ styles: {
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defaultValue: true,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defaultValue: false,
+ },
+ },
+ },
+ exposedVariables: {
+ center: {},
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ initialLocation: {
+ value: `{{ {"lat": 40.7128, "lng": -73.935242} }}`,
+ },
+ defaultMarkers: {
+ value: `{{ [{"lat": 40.7128, "lng": -73.935242}] }}`,
+ },
+ polygonPoints: {
+ value: `{{[\n\t\t{"lat": 40.7032, "lng": -73.975242},\n\t\t{"lat": 40.7532, "lng": -73.943242},\n\t\t{"lat": 40.7032, "lng": -73.916242}\n]}}`,
+ },
+ canSearch: {
+ value: `{{true}}`,
+ },
+ addNewMarkers: { value: `{{true}}` },
+ },
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/modal.js b/server/src/helpers/widget-config/modal.js
new file mode 100644
index 0000000000..60f791831e
--- /dev/null
+++ b/server/src/helpers/widget-config/modal.js
@@ -0,0 +1,195 @@
+export const modalConfig = {
+ name: 'Modal',
+ displayName: 'Modal',
+ description: 'Show pop-up windows',
+ component: 'Modal',
+ defaultSize: {
+ width: 10,
+ height: 34,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ title: {
+ type: 'code',
+ displayName: 'Title',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'This title can be changed',
+ },
+ },
+ titleAlignment: {
+ type: 'select',
+ displayName: 'Title alignment',
+ options: [
+ { name: 'left', value: 'left' },
+ { name: 'center', value: 'center' },
+ { name: 'right', value: 'right' },
+ ],
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'left',
+ },
+ },
+ loadingState: {
+ type: 'toggle',
+ displayName: 'Loading state',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ useDefaultButton: {
+ type: 'toggle',
+ displayName: 'Use default trigger button',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defaultValue: true,
+ },
+ },
+ triggerButtonLabel: {
+ type: 'code',
+ displayName: 'Trigger button label',
+ validation: {
+ schema: {
+ type: 'string',
+ },
+ defaultValue: 'Launch Modal',
+ },
+ },
+ hideTitleBar: { type: 'toggle', displayName: 'Hide title bar' },
+ hideCloseButton: { type: 'toggle', displayName: 'Hide close button' },
+ hideOnEsc: { type: 'toggle', displayName: 'Close on escape key' },
+ closeOnClickingOutside: { type: 'toggle', displayName: 'Close on clicking outside' },
+
+ size: {
+ type: 'select',
+ displayName: 'Modal size',
+ options: [
+ { name: 'small', value: 'sm' },
+ { name: 'medium', value: 'lg' },
+ { name: 'large', value: 'xl' },
+ ],
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'lg',
+ },
+ },
+ modalHeight: {
+ type: 'code',
+ displayName: 'Modal height',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '400px',
+ },
+ },
+ },
+ events: {
+ onOpen: { displayName: 'On open' },
+ onClose: { displayName: 'On close' },
+ },
+ styles: {
+ headerBackgroundColor: {
+ type: 'color',
+ displayName: 'Header background color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#ffffffff',
+ },
+ },
+ headerTextColor: {
+ type: 'color',
+ displayName: 'Header title color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#000000',
+ },
+ },
+ bodyBackgroundColor: {
+ type: 'color',
+ displayName: 'Body background color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#ffffffff',
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ triggerButtonBackgroundColor: {
+ type: 'color',
+ displayName: 'Trigger button background color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: false,
+ },
+ },
+ triggerButtonTextColor: {
+ type: 'color',
+ displayName: 'Trigger button text color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: false,
+ },
+ },
+ },
+ exposedVariables: {
+ show: false,
+ },
+ actions: [
+ {
+ handle: 'open',
+ displayName: 'Open',
+ },
+ {
+ handle: 'close',
+ displayName: 'Close',
+ },
+ ],
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ title: { value: 'This title can be changed' },
+ titleAlignment: { value: 'left' },
+ loadingState: { value: `{{false}}` },
+ useDefaultButton: { value: `{{true}}` },
+ triggerButtonLabel: { value: `Launch Modal` },
+ size: { value: 'lg' },
+ hideTitleBar: { value: '{{false}}' },
+ hideCloseButton: { value: '{{false}}' },
+ hideOnEsc: { value: '{{true}}' },
+ closeOnClickingOutside: { value: '{{false}}' },
+ modalHeight: { value: '400px' },
+ },
+ events: [],
+ styles: {
+ headerBackgroundColor: { value: '#ffffffff' },
+ headerTextColor: { value: '#000000' },
+ bodyBackgroundColor: { value: '#ffffffff' },
+ disabledState: { value: '{{false}}' },
+ visibility: { value: '{{true}}' },
+ triggerButtonBackgroundColor: { value: '#4D72FA' },
+ triggerButtonTextColor: { value: '#ffffffff' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/multiselect.js b/server/src/helpers/widget-config/multiselect.js
new file mode 100644
index 0000000000..5c4b5cf536
--- /dev/null
+++ b/server/src/helpers/widget-config/multiselect.js
@@ -0,0 +1,136 @@
+export const multiselectConfig = {
+ name: 'MultiselectLegacy',
+ displayName: 'Multiselect (Legacy)',
+ description: 'Multiple item selector',
+ defaultSize: {
+ width: 12,
+ height: 30,
+ },
+ component: 'Multiselect',
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ actions: [
+ {
+ handle: 'selectOption',
+ displayName: 'Select Option',
+ params: [
+ {
+ handle: 'option',
+ displayName: 'Option',
+ },
+ ],
+ },
+ {
+ handle: 'deselectOption',
+ displayName: 'Deselect Option',
+ params: [
+ {
+ handle: 'option',
+ displayName: 'Option',
+ },
+ ],
+ },
+ {
+ handle: 'clearSelections',
+ displayName: 'Clear selections',
+ },
+ ],
+ properties: {
+ label: {
+ type: 'code',
+ displayName: 'Label',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'Select',
+ },
+ },
+ value: {
+ type: 'code',
+ displayName: 'Default value',
+ validation: {
+ schema: { type: 'array', element: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] } },
+ defaultValue: "['two', 'three']",
+ },
+ },
+ values: {
+ type: 'code',
+ displayName: 'Option values',
+ validation: {
+ schema: { type: 'array', element: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] } },
+ defaultValue: "['one', 'two', 'three']",
+ },
+ },
+ display_values: {
+ type: 'code',
+ displayName: 'Option labels',
+ validation: {
+ schema: { type: 'array', element: { type: 'string' } },
+ defaultValue: "['one', 'two', 'three']",
+ },
+ },
+ showAllOption: {
+ type: 'toggle',
+ displayName: 'Enable select All option',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ },
+ events: {
+ onSelect: { displayName: 'On select' },
+ onSearchTextChanged: { displayName: 'On search text changed' },
+ },
+ styles: {
+ borderRadius: {
+ type: 'code',
+ displayName: 'Border radius',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 4,
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ },
+ exposedVariables: {
+ values: {},
+ searchText: '',
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ label: { value: 'Select' },
+ value: { value: '{{[2,3]}}' },
+ values: { value: '{{[1,2,3]}}' },
+ display_values: { value: '{{["one", "two", "three"]}}' },
+ visible: { value: '{{true}}' },
+ showAllOption: { value: '{{false}}' },
+ },
+ events: [],
+ styles: {
+ borderRadius: { value: '4' },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/multiselectV2.js b/server/src/helpers/widget-config/multiselectV2.js
new file mode 100644
index 0000000000..6aefd71067
--- /dev/null
+++ b/server/src/helpers/widget-config/multiselectV2.js
@@ -0,0 +1,371 @@
+export const multiselectV2Config = {
+ name: 'Multiselect',
+ displayName: 'Multiselect',
+ description: 'Multiple item selector',
+ defaultSize: {
+ width: 10,
+ height: 40,
+ },
+ component: 'MultiselectV2',
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ validation: {
+ mandatory: { type: 'toggle', displayName: 'Make this field mandatory' },
+ customRule: {
+ type: 'code',
+ displayName: 'Custom validation',
+ placeholder: `{{components.text2.text=='yes'&&'valid'}}`,
+ },
+ },
+ actions: [
+ {
+ handle: 'selectOptions',
+ displayName: 'Select Options',
+ params: [
+ {
+ handle: 'option',
+ displayName: 'Option',
+ },
+ ],
+ },
+ {
+ handle: 'deselectOptions',
+ displayName: 'Deselect Options',
+ params: [
+ {
+ handle: 'option',
+ displayName: 'Option',
+ },
+ ],
+ },
+ {
+ handle: 'clear',
+ displayName: 'Clear',
+ },
+ {
+ handle: 'setVisibility',
+ displayName: 'Set visibility',
+ params: [{ handle: 'setVisibility', displayName: 'Value', defaultValue: `{{true}}`, type: 'toggle' }],
+ },
+ {
+ handle: 'setLoading',
+ displayName: 'Set loading',
+ params: [{ handle: 'setLoading', displayName: 'Value', defaultValue: `{{false}}`, type: 'toggle' }],
+ },
+ {
+ handle: 'setDisable',
+ displayName: 'Set disable',
+ params: [{ handle: 'setDisable', displayName: 'Value', defaultValue: `{{false}}`, type: 'toggle' }],
+ },
+ ],
+ properties: {
+ label: {
+ type: 'code',
+ displayName: 'Label',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'Label',
+ },
+ accordian: 'Data',
+ },
+ placeholder: {
+ type: 'code',
+ displayName: 'Placeholder',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'Select the options',
+ },
+ accordian: 'Data',
+ },
+ advanced: {
+ type: 'toggle',
+ displayName: 'Dynamic options',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ accordian: 'Options',
+ },
+ value: {
+ type: 'code',
+ displayName: 'Default value',
+ conditionallyRender: {
+ key: 'advanced',
+ value: false,
+ },
+ validation: {
+ schema: {
+ type: 'union',
+ schemas: [{ type: 'string' }, { type: 'number' }, { type: 'boolean' }],
+ },
+ },
+ accordian: 'Options',
+ },
+ schema: {
+ type: 'code',
+ displayName: 'Schema',
+ conditionallyRender: {
+ key: 'advanced',
+ value: true,
+ },
+ accordian: 'Options',
+ },
+ showAllOption: {
+ type: 'toggle',
+ displayName: 'Enable select all option',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ accordian: 'Options',
+ },
+ optionsLoadingState: {
+ type: 'toggle',
+ displayName: 'Options loading state',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ accordian: 'Options',
+ },
+ loadingState: {
+ type: 'toggle',
+ displayName: 'Loading state',
+ validation: { schema: { type: 'boolean' }, defaultValue: true },
+ section: 'additionalActions',
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: { schema: { type: 'boolean' }, defaultValue: true },
+ section: 'additionalActions',
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: { schema: { type: 'boolean' }, defaultValue: true },
+ section: 'additionalActions',
+ },
+ tooltip: {
+ type: 'code',
+ displayName: 'Tooltip',
+ validation: { schema: { type: 'string' }, defaultValue: '' },
+ section: 'additionalActions',
+ placeholder: 'Enter tooltip text',
+ },
+ },
+ events: {
+ onSelect: { displayName: 'On select' },
+ onSearchTextChanged: { displayName: 'On search text changed' },
+ onFocus: { displayName: 'On focus' },
+ onBlur: { displayName: 'On blur' },
+ },
+
+ styles: {
+ labelColor: {
+ type: 'color',
+ displayName: 'Color',
+ validation: { schema: { type: 'string' }, defaultValue: '#1B1F24' },
+ accordian: 'label',
+ },
+ alignment: {
+ type: 'switch',
+ displayName: 'Alignment',
+ validation: { schema: { type: 'string' }, defaultValue: 'side' },
+ options: [
+ { displayName: 'Side', value: 'side' },
+ { displayName: 'Top', value: 'top' },
+ ],
+ accordian: 'label',
+ },
+ direction: {
+ type: 'switch',
+ displayName: 'Direction',
+ validation: { schema: { type: 'string' }, defaultValue: 'left' },
+ showLabel: false,
+ isIcon: true,
+ options: [
+ { displayName: 'alignleftinspector', value: 'left', iconName: 'alignleftinspector' },
+ { displayName: 'alignrightinspector', value: 'right', iconName: 'alignrightinspector' },
+ ],
+ accordian: 'label',
+ isFxNotRequired: true,
+ },
+ labelWidth: {
+ type: 'slider',
+ displayName: 'Width',
+ validation: { schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] } },
+ accordian: 'label',
+ conditionallyRender: {
+ key: 'alignment',
+ value: 'side',
+ },
+ isFxNotRequired: true,
+ },
+ auto: {
+ type: 'checkbox',
+ displayName: 'auto',
+ showLabel: false,
+ validation: { schema: { type: 'boolean' } },
+ accordian: 'label',
+ conditionallyRender: {
+ key: 'alignment',
+ value: 'side',
+ },
+ isFxNotRequired: true,
+ },
+
+ fieldBackgroundColor: {
+ type: 'color',
+ displayName: 'Background',
+ validation: { schema: { type: 'string' }, defaultValue: '#fff' },
+ accordian: 'field',
+ },
+
+ fieldBorderColor: {
+ type: 'color',
+ displayName: 'Border',
+ validation: { schema: { type: 'string' }, defaultValue: '#CCD1D5' },
+ accordian: 'field',
+ },
+ accentColor: {
+ type: 'color',
+ displayName: 'Accent',
+ validation: { schema: { type: 'string' }, defaultValue: '#4368E3' },
+ accordian: 'field',
+ },
+ selectedTextColor: {
+ type: 'color',
+ displayName: 'Text',
+ validation: { schema: { type: 'string' }, defaultValue: '#1B1F24' },
+ accordian: 'field',
+ },
+ errTextColor: {
+ type: 'color',
+ displayName: 'Error Text',
+ validation: { schema: { type: 'string' }, defaultValue: '#D72D39' },
+ accordian: 'field',
+ },
+ icon: {
+ type: 'icon',
+ displayName: 'Icon',
+ validation: { schema: { type: 'string' }, defaultValue: 'IconHome2' },
+ accordian: 'field',
+ visibility: false,
+ },
+ iconColor: {
+ type: 'color',
+ displayName: 'Icon color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#6A727C',
+ },
+ accordian: 'field',
+ showLabel: false,
+ },
+ fieldBorderRadius: {
+ type: 'input',
+ displayName: 'Border radius',
+ validation: { schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] }, defaultValue: '6' },
+ accordian: 'field',
+ },
+ boxShadow: {
+ type: 'boxShadow',
+ displayName: 'Box Shadow',
+ validation: {
+ schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] },
+ defaultValue: '0px 0px 0px 0px #00000090',
+ },
+ accordian: 'field',
+ },
+ padding: {
+ type: 'switch',
+ displayName: 'Padding',
+ validation: {
+ schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] },
+ defaultValue: 'default',
+ },
+ options: [
+ { displayName: 'Default', value: 'default' },
+ { displayName: 'None', value: 'none' },
+ ],
+ accordian: 'container',
+ },
+ },
+ exposedVariables: {
+ searchText: '',
+ },
+
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ validation: {
+ mandatory: { value: false },
+ customRule: { value: null },
+ },
+ properties: {
+ label: { value: 'Select' },
+ values: { value: ['1', '2'] },
+ advanced: { value: `{{false}}` },
+ showAllOption: { value: '{{false}}' },
+ optionsLoadingState: { value: '{{false}}' },
+ placeholder: { value: 'Select the options' },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ loadingState: { value: '{{false}}' },
+ schema: {
+ value:
+ "{{[\t{label: 'option1',value: 1,disable: false,visible: true,default: true},{label: 'option2',value: 2,disable: false,visible: true},{label: 'option3',value: 3,disable: false,visible: true}\t]}}",
+ },
+ options: {
+ value: [
+ {
+ label: 'option1',
+ value: '1',
+ disable: { value: false },
+ visible: { value: true },
+ default: { value: false },
+ },
+ {
+ label: 'option2',
+ value: '2',
+ disable: { value: false },
+ visible: { value: true },
+ default: { value: true },
+ },
+ {
+ label: 'option3',
+ value: '3',
+ disable: { value: false },
+ visible: { value: true },
+ default: { value: false },
+ },
+ ],
+ },
+ tooltip: { value: '' },
+ },
+ events: [],
+ styles: {
+ labelColor: { value: '#1B1F24' },
+ labelWidth: { value: '33' },
+ auto: { value: '{{true}}' },
+ fieldBorderRadius: { value: '6' },
+ selectedTextColor: { value: '#1B1F24' },
+ fieldBorderColor: { value: '#CCD1D5' },
+ errTextColor: { value: '#D72D39' },
+ fieldBackgroundColor: { value: '#fff' },
+ direction: { value: 'left' },
+ alignment: { value: 'side' },
+ padding: { value: 'default' },
+ boxShadow: { value: '0px 0px 0px 0px #00000090' },
+ icon: { value: 'IconHome2' },
+ iconVisibility: { value: false },
+ iconColor: { value: '#6A727C' },
+ accentColor: { value: '#4368E3' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/numberinput.js b/server/src/helpers/widget-config/numberinput.js
new file mode 100644
index 0000000000..ba7f2bc227
--- /dev/null
+++ b/server/src/helpers/widget-config/numberinput.js
@@ -0,0 +1,300 @@
+export const numberinputConfig = {
+ name: 'NumberInput',
+ displayName: 'Number Input',
+ description: 'Numeric input field',
+ component: 'NumberInput',
+ defaultSize: {
+ width: 10,
+ height: 40,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ label: {
+ type: 'code',
+ displayName: 'Label',
+ validation: { schema: { type: 'string' }, defaultValue: 'Label' },
+ },
+ value: {
+ type: 'code',
+ displayName: 'Default value',
+ validation: {
+ schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] },
+ defaultValue: 0,
+ },
+ },
+ placeholder: {
+ type: 'code',
+ displayName: 'Placeholder',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'Enter your input',
+ },
+ },
+ decimalPlaces: {
+ type: 'code',
+ displayName: 'Decimal places',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 2,
+ },
+ },
+ loadingState: {
+ type: 'toggle',
+ displayName: 'Loading state',
+ validation: { schema: { type: 'boolean' }, defaultValue: false },
+ section: 'additionalActions',
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: { schema: { type: 'boolean' }, defaultValue: true },
+ section: 'additionalActions',
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: { schema: { type: 'boolean' }, defaultValue: false },
+ section: 'additionalActions',
+ },
+ tooltip: {
+ type: 'code',
+ displayName: 'Tooltip',
+ validation: { schema: { type: 'string' }, defaultValue: 'Tooltip text' },
+ section: 'additionalActions',
+ placeholder: 'Enter tooltip text',
+ },
+ },
+ events: {
+ onChange: { displayName: 'On change' },
+ onFocus: { displayName: 'On focus' },
+ onBlur: { displayName: 'On blur' },
+ onEnterPressed: { displayName: 'On enter pressed' },
+ },
+ styles: {
+ color: {
+ type: 'color',
+ displayName: 'Text',
+ validation: { schema: { type: 'string' }, defaultValue: '#1B1F24' },
+ accordian: 'label',
+ },
+ alignment: {
+ type: 'switch',
+ displayName: 'Alignment',
+ validation: { schema: { type: 'string' }, defaultValue: 'side' },
+ options: [
+ { displayName: 'Side', value: 'side' },
+ { displayName: 'Top', value: 'top' },
+ ],
+ accordian: 'label',
+ },
+ direction: {
+ type: 'switch',
+ displayName: '',
+ validation: { schema: { type: 'string' }, defaultValue: 'left' },
+ showLabel: false,
+ isIcon: true,
+ options: [
+ { displayName: 'alignleftinspector', value: 'left', iconName: 'alignleftinspector' },
+ { displayName: 'alignrightinspector', value: 'right', iconName: 'alignrightinspector' },
+ ],
+ accordian: 'label',
+ isFxNotRequired: true,
+ },
+ width: {
+ type: 'slider',
+ displayName: 'Width',
+ accordian: 'label',
+ conditionallyRender: {
+ key: 'alignment',
+ value: 'side',
+ },
+ isFxNotRequired: true,
+ },
+ auto: {
+ type: 'checkbox',
+ displayName: 'auto',
+ showLabel: false,
+ validation: { schema: { type: 'boolean' }, defaultValue: true },
+ accordian: 'label',
+ conditionallyRender: {
+ key: 'alignment',
+ value: 'side',
+ },
+ isFxNotRequired: true,
+ },
+
+ backgroundColor: {
+ type: 'color',
+ displayName: 'Background',
+ validation: { schema: { type: 'string' }, defaultValue: '#fff' },
+ accordian: 'field',
+ },
+ borderColor: {
+ type: 'color',
+ displayName: 'Border',
+ validation: { schema: { type: 'string' }, defaultValue: '#CCD1D5' },
+ accordian: 'field',
+ },
+ accentColor: {
+ type: 'color',
+ displayName: 'Accent',
+ validation: { schema: { type: 'string' }, defaultValue: '#4368E3' },
+ accordian: 'field',
+ },
+ textColor: {
+ type: 'color',
+ displayName: 'Text',
+ validation: { schema: { type: 'string' }, defaultValue: '#1B1F24' },
+ accordian: 'field',
+ },
+ errTextColor: {
+ type: 'color',
+ displayName: 'Error text',
+ validation: { schema: { type: 'string' }, defaultValue: '#D72D39' },
+ accordian: 'field',
+ },
+ icon: {
+ type: 'icon',
+ displayName: 'Icon',
+ validation: { schema: { type: 'string' }, defaultValue: 'IconHome2' },
+ accordian: 'field',
+ visibility: false,
+ },
+ iconColor: {
+ type: 'color',
+ displayName: 'Icon color',
+ validation: { schema: { type: 'string' }, defaultValue: '#CFD3D859' },
+ accordian: 'field',
+ visibility: false,
+ showLabel: false,
+ },
+ borderRadius: {
+ type: 'numberInput',
+ displayName: 'Border radius',
+ validation: { schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] }, defaultValue: 6 },
+ accordian: 'field',
+ },
+ boxShadow: {
+ type: 'boxShadow',
+ displayName: 'Box Shadow',
+ validation: {
+ schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] },
+ defaultValue: '0px 0px 0px 0px #00000040',
+ },
+ accordian: 'field',
+ },
+ padding: {
+ type: 'switch',
+ displayName: 'Padding',
+ validation: {
+ schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] },
+ defaultValue: 'default',
+ },
+ isFxNotRequired: true,
+ options: [
+ { displayName: 'Default', value: 'default' },
+ { displayName: 'None', value: 'none' },
+ ],
+ accordian: 'container',
+ },
+ },
+ actions: [
+ {
+ handle: 'setText',
+ displayName: 'Set text',
+ params: [{ handle: 'text', displayName: 'text', defaultValue: '100' }],
+ },
+ {
+ handle: 'clear',
+ displayName: 'Clear',
+ },
+ {
+ handle: 'setFocus',
+ displayName: 'Set focus',
+ },
+ {
+ handle: 'setBlur',
+ displayName: 'Set blur',
+ },
+ {
+ handle: 'setVisibility',
+ displayName: 'Set visibility',
+ params: [{ handle: 'disable', displayName: 'Value', defaultValue: '{{false}}', type: 'toggle' }],
+ },
+ {
+ handle: 'setDisable',
+ displayName: 'Set disable',
+ params: [{ handle: 'disable', displayName: 'Value', defaultValue: '{{false}}', type: 'toggle' }],
+ },
+ {
+ handle: 'setLoading',
+ displayName: 'Set loading',
+ params: [{ handle: 'loading', displayName: 'Value', defaultValue: '{{false}}', type: 'toggle' }],
+ },
+ ],
+ exposedVariables: {
+ value: 99,
+ isMandatory: false,
+ isVisible: true,
+ isDisabled: false,
+ isLoading: false,
+ },
+ validation: {
+ mandatory: { type: 'toggle', displayName: 'Make this field mandatory' },
+ regex: { type: 'code', displayName: 'Regex', placeholder: '^d+$' },
+ minValue: { type: 'code', displayName: 'Min value', placeholder: 'Enter min value' },
+ maxValue: { type: 'code', displayName: 'Max value', placeholder: 'Enter max value' },
+ customRule: {
+ type: 'code',
+ displayName: 'Custom validation',
+ placeholder: `{{components.text2.text=='yes'&&'valid'}}`,
+ },
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ validation: {
+ mandatory: { value: '{{false}}' },
+ regex: { value: '' },
+ minValue: { value: '' },
+ maxValue: { value: '' },
+ customRule: { value: '' },
+ },
+ properties: {
+ value: { value: '0' },
+ label: { value: 'Label' },
+ maxValue: { value: '' },
+ minValue: { value: '' },
+ placeholder: { value: '0' },
+ decimalPlaces: { value: '{{2}}' },
+ tooltip: { value: '' },
+ visibility: { value: '{{true}}' },
+ loadingState: { value: '{{false}}' },
+ disabledState: { value: '{{false}}' },
+ },
+ events: [],
+ styles: {
+ borderRadius: { value: '{{6}}' },
+ backgroundColor: { value: '#fff' },
+ borderColor: { value: '#CCD1D5' },
+ accentColor: { value: '#4368E3' },
+ errTextColor: { value: '#D72D39' },
+ textColor: { value: '#1B1F24' },
+ color: { value: '#1B1F24' },
+ iconColor: { value: '#CFD3D859' },
+ direction: { value: 'left' },
+ width: { value: '{{33}}' },
+ alignment: { value: 'side' },
+ auto: { value: '{{true}}' },
+ padding: { value: 'default' },
+ boxShadow: { value: '0px 0px 0px 0px #00000040' },
+ icon: { value: 'IconHome2' },
+ iconVisibility: { value: false },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/pagination.js b/server/src/helpers/widget-config/pagination.js
new file mode 100644
index 0000000000..6fabfa889a
--- /dev/null
+++ b/server/src/helpers/widget-config/pagination.js
@@ -0,0 +1,78 @@
+export const paginationConfig = {
+ name: 'Pagination',
+ displayName: 'Pagination',
+ description: 'Navigate pages',
+ component: 'Pagination',
+ defaultSize: {
+ width: 10,
+ height: 30,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ numberOfPages: {
+ type: 'code',
+ displayName: 'Number of pages',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: '{{5}}',
+ },
+ },
+ defaultPageIndex: {
+ type: 'code',
+ displayName: 'Default page index',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: '{{1}}',
+ },
+ },
+ },
+ validation: {},
+ events: {
+ onPageChange: { displayName: 'On Page Change' },
+ },
+ styles: {
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ },
+ exposedVariables: {
+ totalPages: null,
+ currentPageIndex: null,
+ },
+ definition: {
+ validation: {},
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ numberOfPages: {
+ value: '{{5}}',
+ },
+ defaultPageIndex: {
+ value: '{{1}}',
+ },
+ },
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/passwordinput.js b/server/src/helpers/widget-config/passwordinput.js
new file mode 100644
index 0000000000..92a4a4711c
--- /dev/null
+++ b/server/src/helpers/widget-config/passwordinput.js
@@ -0,0 +1,296 @@
+export const passinputConfig = {
+ name: 'PasswordInput',
+ displayName: 'Password Input',
+ description: 'Secure text input',
+ component: 'PasswordInput',
+ defaultSize: {
+ width: 10,
+ height: 40,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ label: {
+ type: 'code',
+ displayName: 'Label',
+ validation: { schema: { type: 'string' }, defaultValue: 'Label' },
+ },
+ placeholder: {
+ type: 'code',
+ displayName: 'Placeholder',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'Password',
+ },
+ },
+ value: {
+ type: 'code',
+ displayName: 'Default value',
+ validation: {
+ schema: {
+ type: 'string',
+ },
+ defaultValue: 'default value',
+ },
+ },
+ loadingState: {
+ type: 'toggle',
+ displayName: 'Loading state',
+ validation: { schema: { type: 'boolean' }, defaultValue: false },
+ section: 'additionalActions',
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: { schema: { type: 'boolean' }, defaultValue: true },
+ section: 'additionalActions',
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: { schema: { type: 'boolean' }, defaultValue: false },
+ section: 'additionalActions',
+ },
+ tooltip: {
+ type: 'code',
+ displayName: 'Tooltip',
+ validation: { schema: { type: 'string' }, defaultValue: 'Tooltip text' },
+ section: 'additionalActions',
+ placeholder: 'Enter tooltip text',
+ },
+ },
+ validation: {
+ mandatory: { type: 'toggle', displayName: 'Make this field mandatory' },
+ regex: {
+ type: 'code',
+ displayName: 'Regex',
+ placeholder: '^(?=.*[a-z])(?=.*[A-Z])(?=.*d)[a-zA-Zd]{8,}$',
+ },
+ minLength: { type: 'code', displayName: 'Min length', placeholder: 'Enter min length' },
+ maxLength: { type: 'code', displayName: 'Max length', placeholder: 'Enter max length' },
+ customRule: {
+ type: 'code',
+ displayName: 'Custom validation',
+ placeholder: `{{components.text2.text=='yes'&&'valid'}}`,
+ },
+ },
+ events: {
+ onChange: { displayName: 'On change' },
+ onFocus: { displayName: 'On focus' },
+ onBlur: { displayName: 'On blur' },
+ onEnterPressed: { displayName: 'On enter pressed' },
+ },
+ styles: {
+ color: {
+ type: 'color',
+ displayName: 'Text',
+ validation: { schema: { type: 'string' }, defaultValue: '#1B1F24' },
+ accordian: 'label',
+ },
+ alignment: {
+ type: 'switch',
+ displayName: 'Alignment',
+ validation: { schema: { type: 'string' }, defaultValue: 'side' },
+ options: [
+ { displayName: 'Side', value: 'side' },
+ { displayName: 'Top', value: 'top' },
+ ],
+ accordian: 'label',
+ },
+ direction: {
+ type: 'switch',
+ displayName: '',
+ validation: { schema: { type: 'string' }, defaultValue: 'left' },
+ showLabel: false,
+ isIcon: true,
+ options: [
+ { displayName: 'alignleftinspector', value: 'left', iconName: 'alignleftinspector' },
+ { displayName: 'alignrightinspector', value: 'right', iconName: 'alignrightinspector' },
+ ],
+ accordian: 'label',
+ isFxNotRequired: true,
+ },
+ width: {
+ type: 'slider',
+ displayName: 'Width',
+ accordian: 'label',
+ conditionallyRender: {
+ key: 'alignment',
+ value: 'side',
+ },
+ isFxNotRequired: true,
+ },
+ auto: {
+ type: 'checkbox',
+ displayName: 'auto',
+ showLabel: false,
+ validation: { schema: { type: 'boolean' }, defaultValue: true },
+ accordian: 'label',
+ conditionallyRender: {
+ key: 'alignment',
+ value: 'side',
+ },
+ isFxNotRequired: true,
+ },
+
+ backgroundColor: {
+ type: 'color',
+ displayName: 'Background',
+ validation: { schema: { type: 'string' }, defaultValue: '#fff' },
+ accordian: 'field',
+ },
+ accentColor: {
+ type: 'color',
+ displayName: 'Accent',
+ validation: { schema: { type: 'string' }, defaultValue: '#4368E3' },
+ accordian: 'field',
+ },
+ borderColor: {
+ type: 'color',
+ displayName: 'Border',
+ validation: { schema: { type: 'string' }, defaultValue: '#CCD1D5' },
+ accordian: 'field',
+ },
+ textColor: {
+ type: 'color',
+ displayName: 'Text',
+ validation: { schema: { type: 'string' }, defaultValue: '#1B1F24' },
+ accordian: 'field',
+ },
+ errTextColor: {
+ type: 'color',
+ displayName: 'Error text',
+ validation: { schema: { type: 'string' }, defaultValue: '#D72D39' },
+ accordian: 'field',
+ },
+ icon: {
+ type: 'icon',
+ displayName: 'Icon',
+ validation: { schema: { type: 'string' }, defaultValue: 'IconLock' },
+ accordian: 'field',
+ visibility: false,
+ },
+ iconColor: {
+ type: 'color',
+ displayName: 'Icon color',
+ validation: { schema: { type: 'string' }, defaultValue: '#CFD3D859' },
+ accordian: 'field',
+ visibility: false,
+ showLabel: false,
+ },
+ borderRadius: {
+ type: 'numberInput',
+ displayName: 'Border radius',
+ validation: { schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] }, defaultValue: 6 },
+ accordian: 'field',
+ },
+ boxShadow: {
+ type: 'boxShadow',
+ displayName: 'Box shadow',
+ validation: {
+ schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] },
+ defaultValue: '0px 0px 0px 0px #00000040',
+ },
+ accordian: 'field',
+ },
+
+ padding: {
+ type: 'switch',
+ displayName: 'Padding',
+ validation: {
+ schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] },
+ defaultValue: 'default',
+ },
+ options: [
+ { displayName: 'Default', value: 'default' },
+ { displayName: 'None', value: 'none' },
+ ],
+ isFxNotRequired: true,
+ accordian: 'container',
+ },
+ },
+ exposedVariables: {
+ value: '',
+ isMandatory: false,
+ isVisible: true,
+ isDisabled: false,
+ isLoading: false,
+ },
+ actions: [
+ {
+ handle: 'setText',
+ displayName: 'Set text',
+ params: [{ handle: 'text', displayName: 'text', defaultValue: 'New Text' }],
+ },
+ {
+ handle: 'clear',
+ displayName: 'Clear',
+ },
+ {
+ handle: 'setFocus',
+ displayName: 'Set focus',
+ },
+ {
+ handle: 'setBlur',
+ displayName: 'Set blur',
+ },
+ {
+ handle: 'setVisibility',
+ displayName: 'Set visibility',
+ params: [{ handle: 'disable', displayName: 'Value', defaultValue: '{{false}}', type: 'toggle' }],
+ },
+ {
+ handle: 'setDisable',
+ displayName: 'Set disable',
+ params: [{ handle: 'disable', displayName: 'Value', defaultValue: '{{false}}', type: 'toggle' }],
+ },
+ {
+ handle: 'setLoading',
+ displayName: 'Set loading',
+ params: [{ handle: 'loading', displayName: 'Value', defaultValue: '{{false}}', type: 'toggle' }],
+ },
+ ],
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ placeholder: { value: 'Password' },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ loadingState: { value: '{{false}}' },
+ tooltip: { value: '' },
+ label: { value: 'Label' },
+ value: { value: '' },
+ },
+ validation: {
+ mandatory: { value: false },
+ regex: { value: '' },
+ minLength: { value: '' },
+ maxLength: { value: '' },
+ customRule: { value: '' },
+ },
+ events: [],
+ styles: {
+ borderRadius: { value: '{{6}}' },
+ backgroundColor: { value: '#fff' },
+ borderColor: { value: '#CCD1D5' },
+ accentColor: { value: '#4368E3' },
+ errTextColor: { value: '#D72D39' },
+ textColor: { value: '#1B1F24' },
+ iconColor: { value: '#CFD3D859' },
+ direction: { value: 'left' },
+ width: { value: '{{33}}' },
+ alignment: { value: 'side' },
+ color: { value: '#1B1F24' },
+ auto: { value: '{{true}}' },
+ padding: { value: 'default' },
+ boxShadow: { value: '0px 0px 0px 0px #00000040' },
+ icon: { value: 'IconLock' },
+ iconVisibility: { value: true },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/pdf.js b/server/src/helpers/widget-config/pdf.js
new file mode 100644
index 0000000000..729e709932
--- /dev/null
+++ b/server/src/helpers/widget-config/pdf.js
@@ -0,0 +1,73 @@
+export const pdfConfig = {
+ name: 'PDF',
+ displayName: 'PDF',
+ description: 'Embed PDF documents',
+ component: 'PDF',
+ properties: {
+ url: {
+ type: 'code',
+ displayName: 'File URL',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'https://upload.wikimedia.org/wikipedia/commons/general.pdf',
+ },
+ },
+ scale: {
+ type: 'toggle',
+ displayName: 'Scale page to width',
+ validation: { schema: { type: 'boolean' }, defaultValue: true },
+ },
+ pageControls: {
+ type: 'toggle',
+ displayName: 'Show page controls',
+ validation: { schema: { type: 'boolean' }, defaultValue: true },
+ },
+ showDownloadOption: {
+ type: 'toggle',
+ displayName: 'Show download button',
+ validation: { schema: { type: 'boolean' }, defaultValue: true },
+ },
+ },
+ defaultSize: {
+ width: 20,
+ height: 640,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ events: {},
+ styles: {
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: { schema: { type: 'boolean' }, defaultValue: true },
+ },
+ },
+ exposedVariables: {},
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ url: {
+ value:
+ 'https://upload.wikimedia.org/wikipedia/commons/e/ee/Guideline_No._GD-Ed-2214_Marman_Clamp_Systems_Design_Guidelines.pdf',
+ },
+ scale: {
+ value: '{{true}}',
+ },
+ pageControls: {
+ value: `{{true}}`,
+ },
+ showDownloadOption: {
+ value: `{{true}}`,
+ },
+ },
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/qrscanner.js b/server/src/helpers/widget-config/qrscanner.js
new file mode 100644
index 0000000000..a2ef018a00
--- /dev/null
+++ b/server/src/helpers/widget-config/qrscanner.js
@@ -0,0 +1,51 @@
+export const qrscannerConfig = {
+ name: 'QrScanner',
+ displayName: 'QR Scanner',
+ description: 'Scan QR codes and hold its data',
+ component: 'QrScanner',
+ defaultSize: {
+ width: 10,
+ height: 300,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {},
+ events: {
+ onDetect: { displayName: 'On detect' },
+ },
+ styles: {
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ },
+ exposedVariables: {
+ lastDetectedValue: '',
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{true}}' },
+ },
+ properties: {},
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/radiobutton.js b/server/src/helpers/widget-config/radiobutton.js
new file mode 100644
index 0000000000..40c9d3ef5c
--- /dev/null
+++ b/server/src/helpers/widget-config/radiobutton.js
@@ -0,0 +1,123 @@
+export const radiobuttonConfig = {
+ name: 'RadioButton',
+ displayName: 'Radio Button',
+ description: 'Select one from multiple choices',
+ component: 'RadioButton',
+ defaultSize: {
+ width: 6,
+ height: 60,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ label: {
+ type: 'code',
+ displayName: 'Label',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'Select',
+ },
+ },
+ value: {
+ type: 'code',
+ displayName: 'Default value',
+ validation: {
+ schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }, { type: 'boolean' }] },
+ defaultValue: true,
+ },
+ },
+ values: {
+ type: 'code',
+ displayName: 'Option values',
+ validation: {
+ schema: {
+ type: 'array',
+ element: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }, { type: 'boolean' }] },
+ },
+ defaultValue: [true, false],
+ },
+ },
+ display_values: {
+ type: 'code',
+ displayName: 'Option labels',
+ validation: {
+ schema: { type: 'array', element: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] } },
+ defaultValue: ['yes', 'no'],
+ },
+ },
+ },
+ events: {
+ onSelectionChange: { displayName: 'On select' },
+ },
+ styles: {
+ textColor: {
+ type: 'color',
+ displayName: 'Text color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#000000',
+ },
+ },
+ activeColor: {
+ type: 'color',
+ displayName: 'Active color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#000000',
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ },
+ actions: [
+ {
+ handle: 'selectOption',
+ displayName: 'Select Option',
+ params: [
+ {
+ handle: 'option',
+ displayName: 'Option',
+ },
+ ],
+ },
+ ],
+ exposedVariables: {
+ value: true,
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ label: { value: 'Select' },
+ value: { value: '{{true}}' },
+ values: { value: '{{[true,false]}}' },
+ display_values: { value: '{{["yes", "no"]}}' },
+ visible: { value: '{{true}}' },
+ },
+ events: [],
+ styles: {
+ textColor: { value: '' },
+ activeColor: { value: '' },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/rangeslider.js b/server/src/helpers/widget-config/rangeslider.js
new file mode 100644
index 0000000000..4379ac564d
--- /dev/null
+++ b/server/src/helpers/widget-config/rangeslider.js
@@ -0,0 +1,113 @@
+export const rangeSliderConfig = {
+ name: 'RangeSlider',
+ displayName: 'Range Slider',
+ description: 'Adjust value range',
+ component: 'RangeSlider',
+ defaultSize: {
+ width: 9,
+ height: 30,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ min: {
+ type: 'number',
+ displayName: 'Min',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 0,
+ },
+ },
+ max: {
+ type: 'number',
+ displayName: 'Max',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 100,
+ },
+ },
+ value: {
+ type: 'code',
+ displayName: 'Value',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 50,
+ },
+ },
+ enableTwoHandle: {
+ type: 'toggle',
+ displayName: 'Two handles',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ },
+ events: {
+ onChange: { displayName: 'On change' },
+ },
+ styles: {
+ lineColor: {
+ type: 'color',
+ displayName: 'Line color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#375FCF',
+ },
+ },
+ handleColor: {
+ type: 'color',
+ displayName: 'Handle color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#375FCF',
+ },
+ },
+ trackColor: {
+ type: 'color',
+ displayName: 'Track color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#375FCF',
+ },
+ },
+ visibility: {
+ type: 'code',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ },
+ exposedVariables: {
+ value: null,
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: true },
+ showOnMobile: { value: false },
+ },
+ properties: {
+ min: {
+ value: '{{0}}',
+ },
+ max: {
+ value: '{{100}}',
+ },
+ value: {
+ value: '{{50}}',
+ },
+ enableTwoHandle: { value: false },
+ },
+ events: [],
+ styles: {
+ lineColor: { value: '' },
+ handleColor: { value: '' },
+ trackColor: { value: '' },
+ visibility: { value: '{{true}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/richtextarea.js b/server/src/helpers/widget-config/richtextarea.js
new file mode 100644
index 0000000000..eacee66529
--- /dev/null
+++ b/server/src/helpers/widget-config/richtextarea.js
@@ -0,0 +1,73 @@
+export const richtextareaConfig = {
+ name: 'RichTextEditor',
+ displayName: 'Text Editor',
+ description: 'Rich text editor',
+ component: 'RichTextEditor',
+ defaultSize: {
+ width: 16,
+ height: 210,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ placeholder: {
+ type: 'code',
+ displayName: 'Placeholder',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'Placeholder text',
+ },
+ },
+ defaultValue: {
+ type: 'code',
+ displayName: 'Default value',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'Default text',
+ },
+ },
+ },
+ events: {},
+ styles: {
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defaultValue: true,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defaultValue: false,
+ },
+ },
+ },
+ exposedVariables: {
+ value: '',
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ placeholder: { value: 'Placeholder text' },
+ defaultValue: { value: '' },
+ },
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/spinner.js b/server/src/helpers/widget-config/spinner.js
new file mode 100644
index 0000000000..a6bf80b9be
--- /dev/null
+++ b/server/src/helpers/widget-config/spinner.js
@@ -0,0 +1,60 @@
+export const spinnerConfig = {
+ name: 'Spinner',
+ displayName: 'Spinner',
+ description: 'Indicate loading state',
+ component: 'Spinner',
+ defaultSize: {
+ width: 4,
+ height: 30,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {},
+ events: {},
+ styles: {
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ colour: {
+ type: 'color',
+ displayName: 'Colour',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#0565ff',
+ },
+ },
+ size: {
+ type: 'select',
+ displayName: 'Size',
+ options: [
+ { name: 'small', value: 'sm' },
+ { name: 'large', value: 'lg' },
+ ],
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'sm',
+ },
+ },
+ },
+ exposedVariables: {},
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {},
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ size: { value: 'sm' },
+ colour: { value: '#0565ff' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/starrating.js b/server/src/helpers/widget-config/starrating.js
new file mode 100644
index 0000000000..01240d0369
--- /dev/null
+++ b/server/src/helpers/widget-config/starrating.js
@@ -0,0 +1,117 @@
+export const starratingConfig = {
+ name: 'StarRating',
+ displayName: 'Rating',
+ description: 'Star rating',
+ component: 'StarRating',
+ defaultSize: {
+ width: 10,
+ height: 30,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ label: {
+ type: 'code',
+ displayName: 'Label',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'Select your rating',
+ },
+ },
+ maxRating: {
+ type: 'code',
+ displayName: 'Number of stars',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 5,
+ },
+ },
+ defaultSelected: {
+ type: 'code',
+ displayName: 'Default no of selected stars',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 5,
+ },
+ },
+ allowHalfStar: {
+ type: 'toggle',
+ displayName: 'Enable half star',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ tooltips: {
+ type: 'code',
+ displayName: 'Tooltips',
+ validation: {
+ schema: { type: 'array', element: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] } },
+ defaultValue: '[]',
+ },
+ },
+ },
+ events: {
+ onChange: { displayName: 'On Change' },
+ },
+ styles: {
+ textColor: {
+ type: 'color',
+ displayName: 'Star color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#ffb400',
+ },
+ },
+ labelColor: {
+ type: 'color',
+ displayName: 'Label color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#000000',
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ },
+ exposedVariables: {
+ value: 0,
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ label: { value: 'Select your rating' },
+ maxRating: { value: '5' },
+ defaultSelected: { value: '5' },
+ allowHalfStar: { value: '{{false}}' },
+ visible: { value: '{{true}}' },
+ tooltips: { value: '{{[]}}' },
+ },
+ events: [],
+ styles: {
+ textColor: { value: '#ffb400' },
+ labelColor: { value: '' },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/statistics.js b/server/src/helpers/widget-config/statistics.js
new file mode 100644
index 0000000000..d364d78524
--- /dev/null
+++ b/server/src/helpers/widget-config/statistics.js
@@ -0,0 +1,105 @@
+export const statisticsConfig = {
+ name: 'Statistics',
+ displayName: 'Statistics',
+ description: 'Show key metrics',
+ component: 'Statistics',
+ defaultSize: {
+ width: 9,
+ height: 152,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ primaryValueLabel: {
+ type: 'code',
+ displayName: 'Primary value label',
+ validation: { schema: { type: 'string' }, defaultValue: 'This months earnings' },
+ },
+ primaryValue: {
+ type: 'code',
+ displayName: 'Primary value',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '682.3',
+ },
+ },
+ hideSecondary: {
+ type: 'toggle',
+ displayName: 'Hide secondary value',
+ validation: { schema: { type: 'boolean' }, defaultValue: false },
+ },
+ secondaryValueLabel: {
+ type: 'code',
+ displayName: 'Secondary value label',
+ validation: { schema: { type: 'string' }, defaultValue: 'Last month' },
+ },
+ secondaryValue: {
+ type: 'code',
+ displayName: 'Secondary value',
+ validation: { schema: { type: 'string' }, defaultValue: '2.85' },
+ },
+ secondarySignDisplay: {
+ type: 'code',
+ displayName: 'Secondary sign display',
+
+ validation: { schema: { type: 'string' }, defaultValue: 'positive' },
+ },
+ loadingState: {
+ type: 'toggle',
+ displayName: 'Loading state',
+ validation: { schema: { type: 'boolean' }, defaultValue: false },
+ },
+ },
+ events: {},
+ styles: {
+ primaryLabelColour: {
+ type: 'color',
+ displayName: 'Primary label colour',
+ validation: { schema: { type: 'string' }, defaultValue: '#8092AB' },
+ },
+ primaryTextColour: {
+ type: 'color',
+ displayName: 'Primary text colour',
+ validation: { schema: { type: 'string' }, defaultValue: '#000000' },
+ },
+ secondaryLabelColour: {
+ type: 'color',
+ displayName: 'Secondary label colour',
+ validation: { schema: { type: 'string' }, defaultValue: '#8092AB' },
+ },
+ secondaryTextColour: {
+ type: 'color',
+ displayName: 'Secondary text colour',
+ validation: { schema: { type: 'string' }, defaultValue: '#36AF8B' },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: { schema: { type: 'boolean' }, defaultValue: true },
+ },
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ primaryValueLabel: { value: 'This months earnings' },
+ primaryValue: { value: '682.3' },
+ secondaryValueLabel: { value: 'Last month' },
+ secondaryValue: { value: '2.85' },
+ secondarySignDisplay: { value: 'positive' },
+ loadingState: { value: `{{false}}` },
+ },
+ events: [],
+ styles: {
+ primaryLabelColour: { value: '#8092AB' },
+ primaryTextColour: { value: '#000000' },
+ secondaryLabelColour: { value: '#8092AB' },
+ secondaryTextColour: { value: '#36AF8B' },
+ visibility: { value: '{{true}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/steps.js b/server/src/helpers/widget-config/steps.js
new file mode 100644
index 0000000000..a39c634919
--- /dev/null
+++ b/server/src/helpers/widget-config/steps.js
@@ -0,0 +1,108 @@
+export const stepsConfig = {
+ name: 'Steps',
+ displayName: 'Steps',
+ description: 'Step-by-step navigation aid',
+ component: 'Steps',
+ properties: {
+ steps: {
+ type: 'code',
+ displayName: 'Steps',
+ validation: {
+ schema: {
+ type: 'array',
+ element: { type: 'object', object: { id: { type: 'number' } } },
+ },
+ defaultValue: `[{ name: 'step 1'}, {name: 'step 2'}]`,
+ },
+ },
+ currentStep: {
+ type: 'code',
+ displayName: 'Current step',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 1,
+ },
+ },
+ stepsSelectable: {
+ type: 'toggle',
+ displayName: 'Steps selectable',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ },
+ defaultSize: {
+ width: 22,
+ height: 38,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ events: {
+ onSelect: { displayName: 'On select' },
+ },
+ styles: {
+ color: {
+ type: 'color',
+ displayName: 'Color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#000000',
+ },
+ },
+ textColor: {
+ type: 'color',
+ displayName: 'Text color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#000000',
+ },
+ },
+ theme: {
+ type: 'select',
+ displayName: 'Theme',
+ options: [
+ { name: 'titles', value: 'titles' },
+ { name: 'numbers', value: 'numbers' },
+ { name: 'plain', value: 'plain' },
+ ],
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'titles',
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ },
+ exposedVariables: {
+ currentStepId: '3',
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ steps: {
+ value: `{{ [{ name: 'step 1', tooltip: 'some tooltip', id: 1},{ name: 'step 2', tooltip: 'some tooltip', id: 2},{ name: 'step 3', tooltip: 'some tooltip', id: 3},{ name: 'step 4', tooltip: 'some tooltip', id: 4},{ name: 'step 5', tooltip: 'some tooltip', id: 5}]}}`,
+ },
+ currentStep: { value: '{{3}}' },
+ stepsSelectable: { value: true },
+ },
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ theme: { value: 'titles' },
+ color: { value: '' },
+ textColor: { value: '' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/svgImage.js b/server/src/helpers/widget-config/svgImage.js
new file mode 100644
index 0000000000..315a6e2c28
--- /dev/null
+++ b/server/src/helpers/widget-config/svgImage.js
@@ -0,0 +1,55 @@
+export const svgImageConfig = {
+ name: 'SvgImage',
+ displayName: 'Svg Image',
+ description: 'Display SVG graphics',
+ component: 'SvgImage',
+ properties: {
+ data: {
+ type: 'code',
+ displayName: 'Svg data',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue:
+ "",
+ },
+ },
+ },
+ defaultSize: {
+ width: 4,
+ height: 50,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ events: {},
+ styles: {
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ },
+ exposedVariables: {
+ value: {},
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ data: {
+ value:
+ '',
+ },
+ },
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/table.js b/server/src/helpers/widget-config/table.js
new file mode 100644
index 0000000000..eb08ac88c8
--- /dev/null
+++ b/server/src/helpers/widget-config/table.js
@@ -0,0 +1,667 @@
+export const tableConfig = {
+ name: 'Table',
+ displayName: 'Table',
+ description: 'Display paginated tabular data',
+ component: 'Table',
+ properties: {
+ title: {
+ type: 'string',
+ displayName: 'Title',
+ validation: {
+ schema: { type: 'string' },
+ },
+ },
+ data: {
+ type: 'code',
+ displayName: 'Table data',
+ validation: {
+ schema: {
+ type: 'array',
+ element: { type: 'object' },
+ },
+ defaultValue: "[{ id: 1, name: 'Sarah', email: 'sarah@mail.com' }]",
+ },
+ },
+ loadingState: {
+ type: 'toggle',
+ displayName: 'Loading state',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ columns: {
+ type: 'array',
+ displayName: 'Table Columns',
+ },
+ useDynamicColumn: {
+ type: 'toggle',
+ displayName: 'Use dynamic column',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ columnData: {
+ type: 'code',
+ displayName: 'Column data',
+ validation: {
+ schema: { type: 'array', element: { type: 'object' } },
+ defaultValue:
+ "{{[{name: 'email', key: 'email', id: '1'}, {name: 'Full name', key: 'name', id: '2', isEditable: true}]}}}",
+ },
+ },
+ rowsPerPage: {
+ type: 'code',
+ displayName: 'Number of rows per page',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 10,
+ },
+ },
+
+ enableNextButton: {
+ type: 'toggle',
+ displayName: 'Enable next page button',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ enabledSort: {
+ type: 'toggle',
+ displayName: 'Enable column sorting',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ hideColumnSelectorButton: {
+ type: 'toggle',
+ displayName: 'Hide column selector button',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ enablePrevButton: {
+ type: 'toggle',
+ displayName: 'Enable previous page button',
+ validation: {
+ schema: { type: 'boolean' },
+ },
+ },
+ totalRecords: {
+ type: 'code',
+ displayName: 'Total records server side',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 10,
+ },
+ },
+ enablePagination: {
+ type: 'toggle',
+ displayName: 'Enable pagination',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ serverSidePagination: {
+ type: 'clientServerSwitch',
+ displayName: 'Type',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ options: [
+ { displayName: 'Client side', value: 'clientSide' },
+ { displayName: 'Server side', value: 'serverSide' },
+ ],
+ },
+ serverSideSearch: {
+ type: 'clientServerSwitch',
+ displayName: 'Type',
+ options: [
+ { displayName: 'Client side', value: 'clientSide' },
+ { displayName: 'Server side', value: 'serverSide' },
+ ],
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ serverSideSort: {
+ type: 'clientServerSwitch',
+ displayName: 'Type',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ options: [
+ { displayName: 'Client side', value: 'clientSide' },
+ { displayName: 'Server side', value: 'serverSide' },
+ ],
+ },
+ serverSideFilter: {
+ type: 'clientServerSwitch',
+ displayName: 'Type',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ options: [
+ { displayName: 'Client side', value: 'clientSide' },
+ { displayName: 'Server side', value: 'serverSide' },
+ ],
+ defaultValue: 'clientSide',
+ },
+ actionButtonBackgroundColor: {
+ type: 'color',
+ displayName: 'Background color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#375FCF',
+ },
+ },
+ actionButtonTextColor: {
+ type: 'color',
+ displayName: 'Text color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#fff',
+ },
+ },
+ displaySearchBox: {
+ type: 'toggle',
+ displayName: 'Show search',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ showDownloadButton: {
+ type: 'toggle',
+ displayName: 'Show download button',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ showFilterButton: {
+ type: 'toggle',
+ displayName: 'Enable filtering',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ showBulkUpdateActions: {
+ type: 'toggle',
+ displayName: 'Show update buttons',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ allowSelection: {
+ type: 'toggle',
+ displayName: 'Allow selection',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ showBulkSelector: {
+ type: 'toggle',
+ displayName: 'Bulk selection',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ highlightSelectedRow: {
+ type: 'toggle',
+ displayName: 'Highlight selected row',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ defaultSelectedRow: {
+ type: 'code',
+ displayName: 'Default selected row',
+ validation: {
+ schema: {
+ type: 'object',
+ },
+ defaultValue: { id: 1 },
+ },
+ },
+
+ showAddNewRowButton: {
+ type: 'toggle',
+ displayName: 'Show add new row button',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ selectRowOnCellEdit: {
+ type: 'toggle',
+ displayName: 'Select row on cell edit',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: { type: 'boolean' },
+ },
+ },
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop ' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ defaultSize: {
+ width: 35,
+ height: 456,
+ },
+ events: {
+ onRowHovered: { displayName: 'Row hovered' },
+ onRowClicked: { displayName: 'Row clicked' },
+ onBulkUpdate: { displayName: 'Save changes' },
+ onPageChanged: { displayName: 'Page changed' },
+ onSearch: { displayName: 'Search' },
+ onCancelChanges: { displayName: 'Cancel changes' },
+ onSort: { displayName: 'Sort applied' },
+ onCellValueChanged: { displayName: 'Cell value changed' },
+ onFilterChanged: { displayName: 'Filter changed' },
+ onNewRowsAdded: { displayName: 'Add new rows' },
+ },
+ styles: {
+ textColor: {
+ type: 'color',
+ displayName: 'Text Color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#000',
+ },
+ accordian: 'Data',
+ },
+ columnHeaderWrap: {
+ type: 'switch',
+ displayName: 'Column header',
+ validation: { schema: { type: 'string' } },
+ accordian: 'Data',
+ options: [
+ { displayName: 'Fixed', value: 'fixed' },
+ { displayName: 'Wrap', value: 'wrap' },
+ ],
+ },
+ tableType: {
+ type: 'select',
+ displayName: 'Row style',
+ options: [
+ { name: 'Regular', value: 'table-classic' },
+ { name: 'Bordered', value: 'table-bordered' },
+ { name: 'Striped', value: 'table-striped' },
+ ],
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'table-classic',
+ },
+ accordian: 'Data',
+ },
+ cellSize: {
+ type: 'select',
+ displayName: 'Cell height',
+ options: [
+ { name: 'Regular', value: 'regular' },
+ { name: 'Condensed', value: 'condensed' },
+ ],
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'regular',
+ },
+ accordian: 'Data',
+ },
+ contentWrap: {
+ type: 'toggle',
+ showLabel: false,
+ toggleLabel: 'Content wrap',
+ validation: {
+ schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'boolean' }] },
+ },
+ accordian: 'Data',
+ },
+ maxRowHeight: {
+ type: 'switch',
+ displayName: 'Max row height',
+ validation: { schema: { type: 'string' } },
+ accordian: 'Data',
+ options: [
+ { displayName: 'Auto', value: 'auto' },
+ { displayName: 'Custom', value: 'custom' },
+ ],
+ conditionallyRender: {
+ key: 'contentWrap',
+ value: true,
+ },
+ },
+ maxRowHeightValue: {
+ type: 'tableRowHeightInput',
+ isFxNotRequired: true,
+ showLabel: false,
+ validation: {
+ schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] },
+ },
+ accordian: 'Data',
+ conditionallyRender: [
+ {
+ key: 'maxRowHeight',
+ value: 'custom',
+ },
+ {
+ key: 'contentWrap',
+ value: true,
+ },
+ ],
+ },
+ actionButtonRadius: {
+ type: 'numberInput',
+ displayName: 'Button radius',
+ validation: {
+ schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'boolean' }] },
+ },
+ accordian: 'Action button',
+ },
+ borderRadius: {
+ type: 'numberInput',
+ displayName: 'Border radius',
+ validation: { schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] } },
+ accordian: 'Container',
+ },
+ borderColor: {
+ type: 'color',
+ displayName: 'Border',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: false,
+ },
+ accordian: 'Container',
+ },
+ boxShadow: {
+ type: 'boxShadow',
+ displayName: 'Box Shadow',
+ validation: { schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] } },
+ accordian: 'Container',
+ },
+ padding: {
+ type: 'switch',
+ displayName: 'Padding',
+ validation: { schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] } },
+ options: [
+ { displayName: 'Default', value: 'default' },
+ { displayName: 'None', value: 'none' },
+ ],
+ accordian: 'Container',
+ },
+ },
+ exposedVariables: {
+ selectedRow: {},
+ changeSet: {},
+ dataUpdates: [],
+ pageIndex: 1,
+ searchText: '',
+ selectedRows: [],
+ filters: [],
+ },
+ actions: [
+ {
+ handle: 'setPage',
+ displayName: 'Set page',
+ params: [
+ {
+ handle: 'page',
+ displayName: 'Page',
+ defaultValue: '{{1}}',
+ },
+ ],
+ },
+ {
+ handle: 'selectRow',
+ displayName: 'Select row',
+ params: [
+ { handle: 'key', displayName: 'Key' },
+ { handle: 'value', displayName: 'Value' },
+ ],
+ },
+ {
+ handle: 'deselectRow',
+ displayName: 'Deselect row',
+ },
+ {
+ handle: 'discardChanges',
+ displayName: 'Discard Changes',
+ },
+ {
+ handle: 'discardNewlyAddedRows',
+ displayName: 'Discard newly added rows',
+ },
+ {
+ displayName: 'Download table data',
+ handle: 'downloadTableData',
+ params: [
+ {
+ handle: 'type',
+ displayName: 'Type',
+ options: [
+ { name: 'Download as Excel', value: 'xlsx' },
+ { name: 'Download as CSV', value: 'csv' },
+ { name: 'Download as PDF', value: 'pdf' },
+ ],
+ defaultValue: `{{Download as Excel}}`,
+ type: 'select',
+ },
+ ],
+ },
+ {
+ handle: 'selectAllRows',
+ displayName: 'Select all rows',
+ },
+ {
+ handle: 'deselectAllRows',
+ displayName: 'Deselect all rows',
+ },
+ {
+ handle: 'setFilters',
+ displayName: 'Set filters',
+ params: [{ handle: 'parameters', displayName: 'Parameters' }],
+ },
+ {
+ handle: 'clearFilters',
+ displayName: 'Clear filters',
+ },
+ ],
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ title: { value: 'Table' },
+ visible: { value: '{{true}}' },
+ loadingState: { value: '{{false}}' },
+ data: {
+ value:
+ "{{ [ \n\t\t{ id: 1, name: 'Olivia Nguyen', email: 'olivia.nguyen@example.com', date: '15/05/2022', phone: 9876543210, interest: ['Reading', 'Traveling','Photography'], photo: 'https://reqres.in/img/faces/7-image.jpg' }, \n\t\t{ id: 2, name: 'Liam Patel', email: 'liam.patel@example.com', date: '20/09/2021', phone: 8765432109, interest: ['Cooking','Gardening','Hiking'], photo: 'https://reqres.in/img/faces/5-image.jpg' }, \n\t\t{ id: 3, name: 'Sophia Reyes', email: 'sophia.reyes@example.com', date: '01/01/2023', phone: 7654321098, interest: ['Music','Dancing','Crafting'], photo: 'https://reqres.in/img/faces/3-image.jpg' }, \n\t\t{ id: 4, name: 'Jacob Hernandez', email: 'jacob.hernandez@example.com', date: '10/11/2022', phone: 6543210987, interest: ['Reading', 'Traveling', 'Volunteering'], photo: 'https://reqres.in/img/faces/1-image.jpg' }, \n\t\t{ id: 5, name: 'William Sanchez', email: 'william.sanchez@example.com', date: '07/01/2021', phone: 4321098765, interest: ['Music', 'Dancing', 'Hiking'], photo: 'https://reqres.in/img/faces/4-image.jpg' }, \n\t\t{ id: 6, name: 'Ethan Morales', email: 'ethan.morales@example.com', date: '05/11/2021', phone: 2109876543, interest: ['Cooking', 'Traveling', 'Photography'], photo: 'https://reqres.in/img/faces/6-image.jpg' }, \n\t\t{ id: 7, name: 'Mia Tiana', email: 'mia.tiana@example.com', date: '21/11/2022', phone: 1098705217, interest: ['Music', 'Gardening', 'Hiking'], photo: 'https://reqres.in/img/faces/2-image.jpg' }, \n\t\t{ id: 8, name: 'Lucas Ramirez', email: 'lucas.ramirez@example.com', date: '31/03/2023', phone: 9876543210, interest: ['Reading', 'Dancing', 'Crafting'], photo: 'https://reqres.in/img/faces/9-image.jpg' }, \n\t\t{ id: 9, name: 'Alexander Vela', email: 'alexander.vela@example.com', date: '07/09/2022', phone: 7654321098, interest: ['Music','Gardening','Photography'], photo: 'https://reqres.in/img/faces/8-image.jpg' }, \n\t\t{ id: 10, name: 'Michael Reyes', email: 'michael.reyes@example.com', date: '25/12/2021', phone: 5432109876, interest: ['Cooking','Crafting','Volunteering'], photo: 'https://reqres.in/img/faces/10-image.jpg' } \n] }}",
+ },
+ useDynamicColumn: { value: '{{false}}' },
+ columnData: {
+ value:
+ "{{[{name: 'email', key: 'email', id: '1'}, {name: 'Full name', key: 'name', id: '2', isEditable: true}]}}",
+ },
+ rowsPerPage: { value: '{{10}}' },
+ serverSidePagination: { value: '{{false}}' },
+ enableNextButton: { value: '{{true}}' },
+ enablePrevButton: { value: '{{true}}' },
+ totalRecords: { value: '{{10}}' },
+ enablePagination: { value: '{{true}}' },
+ serverSideSort: { value: '{{false}}' },
+ serverSideFilter: { value: '{{false}}' },
+ displaySearchBox: { value: '{{true}}' },
+ showDownloadButton: { value: '{{true}}' },
+ showFilterButton: { value: '{{true}}' },
+ autogenerateColumns: { value: true, generateNestedColumns: true },
+ isAllColumnsEditable: { value: '{{false}}' },
+ columns: {
+ value: [
+ {
+ name: 'id',
+ id: 'e3ecbf7fa52c4d7210a93edb8f43776267a489bad52bd108be9588f790126737',
+ autogenerated: true,
+ fxActiveFields: [],
+ columnSize: 30,
+ columnType: 'string',
+ },
+ {
+ name: 'photo',
+ key: 'photo',
+ id: 'f23b7d134b2e490ea41e3bb8eeb8c8e37472af243bf6b70d5af294482097e3a2',
+ autogenerated: true,
+ fxActiveFields: [],
+ columnType: 'image',
+ objectFit: 'contain',
+ borderRadius: '100',
+ columnSize: 70,
+ },
+ {
+ name: 'name',
+ id: '5d2a3744a006388aadd012fcc15cc0dbcb5f9130e0fbb64c558561c97118754a',
+ autogenerated: true,
+ fxActiveFields: [],
+ columnSize: 130,
+ columnType: 'string',
+ },
+ {
+ name: 'email',
+ id: 'afc9a5091750a1bd4760e38760de3b4be11a43452ae8ae07ce2eebc569fe9a7f',
+ autogenerated: true,
+ fxActiveFields: [],
+ columnSize: 230,
+ columnType: 'string',
+ },
+ {
+ name: 'date',
+ id: '27b75c8af9d34d1eaa1f9bb7f8f9f7b0abf1823e799748c8bb57e74f53b2c1dc',
+ autogenerated: true,
+ fxActiveFields: [],
+ columnType: 'datepicker',
+ isTimeChecked: false,
+ dateFormat: 'DD/MM/YYYY',
+ parseDateFormat: 'DD/MM/YYYY',
+ isDateSelectionEnabled: true,
+ columnSize: 130,
+ },
+ {
+ name: 'phone',
+ id: '9c2e3c40572a4aefb8e179ee39a0e1ac9dc2b2e6634be56e1c05be13c3d1de56',
+ autogenerated: true,
+ fxActiveFields: [],
+ columnType: 'number',
+ columnSize: 140,
+ },
+ {
+ name: 'interest',
+ key: 'interest',
+ id: 'f23b7d134b2e490ea41e3bb8eeb8c8e37472af243bf6b70d5af294482097e3a1',
+ autogenerated: true,
+ fxActiveFields: [],
+ columnType: 'newMultiSelect',
+ columnSize: 300,
+ options: [
+ {
+ label: 'Reading',
+ value: 'Reading',
+ },
+ {
+ label: 'Traveling',
+ value: 'Traveling',
+ },
+ {
+ label: 'Photography',
+ value: 'Photography',
+ },
+ {
+ label: 'Music',
+ value: 'Music',
+ },
+ {
+ label: 'Cooking',
+ value: 'Cooking',
+ },
+ {
+ label: 'Crafting',
+ value: 'Crafting',
+ },
+ {
+ label: 'Voluntering',
+ value: 'Voluntering',
+ },
+ {
+ label: 'Garndening',
+ value: 'Garndening',
+ },
+ {
+ label: 'Dancing',
+ value: 'Dancing',
+ },
+ {
+ label: 'Hiking',
+ value: 'Hiking',
+ },
+ ],
+ },
+ ],
+ },
+ showBulkUpdateActions: { value: '{{true}}' },
+ showBulkSelector: { value: '{{false}}' },
+ highlightSelectedRow: { value: '{{false}}' },
+ columnSizes: { value: '{{({})}}' },
+ actions: { value: [] },
+ enabledSort: { value: '{{true}}' },
+ hideColumnSelectorButton: { value: '{{false}}' },
+ defaultSelectedRow: { value: '{{{"id":1}}}' },
+ showAddNewRowButton: { value: '{{true}}' },
+ allowSelection: { value: '{{true}}' },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ },
+ events: [],
+ styles: {
+ textColor: { value: '#000' },
+ columnHeaderWrap: { value: 'fixed' },
+ actionButtonRadius: { value: '0' },
+ cellSize: { value: 'regular' },
+ borderRadius: { value: '8' },
+ tableType: { value: 'table-classic' },
+ maxRowHeight: { value: 'auto' },
+ maxRowHeightValue: { value: '{{0}}' }, // Setting it here as 0 since TableRowHeightInput component will set the value
+ contentWrap: { value: '{{true}}' },
+ boxShadow: { value: '0px 0px 0px 0px #00000090' },
+ padding: { value: 'default' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/tabs.js b/server/src/helpers/widget-config/tabs.js
new file mode 100644
index 0000000000..a397979a3e
--- /dev/null
+++ b/server/src/helpers/widget-config/tabs.js
@@ -0,0 +1,183 @@
+export const tabsConfig = {
+ name: 'Tabs',
+ displayName: 'Tabs',
+ description: 'Organize content in tabs',
+ defaultSize: {
+ width: 30,
+ height: 300,
+ },
+ defaultChildren: [
+ {
+ componentName: 'Image',
+ layout: {
+ top: 60,
+ left: 17,
+ height: 100,
+ },
+ tab: 0,
+ properties: ['source'],
+ defaultValue: {
+ source: 'https://uploads-ssl.webflow.com/6266634263b9179f76b2236e/62666392f32677b5cb2fb84b_logo.svg',
+ },
+ },
+ {
+ componentName: 'Text',
+ layout: {
+ top: 100,
+ left: 5,
+ height: 50,
+ width: 34,
+ },
+ tab: 1,
+ properties: ['text'],
+ defaultValue: {
+ text: 'Open-source low-code framework to build & deploy internal tools within minutes.',
+ },
+ },
+ {
+ componentName: 'Table',
+ layout: {
+ top: 0,
+ left: 1,
+ width: 41,
+ height: 250,
+ },
+ tab: 2,
+ },
+ ],
+ component: 'Tabs',
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ tabs: {
+ type: 'code',
+ displayName: 'Tabs',
+ validation: {
+ schema: {
+ type: 'array',
+ element: {
+ type: 'object',
+ object: {
+ id: {
+ type: 'union',
+ schemas: [{ type: 'string' }, { type: 'number' }],
+ },
+ },
+ },
+ },
+ defaultValue: [
+ { title: 'Home', id: '0' },
+ { title: 'Profile', id: '1' },
+ { title: 'Settings', id: '2' },
+ ],
+ },
+ },
+ defaultTab: {
+ type: 'code',
+ displayName: 'Default tab',
+ validation: {
+ schema: {
+ type: 'union',
+ schemas: [{ type: 'string' }, { type: 'number' }],
+ },
+ defaultValue: '0',
+ },
+ },
+ hideTabs: {
+ type: 'toggle',
+ displayName: 'Hide tabs',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defaultValue: false,
+ },
+ },
+ renderOnlyActiveTab: {
+ type: 'toggle',
+ displayName: 'Render only active tab',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defaultValue: false,
+ },
+ },
+ },
+ events: { onTabSwitch: { displayName: 'On tab switch' } },
+ styles: {
+ highlightColor: {
+ type: 'color',
+ displayName: 'Highlight color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#375FCF',
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defaultValue: false,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: {
+ type: 'boolean',
+ },
+ defaultValue: false,
+ },
+ },
+ tabWidth: {
+ type: 'select',
+ displayName: 'Tab width',
+ options: [
+ { name: 'Auto', value: 'auto' },
+ { name: 'Equally split', value: 'split' },
+ ],
+ },
+ },
+ actions: [
+ {
+ handle: 'setTab',
+ displayName: 'Set current tab',
+ params: [
+ {
+ handle: 'id',
+ displayName: 'Id',
+ },
+ ],
+ },
+ ],
+ exposedVariables: { currentTab: '' },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ tabs: {
+ value:
+ "{{[ \n\t\t{ title: 'Home', id: '0' }, \n\t\t{ title: 'Profile', id: '1' }, \n\t\t{ title: 'Settings', id: '2' } \n ]}}",
+ },
+ defaultTab: { value: '0' },
+ hideTabs: { value: false },
+ renderOnlyActiveTab: { value: false },
+ },
+ events: [],
+ styles: {
+ highlightColor: { value: '#375FCF' },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ tabWidth: { value: 'auto' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/tags.js b/server/src/helpers/widget-config/tags.js
new file mode 100644
index 0000000000..8af289b23a
--- /dev/null
+++ b/server/src/helpers/widget-config/tags.js
@@ -0,0 +1,59 @@
+export const tagsConfig = {
+ name: 'Tags',
+ displayName: 'Tags',
+ description: 'Display tag labels',
+ component: 'Tags',
+ defaultSize: {
+ width: 8,
+ height: 30,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ data: {
+ type: 'code',
+ displayName: 'Tags',
+ validation: {
+ schema: {
+ type: 'array',
+ element: {
+ type: 'object',
+ object: { title: { type: 'string' }, color: { type: 'string' }, textColor: { type: 'string' } },
+ },
+ },
+ defaultValue:
+ "{{ [{ title: 'success', color: '#2fb344', textColor: '#fff' }, { title: 'info', color: '#206bc4', textColor: '#fff' }] }}",
+ },
+ },
+ },
+ events: {},
+ styles: {
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ },
+ exposedVariables: {},
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ data: {
+ value:
+ "{{ [ \n\t\t{ title: 'success', color: '#2fb344', textColor: '#fff' }, \n\t\t{ title: 'info', color: '#206bc4', textColor: '#fff' }, \n\t\t{ title: 'warning', color: '#f59f00', textColor: '#fff' }, \n\t\t{ title: 'danger', color: '#d63939', textColor: '#fff' } ] }}",
+ },
+ },
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/text.js b/server/src/helpers/widget-config/text.js
new file mode 100644
index 0000000000..ada530d127
--- /dev/null
+++ b/server/src/helpers/widget-config/text.js
@@ -0,0 +1,298 @@
+export const textConfig = {
+ name: 'Text',
+ displayName: 'Text',
+ description: 'Display text or HTML',
+ component: 'Text',
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ textFormat: {
+ type: 'switch',
+ displayName: 'Text Format',
+ options: [
+ { displayName: 'Plain text', value: 'plainText' },
+ { displayName: 'Markdown', value: 'markdown' },
+ { displayName: 'HTML', value: 'html' },
+ ],
+ isFxNotRequired: true,
+ defaultValue: { value: 'plainText' },
+ fullWidth: true,
+ },
+ text: {
+ type: 'code',
+ displayName: 'TextComponentTextInput', // Keeping this name unique so that we can filter it in Codehinter
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'Hello, there!',
+ },
+ showLabel: false,
+ },
+ loadingState: {
+ type: 'toggle',
+ displayName: 'Show loading state',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ section: 'additionalActions',
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ section: 'additionalActions',
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ section: 'additionalActions',
+ },
+ tooltip: {
+ type: 'code',
+ displayName: 'Tooltip',
+ validation: { schema: { type: 'string' }, defaultValue: 'Tooltip text' },
+ section: 'additionalActions',
+ placeholder: 'Enter tooltip text',
+ },
+ },
+ defaultSize: {
+ width: 6,
+ height: 40,
+ },
+ events: {
+ onClick: { displayName: 'On click' },
+ onHover: { displayName: 'On hover' },
+ },
+ styles: {
+ textSize: {
+ type: 'numberInput',
+ displayName: 'Size',
+ validation: {
+ schema: [{ type: 'string' }, { type: 'number' }],
+ defaultValue: 14,
+ },
+ accordian: 'Text',
+ },
+ fontWeight: {
+ type: 'select',
+ displayName: 'Weight',
+ options: [
+ { name: 'normal', value: 'normal' },
+ { name: 'bold', value: 'bold' },
+ { name: 'lighter', value: 'lighter' },
+ { name: 'bolder', value: 'bolder' },
+ ],
+ accordian: 'Text',
+ },
+ fontStyle: {
+ type: 'switch',
+ displayName: 'Style',
+ options: [
+ { displayName: 'Normal', value: 'normal', iconName: 'minus' },
+ { displayName: 'Oblique', value: 'oblique', iconName: 'oblique' },
+ { displayName: 'Italic', value: 'italic', iconName: 'italic' },
+ ],
+ isIcon: true,
+ accordian: 'Text',
+ },
+ textColor: {
+ type: 'color',
+ displayName: 'Color',
+ validation: {
+ schema: { type: 'string' },
+ },
+ accordian: 'Text',
+ },
+ isScrollRequired: {
+ type: 'switch',
+ displayName: 'Scroll',
+ options: [
+ { displayName: 'Enable', value: 'enabled' },
+ { displayName: 'Disable', value: 'disabled' },
+ ],
+ accordian: 'Text',
+ },
+ lineHeight: { type: 'numberInput', displayName: 'Line height', accordian: 'Text' },
+ textIndent: { type: 'numberInput', displayName: 'Text indent', accordian: 'Text' },
+ textAlign: {
+ type: 'alignButtons',
+ displayName: 'Alignment',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'left',
+ },
+ accordian: 'Text',
+ },
+ verticalAlignment: {
+ type: 'switch',
+ displayName: '',
+ validation: { schema: { type: 'string' }, defaultValue: 'center' },
+ showLabel: false,
+ isIcon: true,
+ options: [
+ { displayName: 'alignverticallytop', value: 'top', iconName: 'alignverticallytop' },
+ { displayName: 'alignverticallycenter', value: 'center', iconName: 'alignverticallycenter' },
+ { displayName: 'alignverticallybottom', value: 'bottom', iconName: 'alignverticallybottom' },
+ ],
+ accordian: 'Text',
+ isFxNotRequired: true,
+ },
+ decoration: {
+ type: 'switch',
+ displayName: 'Decoration',
+ isIcon: true,
+ options: [
+ { displayName: 'none', value: 'none', iconName: 'minus' },
+ { displayName: 'underline', value: 'underline', iconName: 'underline' },
+ { displayName: 'overline', value: 'overline', iconName: 'overline' },
+ { displayName: 'line-through', value: 'line-through', iconName: 'linethrough' },
+ ],
+ accordian: 'Text',
+ },
+ transformation: {
+ type: 'switch',
+ displayName: 'Transformation',
+ isIcon: true,
+ options: [
+ { displayName: 'none', value: 'none', iconName: 'minus' },
+ { displayName: 'uppercase', value: 'uppercase', iconName: 'uppercase' },
+ { displayName: 'lowercase', value: 'lowercase', iconName: 'lowercase' },
+ { displayName: 'capitalize', value: 'capitalize', iconName: 'capitalize' },
+ ],
+ accordian: 'Text',
+ },
+ letterSpacing: { type: 'numberInput', displayName: 'Letter spacing', accordian: 'Text' },
+ wordSpacing: { type: 'numberInput', displayName: 'Word spacing', accordian: 'Text' },
+ fontVariant: {
+ type: 'select',
+ displayName: 'Font variant',
+ options: [
+ { name: 'normal', value: 'normal' },
+ { name: 'small-caps', value: 'small-caps' },
+ { name: 'initial', value: 'initial' },
+ { name: 'inherit', value: 'inherit' },
+ ],
+ accordian: 'Text',
+ },
+
+ backgroundColor: {
+ type: 'color',
+ displayName: 'Background',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#fff00000',
+ },
+ accordian: 'Container',
+ colorPickerPosition: 'top',
+ },
+ borderColor: {
+ type: 'color',
+ displayName: 'Border',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#000000',
+ },
+ accordian: 'Container',
+ colorPickerPosition: 'top',
+ },
+ borderRadius: {
+ type: 'numberInput',
+ displayName: 'Border radius',
+ validation: { schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] }, defaultValue: 6 },
+ accordian: 'Container',
+ },
+ boxShadow: {
+ type: 'boxShadow',
+ displayName: 'Box shadow',
+ validation: {
+ schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] },
+ defaultValue: '0px 0px 0px 0px #00000090',
+ },
+ accordian: 'Container',
+ },
+ padding: {
+ type: 'switch',
+ displayName: 'Padding',
+ validation: { schema: { type: 'string' }, defaultValue: 'default' },
+ options: [
+ { displayName: 'Default', value: 'default' },
+ { displayName: 'None', value: 'none' },
+ ],
+ accordian: 'Container',
+ isFxNotRequired: true,
+ },
+ },
+ exposedVariables: {
+ text: 'Hello, there!',
+ },
+ actions: [
+ {
+ handle: 'setText',
+ displayName: 'Set text',
+ params: [{ handle: 'text', displayName: 'Text', defaultValue: 'New text' }],
+ },
+ {
+ handle: 'setVisibility',
+ displayName: 'Set visibility',
+ params: [{ handle: 'setVisibility', displayName: 'Value', defaultValue: `{{true}}`, type: 'toggle' }],
+ },
+ {
+ handle: 'clear',
+ displayName: 'Clear',
+ },
+ {
+ handle: 'setLoading',
+ displayName: 'Set loading',
+ params: [{ handle: 'setLoading', displayName: 'Value', defaultValue: `{{false}}`, type: 'toggle' }],
+ },
+ {
+ handle: 'setDisable',
+ displayName: 'Set disable',
+ params: [{ handle: 'setDisable', displayName: 'Value', defaultValue: `{{false}}`, type: 'toggle' }],
+ },
+ ],
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ textFormat: { value: 'html' },
+ text: { value: `Hello {{globals.currentUser.firstName}}👋` },
+ loadingState: { value: `{{false}}` },
+ disabledState: { value: '{{false}}' },
+ visibility: { value: '{{true}}' },
+ },
+ events: [],
+ styles: {
+ backgroundColor: { value: '#fff00000' },
+ textColor: { value: '#000000' },
+ textSize: { value: '{{14}}' },
+ textAlign: { value: 'left' },
+ fontWeight: { value: 'normal' },
+ decoration: { value: 'none' },
+ transformation: { value: 'none' },
+ fontStyle: { value: 'normal' },
+ lineHeight: { value: '{{1.5}}' },
+ textIndent: { value: '{{0}}' },
+ letterSpacing: { value: '{{0}}' },
+ wordSpacing: { value: '{{0}}' },
+ fontVariant: { value: 'normal' },
+ verticalAlignment: { value: 'center' },
+ padding: { value: 'default' },
+ boxShadow: { value: '0px 0px 0px 0px #00000090' },
+ borderColor: { value: '' },
+ borderRadius: { value: '{{6}}' },
+ isScrollRequired: { value: 'enabled' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/textarea.js b/server/src/helpers/widget-config/textarea.js
new file mode 100644
index 0000000000..c5e71be77d
--- /dev/null
+++ b/server/src/helpers/widget-config/textarea.js
@@ -0,0 +1,93 @@
+export const textareaConfig = {
+ name: 'Textarea',
+ displayName: 'Text Area',
+ description: 'Multi-line text input',
+ component: 'TextArea',
+ defaultSize: {
+ width: 6,
+ height: 100,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ value: {
+ type: 'code',
+ displayName: 'Default value',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'default text',
+ },
+ },
+ placeholder: {
+ type: 'code',
+ displayName: 'Placeholder',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'Placeholder text',
+ },
+ },
+ },
+ events: {},
+ styles: {
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ borderRadius: {
+ type: 'code',
+ displayName: 'Border radius',
+ validation: {
+ schema: { type: 'number' },
+ defaultValue: 4,
+ },
+ },
+ },
+ exposedVariables: {
+ value:
+ 'ToolJet is an open-source low-code platform for building and deploying internal tools with minimal engineering efforts 🚀',
+ },
+ actions: [
+ {
+ handle: 'setText',
+ displayName: 'Set Text',
+ params: [{ handle: 'text', displayName: 'text', defaultValue: 'New Text' }],
+ },
+ {
+ handle: 'clear',
+ displayName: 'Clear',
+ },
+ ],
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ value: {
+ value:
+ 'ToolJet is an open-source low-code platform for building and deploying internal tools with minimal engineering efforts 🚀',
+ },
+ placeholder: { value: 'Placeholder text' },
+ },
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ borderRadius: { value: '{{4}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/textinput.js b/server/src/helpers/widget-config/textinput.js
new file mode 100644
index 0000000000..15a52ea306
--- /dev/null
+++ b/server/src/helpers/widget-config/textinput.js
@@ -0,0 +1,302 @@
+export const textinputConfig = {
+ name: 'TextInput',
+ displayName: 'Text Input',
+ description: 'User text input field',
+ component: 'TextInput',
+ defaultSize: {
+ width: 10,
+ height: 40,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ label: {
+ type: 'code',
+ displayName: 'Label',
+ validation: { schema: { type: 'string' }, defaultValue: 'Label' },
+ },
+ placeholder: {
+ type: 'code',
+ displayName: 'Placeholder',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'Enter your input',
+ },
+ },
+ value: {
+ type: 'code',
+ displayName: 'Default value',
+ validation: {
+ schema: {
+ type: 'string',
+ },
+ defaultValue: 'Default value',
+ },
+ },
+ loadingState: {
+ type: 'toggle',
+ displayName: 'Loading state',
+ validation: { schema: { type: 'boolean' }, defaultValue: false },
+ section: 'additionalActions',
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: { schema: { type: 'boolean' }, defaultValue: true },
+ section: 'additionalActions',
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: { schema: { type: 'boolean' }, defaultValue: false },
+ section: 'additionalActions',
+ },
+ tooltip: {
+ type: 'code',
+ displayName: 'Tooltip',
+ validation: { schema: { type: 'string' }, defaultValue: 'Tooltip text' },
+ section: 'additionalActions',
+ placeholder: 'Enter tooltip text',
+ },
+ },
+ validation: {
+ mandatory: { type: 'toggle', displayName: 'Make this field mandatory' },
+ regex: { type: 'code', displayName: 'Regex', placeholder: '^[a-zA-Z0-9_ -]{3,16}$' },
+ minLength: { type: 'code', displayName: 'Min length', placeholder: 'Enter min length' },
+ maxLength: { type: 'code', displayName: 'Max length', placeholder: 'Enter max length' },
+ customRule: {
+ type: 'code',
+ displayName: 'Custom validation',
+ placeholder: `{{components.text2.text=='yes'&&'valid'}}`,
+ },
+ },
+ events: {
+ onChange: { displayName: 'On change' },
+ onEnterPressed: { displayName: 'On enter pressed' },
+ onFocus: { displayName: 'On focus' },
+ onBlur: { displayName: 'On blur' },
+ },
+ styles: {
+ color: {
+ type: 'color',
+ displayName: 'Text',
+ validation: { schema: { type: 'string' }, defaultValue: '#1B1F24' },
+ accordian: 'label',
+ },
+ alignment: {
+ type: 'switch',
+ displayName: 'Alignment',
+ validation: { schema: { type: 'string' }, defaultValue: 'side' },
+ options: [
+ { displayName: 'Side', value: 'side' },
+ { displayName: 'Top', value: 'top' },
+ ],
+ accordian: 'label',
+ },
+ direction: {
+ type: 'switch',
+ displayName: '',
+ validation: { schema: { type: 'string' }, defaultValue: 'left' },
+ showLabel: false,
+ isIcon: true,
+ options: [
+ { displayName: 'alignleftinspector', value: 'left', iconName: 'alignleftinspector' },
+ { displayName: 'alignrightinspector', value: 'right', iconName: 'alignrightinspector' },
+ ],
+ accordian: 'label',
+ isFxNotRequired: true,
+ },
+ width: {
+ type: 'slider',
+ displayName: 'Width',
+ accordian: 'label',
+ conditionallyRender: {
+ key: 'alignment',
+ value: 'side',
+ },
+ isFxNotRequired: true,
+ },
+ auto: {
+ type: 'checkbox',
+ displayName: 'auto',
+ showLabel: false,
+ validation: { schema: { type: 'boolean' }, defaultValue: true },
+ accordian: 'label',
+ conditionallyRender: {
+ key: 'alignment',
+ value: 'side',
+ },
+ isFxNotRequired: true,
+ },
+
+ backgroundColor: {
+ type: 'color',
+ displayName: 'Background',
+ validation: { schema: { type: 'string' }, defaultValue: '#fff' },
+ accordian: 'field',
+ },
+ borderColor: {
+ type: 'color',
+ displayName: 'Border',
+ validation: { schema: { type: 'string' }, defaultValue: '#CCD1D5' },
+ accordian: 'field',
+ },
+ accentColor: {
+ type: 'color',
+ displayName: 'Accent',
+ validation: { schema: { type: 'string' }, defaultValue: '#4368E3' },
+ accordian: 'field',
+ },
+ textColor: {
+ type: 'color',
+ displayName: 'Text',
+ validation: { schema: { type: 'string' }, defaultValue: '#1B1F24' },
+ accordian: 'field',
+ },
+ errTextColor: {
+ type: 'color',
+ displayName: 'Error text',
+ validation: { schema: { type: 'string' }, defaultValue: '#D72D39' },
+ accordian: 'field',
+ },
+ icon: {
+ type: 'icon',
+ displayName: 'Icon',
+ validation: { schema: { type: 'string' }, defaultValue: 'IconHome2' },
+ accordian: 'field',
+ visibility: false,
+ },
+ iconColor: {
+ type: 'color',
+ displayName: 'Icon color',
+ validation: { schema: { type: 'string' }, defaultValue: '#CFD3D859' },
+ accordian: 'field',
+ visibility: false,
+ showLabel: false,
+ },
+ borderRadius: {
+ type: 'numberInput',
+ displayName: 'Border radius',
+ validation: { schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] }, defaultValue: 6 },
+ accordian: 'field',
+ },
+ boxShadow: {
+ type: 'boxShadow',
+ displayName: 'Box Shadow',
+ validation: {
+ schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] },
+ defaultValue: '0px 0px 0px 0px #00000040',
+ },
+ accordian: 'field',
+ },
+ padding: {
+ type: 'switch',
+ displayName: 'Padding',
+ validation: {
+ schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] },
+ defaultValue: 'default',
+ },
+ isFxNotRequired: true,
+ options: [
+ { displayName: 'Default', value: 'default' },
+ { displayName: 'None', value: 'none' },
+ ],
+ accordian: 'container',
+ },
+ },
+ exposedVariables: {
+ value: '',
+ isMandatory: false,
+ isVisible: true,
+ isDisabled: false,
+ isLoading: false,
+ },
+ actions: [
+ {
+ handle: 'setText',
+ displayName: 'Set text',
+ params: [{ handle: 'text', displayName: 'text', defaultValue: 'New text' }],
+ },
+ {
+ handle: 'clear',
+ displayName: 'Clear',
+ },
+ {
+ handle: 'setFocus',
+ displayName: 'Set focus',
+ },
+ {
+ handle: 'setBlur',
+ displayName: 'Set blur',
+ },
+ {
+ handle: 'disable',
+ displayName: 'Disable(deprecated)',
+ params: [{ handle: 'disable', displayName: 'Value', defaultValue: '{{false}}', type: 'toggle' }],
+ },
+ {
+ handle: 'visibility',
+ displayName: 'Visibility(deprecated)',
+ params: [{ handle: 'visibility', displayName: 'Value', defaultValue: '{{false}}', type: 'toggle' }],
+ },
+ {
+ handle: 'setVisibility',
+ displayName: 'Set visibility',
+ params: [{ handle: 'disable', displayName: 'Value', defaultValue: '{{false}}', type: 'toggle' }],
+ },
+ {
+ handle: 'setDisable',
+ displayName: 'Set disable',
+ params: [{ handle: 'disable', displayName: 'Value', defaultValue: '{{false}}', type: 'toggle' }],
+ },
+ {
+ handle: 'setLoading',
+ displayName: 'Set loading',
+ params: [{ handle: 'loading', displayName: 'Value', defaultValue: '{{false}}', type: 'toggle' }],
+ },
+ ],
+ definition: {
+ validation: {
+ mandatory: { value: '{{false}}' },
+ regex: { value: '' },
+ minLength: { value: '' },
+ maxLength: { value: '' },
+ customRule: { value: '' },
+ },
+
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ value: { value: '' },
+ label: { value: 'Label' },
+ placeholder: { value: 'Enter your input' },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ loadingState: { value: '{{false}}' },
+ tooltip: { value: '' },
+ },
+ events: [],
+ styles: {
+ textColor: { value: '#1B1F24' },
+ borderColor: { value: '#CCD1D5' },
+ accentColor: { value: '#4368E3' },
+ errTextColor: { value: '#D72D39' },
+ borderRadius: { value: '{{6}}' },
+ backgroundColor: { value: '#fff' },
+ iconColor: { value: '#CFD3D859' },
+ direction: { value: 'left' },
+ width: { value: '{{33}}' },
+ alignment: { value: 'side' },
+ color: { value: '#1B1F24' },
+ auto: { value: '{{true}}' },
+ padding: { value: 'default' },
+ boxShadow: { value: '0px 0px 0px 0px #00000040' },
+ icon: { value: 'IconHome2' },
+ iconVisibility: { value: false },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/timeline.js b/server/src/helpers/widget-config/timeline.js
new file mode 100644
index 0000000000..6ece608f5c
--- /dev/null
+++ b/server/src/helpers/widget-config/timeline.js
@@ -0,0 +1,60 @@
+export const timelineConfig = {
+ name: 'Timeline',
+ displayName: 'Timeline',
+ description: 'Show event timeline',
+ component: 'Timeline',
+ properties: {
+ data: {
+ type: 'code',
+ displayName: 'Timeline data',
+ validation: {
+ schema: { type: 'array', element: { type: 'object' } },
+ defaultValue: "[{title: 'Product Launched', date: '20/10/2021'}]",
+ },
+ },
+ hideDate: {
+ type: 'toggle',
+ displayName: 'Hide date',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ },
+ defaultSize: {
+ width: 20,
+ height: 270,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ events: {},
+ styles: {
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: { schema: { type: 'boolean' } },
+ },
+ },
+ exposedVariables: {
+ value: {},
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ data: {
+ value:
+ "{{ [ \n\t\t{ title: 'Product Launched', subTitle: 'First version of our product released to public', date: '20/10/2021', iconBackgroundColor: '#4d72fa'},\n\t\t { title: 'First Signup', subTitle: 'Congratulations! We got our first signup', date: '22/10/2021', iconBackgroundColor: '#4d72fa'}, \n\t\t { title: 'First Payment', subTitle: 'Hurray! We got our first payment', date: '01/11/2021', iconBackgroundColor: '#4d72fa'} \n] }}",
+ },
+ hideDate: { value: '{{false}}' },
+ },
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/timer.js b/server/src/helpers/widget-config/timer.js
new file mode 100644
index 0000000000..a7cfe05a41
--- /dev/null
+++ b/server/src/helpers/widget-config/timer.js
@@ -0,0 +1,97 @@
+export const timerConfig = {
+ name: 'Timer',
+ displayName: 'Timer',
+ description: 'Countdown or stopwatch',
+ component: 'Timer',
+ defaultSize: {
+ width: 11,
+ height: 128,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ value: {
+ type: 'code',
+ displayName: 'Default value',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '00:00:00:000',
+ },
+ },
+ type: {
+ type: 'select',
+ displayName: 'Timer type',
+ options: [
+ { name: 'Count up', value: 'countUp' },
+ { name: 'Count down', value: 'countDown' },
+ ],
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: 'countUp',
+ },
+ },
+ },
+ validation: {},
+ events: {
+ onStart: { displayName: 'On Start' },
+ onResume: { displayName: 'On Resume' },
+ onPause: { displayName: 'On Pause' },
+ onCountDownFinish: { displayName: 'On Count Down Finish' },
+ onReset: { displayName: 'On Reset' },
+ },
+ styles: {
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: false,
+ },
+ },
+ },
+ exposedVariables: {
+ value: '',
+ },
+ definition: {
+ validation: {},
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ value: {
+ value: '00:00:00:000',
+ },
+ type: {
+ value: 'countUp',
+ },
+ },
+ defaults: [
+ {
+ type: 'countUp',
+ value: '00:00:00:000',
+ paramName: 'value',
+ },
+ {
+ type: 'countDown',
+ value: '00:00:10:000',
+ paramName: 'value',
+ },
+ ],
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/toggleswitch.js b/server/src/helpers/widget-config/toggleswitch.js
new file mode 100644
index 0000000000..ec3a97450d
--- /dev/null
+++ b/server/src/helpers/widget-config/toggleswitch.js
@@ -0,0 +1,83 @@
+export const toggleswitchConfig = {
+ name: 'ToggleSwitchLegacy',
+ displayName: 'Toggle Switch (Legacy)',
+ description: 'User-controlled on-off switch',
+ component: 'ToggleSwitch',
+ defaultSize: {
+ width: 6,
+ height: 30,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ label: {
+ type: 'code',
+ displayName: 'Label',
+ validation: {
+ schema: { type: 'string' },
+ },
+ },
+ defaultValue: {
+ type: 'toggle',
+ displayName: 'Default status',
+ validation: {
+ schema: { type: 'boolean' },
+ },
+ },
+ },
+ events: {
+ onChange: { displayName: 'On change' },
+ },
+ styles: {
+ textColor: {
+ type: 'color',
+ displayName: 'Text color',
+ validation: {
+ schema: { type: 'string' },
+ },
+ },
+ toggleSwitchColor: {
+ type: 'color',
+ displayName: 'Toggle switch color',
+ validation: {
+ schema: { type: 'string' },
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ },
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: {
+ schema: { type: 'boolean' },
+ },
+ },
+ },
+ exposedVariables: {
+ value: false,
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ label: { value: 'Toggle label' },
+ defaultValue: { value: '{{false}}' },
+ },
+ events: [],
+ styles: {
+ textColor: { value: '' },
+ toggleSwitchColor: { value: '' },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/toggleswitchv2.js b/server/src/helpers/widget-config/toggleswitchv2.js
new file mode 100644
index 0000000000..6753fbb50d
--- /dev/null
+++ b/server/src/helpers/widget-config/toggleswitchv2.js
@@ -0,0 +1,192 @@
+export const toggleSwitchV2Config = {
+ name: 'ToggleSwitch',
+ displayName: 'Toggle Switch',
+ description: 'User-controlled on-off switch',
+ component: 'ToggleSwitchV2',
+ defaultSize: {
+ width: 6,
+ height: 30,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+
+ validation: {
+ mandatory: { type: 'toggle', displayName: 'Make this field mandatory' },
+ customRule: {
+ type: 'code',
+ displayName: 'Custom validation',
+ placeholder: `{{components.text2.text=='yes'&&'valid'}}`,
+ },
+ },
+
+ properties: {
+ label: {
+ type: 'code',
+ displayName: 'Label',
+ validation: {
+ schema: { type: 'string' },
+ },
+ },
+
+ defaultValue: {
+ type: 'switch',
+ displayName: 'Default state',
+ validation: { schema: { type: 'boolean' } },
+ options: [
+ { displayName: 'On', value: '{{true}}' },
+ { displayName: 'Off', value: '{{false}}' },
+ ],
+ accordian: 'label',
+ },
+ loadingState: {
+ type: 'toggle',
+ displayName: 'Loading state',
+ validation: { schema: { type: 'boolean' } },
+ section: 'additionalActions',
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: { schema: { type: 'boolean' } },
+ section: 'additionalActions',
+ },
+ disabledState: {
+ type: 'toggle',
+ displayName: 'Disable',
+ validation: { schema: { type: 'boolean' } },
+ section: 'additionalActions',
+ },
+ tooltip: {
+ type: 'code',
+ displayName: 'Tooltip',
+ validation: { schema: { type: 'string' } },
+ section: 'additionalActions',
+ placeholder: 'Enter tooltip text',
+ },
+ },
+ events: {
+ onChange: { displayName: 'On change' },
+ },
+ styles: {
+ textColor: {
+ type: 'color',
+ displayName: 'Text Color',
+ validation: {
+ schema: { type: 'string' },
+ },
+ accordian: 'label',
+ },
+ borderColor: {
+ type: 'color',
+ displayName: 'Border color',
+ validation: {
+ schema: { type: 'string' },
+ },
+ accordian: 'switch',
+ },
+ toggleSwitchColor: {
+ type: 'color',
+ displayName: 'Checked color',
+ validation: {
+ schema: { type: 'string' },
+ },
+ accordian: 'switch',
+ },
+ uncheckedColor: {
+ type: 'color',
+ displayName: 'Unchecked color',
+ validation: {
+ schema: { type: 'string' },
+ },
+ accordian: 'switch',
+ },
+ handleColor: {
+ type: 'color',
+ displayName: 'Handle color',
+ validation: {
+ schema: { type: 'string' },
+ },
+ accordian: 'switch',
+ },
+ alignment: {
+ type: 'switch',
+ displayName: 'Alignment',
+ validation: { schema: { type: 'string' } },
+ options: [
+ { displayName: 'Left', value: 'left' },
+ { displayName: 'Right', value: 'right' },
+ ],
+ accordian: 'label',
+ },
+ boxShadow: {
+ type: 'boxShadow',
+ displayName: 'Box Shadow',
+ validation: { schema: { type: 'union', schemas: [{ type: 'string' }, { type: 'number' }] } },
+ accordian: 'switch',
+ },
+ },
+ exposedVariables: {
+ value: false,
+ label: 'Label',
+ isMandatory: false,
+ isVisible: true,
+ isDisabled: false,
+ isLoading: false,
+ },
+ actions: [
+ {
+ handle: 'toggle',
+ displayName: 'toggle',
+ },
+ {
+ handle: 'setValue',
+ displayName: 'Set value',
+ params: [{ handle: 'value', displayName: 'value' }],
+ },
+ {
+ handle: 'setVisibility',
+ displayName: 'Set visibility',
+ params: [{ handle: 'disable', displayName: 'Value', defaultValue: '{{false}}', type: 'toggle' }],
+ },
+ {
+ handle: 'setDisable',
+ displayName: 'Set disable',
+ params: [{ handle: 'disable', displayName: 'Value', defaultValue: '{{false}}', type: 'toggle' }],
+ },
+ {
+ handle: 'setLoading',
+ displayName: 'Set loading',
+ params: [{ handle: 'loading', displayName: 'Value', defaultValue: '{{false}}', type: 'toggle' }],
+ },
+ ],
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ validation: {
+ mandatory: { value: '{{false}}' },
+ customRule: { value: null },
+ },
+ properties: {
+ label: { value: 'Label' },
+ defaultValue: { value: '{{false}}' },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ loadingState: { value: '{{false}}' },
+ tooltip: { value: '' },
+ },
+ events: [],
+ styles: {
+ textColor: { value: '#1B1F24' },
+ toggleSwitchColor: { value: '#4368E3' }, //keeping same key for backward comopatibility
+ uncheckedColor: { value: '#E4E7EB' },
+ borderColor: { value: '#E4E7EB' },
+ handleColor: { value: '#FFFFFF' },
+ alignment: { value: 'right' },
+ boxShadow: { value: '0px 0px 0px 0px #00000090' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/treeSelect.js b/server/src/helpers/widget-config/treeSelect.js
new file mode 100644
index 0000000000..1d7485b47a
--- /dev/null
+++ b/server/src/helpers/widget-config/treeSelect.js
@@ -0,0 +1,79 @@
+export const treeSelectConfig = {
+ name: 'TreeSelect',
+ displayName: 'Tree Select',
+ description: 'Hierarchical item selector',
+ defaultSize: {
+ width: 12,
+ height: 200,
+ },
+ component: 'TreeSelect',
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {
+ label: { type: 'code', displayName: 'Title' },
+ data: { type: 'code', displayName: 'Structure' },
+ checkedData: { type: 'code', displayName: 'Checked values' },
+ expandedData: { type: 'code', displayName: 'Expanded values' },
+ },
+ events: {
+ onChange: { displayName: 'On change' },
+ onCheck: { displayName: 'On check' },
+ onUnCheck: { displayName: 'On uncheck' },
+ },
+ styles: {
+ textColor: { type: 'color', displayName: 'Text Color' },
+ checkboxColor: { type: 'color', displayName: 'Checkbox color' },
+ visibility: { type: 'toggle', displayName: 'Visibility' },
+ disabledState: { type: 'toggle', displayName: 'Disable' },
+ },
+ exposedVariables: {
+ checked: ['asia', 'china', 'beijing', 'shanghai', 'japan', 'india', 'delhi', 'mumbai', 'bengaluru'],
+ expanded: ['asia'],
+ checkedPathArray: [
+ ['asia'],
+ ['asia', 'china'],
+ ['asia', 'china', 'beijing'],
+ ['asia', 'china', 'shanghai'],
+ ['asia', 'japan'],
+ ['asia', 'india'],
+ ['asia', 'india', 'delhi'],
+ ['asia', 'india', 'mumbai'],
+ ['asia', 'india', 'bengaluru'],
+ ],
+ checkedPathStrings: [
+ 'asia',
+ 'asia-china',
+ 'asia-china-beijing',
+ 'asia-china-shanghai',
+ 'asia-japan',
+ 'asia-india',
+ 'asia-india-delhi',
+ 'asia-india-mumbai',
+ 'asia-india-bengaluru',
+ ],
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {
+ label: { value: 'Countries' },
+ data: {
+ value:
+ '{{[{"label":"Asia","value":"asia","children":[{"label":"China","value":"china","children":[{"label":"Beijing","value":"beijing"},{"label":"Shanghai","value":"shanghai"}]},{"label":"Japan","value":"japan"},{"label":"India","value":"india","children":[{"label":"Delhi","value":"delhi"},{"label":"Mumbai","value":"mumbai"},{"label":"Bengaluru","value":"bengaluru"}]}]},{"label":"Europe","value":"europe","children":[{"label":"France","value":"france"},{"label":"Spain","value":"spain"},{"label":"England","value":"england"}]},{"label":"Africa","value":"africa"}]}}',
+ },
+ checkedData: { value: '{{["asia"]}}' },
+ expandedData: { value: '{{["asia"]}}' },
+ },
+ events: [],
+ styles: {
+ textColor: { value: '' },
+ checkboxColor: { value: '' },
+ visibility: { value: '{{true}}' },
+ disabledState: { value: '{{false}}' },
+ },
+ },
+};
diff --git a/server/src/helpers/widget-config/verticalDivider.js b/server/src/helpers/widget-config/verticalDivider.js
new file mode 100644
index 0000000000..443526c3b8
--- /dev/null
+++ b/server/src/helpers/widget-config/verticalDivider.js
@@ -0,0 +1,49 @@
+export const verticalDividerConfig = {
+ name: 'VerticalDivider',
+ displayName: 'Vertical Divider',
+ description: 'Vertical line separator',
+ component: 'VerticalDivider',
+ defaultSize: {
+ width: 2,
+ height: 100,
+ },
+ others: {
+ showOnDesktop: { type: 'toggle', displayName: 'Show on desktop' },
+ showOnMobile: { type: 'toggle', displayName: 'Show on mobile' },
+ },
+ properties: {},
+ events: {},
+ styles: {
+ dividerColor: {
+ type: 'color',
+ displayName: 'Divider color',
+ validation: {
+ schema: { type: 'string' },
+ defaultValue: '#000000',
+ },
+ },
+ visibility: {
+ type: 'toggle',
+ displayName: 'Visibility',
+ validation: {
+ schema: { type: 'boolean' },
+ defaultValue: true,
+ },
+ },
+ },
+ exposedVariables: {
+ value: {},
+ },
+ definition: {
+ others: {
+ showOnDesktop: { value: '{{true}}' },
+ showOnMobile: { value: '{{false}}' },
+ },
+ properties: {},
+ events: [],
+ styles: {
+ visibility: { value: '{{true}}' },
+ dividerColor: { value: '#000000' },
+ },
+ },
+};