PromucFlow_constructor/app/client/src/utils/WidgetFactoryHelpers.test.ts
Abhinav Jha 60503bb9a6
feat: Dynamic Height widget config (#13143)
* Add platform feature which adds dynamic height property controls and default properties based on widget config

* Move features to the top, so that defaults can override them if necessary

* - Add unit tests to verify that the property controls show up for dynamic height
- Add unit test to verify that the hidden hook in the dynamic height controls work
- Fix console warning for react key unavailable in Generator.tsx
- Move constants and types to their respective files

* Remove dynamic height config from Container Widget

* Add comments in hard to understand areas

* Add function which converts fn validation params to fnString
2022-04-22 15:14:22 +05:30

256 lines
6.8 KiB
TypeScript

import { ValidationTypes } from "constants/WidgetValidation";
import { WidgetProps } from "widgets/BaseWidget";
import { AutocompleteDataType } from "./autocomplete/TernServer";
import {
convertFunctionsToString,
enhancePropertyPaneConfig,
} from "./WidgetFactoryHelpers";
import { DynamicHeight } from "./WidgetFeatures";
const ORIGINAL_PROPERTY_CONFIG = [
{
sectionName: "General",
children: [
{
propertyName: "url",
label: "URL",
controlType: "INPUT_TEXT",
placeholderText: "Enter URL",
inputType: "TEXT",
isBindProperty: true,
isTriggerProperty: false,
},
],
},
{
sectionName: "Events",
children: [
{
helpText: "Triggers an action when the video is played",
propertyName: "onPlay",
label: "onPlay",
controlType: "ACTION_SELECTOR",
isJSConvertible: true,
isBindProperty: true,
isTriggerProperty: true,
},
{
helpText: "Triggers an action when the video is paused",
propertyName: "onPause",
label: "onPause",
controlType: "ACTION_SELECTOR",
isJSConvertible: true,
isBindProperty: true,
isTriggerProperty: true,
},
{
helpText: "Triggers an action when the video ends",
propertyName: "onEnd",
label: "onEnd",
controlType: "ACTION_SELECTOR",
isJSConvertible: true,
isBindProperty: true,
isTriggerProperty: true,
},
],
},
];
const EXPECTED_PROPERTY_CONFIG = [
{
sectionName: "General",
children: [
{
propertyName: "url",
label: "URL",
controlType: "INPUT_TEXT",
placeholderText: "Enter URL",
inputType: "TEXT",
isBindProperty: true,
isTriggerProperty: false,
},
],
},
{
sectionName: "Layout Features",
children: [
{
helpText:
"Dynamic Height: Configure the way the widget height react to content changes.",
propertyName: "dynamicHeight",
label: "Height",
controlType: "DROP_DOWN",
isBindProperty: false,
isTriggerProperty: false,
options: [
{
label: "Hug Contents",
value: DynamicHeight.HUG_CONTENTS,
},
{
label: "Fixed",
value: DynamicHeight.FIXED,
},
],
},
{
propertyName: "minDynamicHeight",
label: "Min Height (in rows)",
helpText: "Minimum number of rows to occupy irrespective of contents",
controlType: "INPUT_TEXT",
hidden: (props: WidgetProps) => {
return props.dynamicHeight !== DynamicHeight.HUG_CONTENTS;
},
dependencies: ["dynamicHeight"],
isJSConvertible: false,
isBindProperty: false,
isTriggerProperty: false,
},
{
propertyName: "maxDynamicHeight",
label: "Max Height (in rows)",
helpText: "Maximum Height, after which contents will scroll",
controlType: "INPUT_TEXT",
dependencies: ["dynamicHeight"],
hidden: (props: WidgetProps) => {
return props.dynamicHeight !== DynamicHeight.HUG_CONTENTS;
},
isJSConvertible: false,
isBindProperty: false,
isTriggerProperty: false,
},
],
},
{
sectionName: "Events",
children: [
{
helpText: "Triggers an action when the video is played",
propertyName: "onPlay",
label: "onPlay",
controlType: "ACTION_SELECTOR",
isJSConvertible: true,
isBindProperty: true,
isTriggerProperty: true,
},
{
helpText: "Triggers an action when the video is paused",
propertyName: "onPause",
label: "onPause",
controlType: "ACTION_SELECTOR",
isJSConvertible: true,
isBindProperty: true,
isTriggerProperty: true,
},
{
helpText: "Triggers an action when the video ends",
propertyName: "onEnd",
label: "onEnd",
controlType: "ACTION_SELECTOR",
isJSConvertible: true,
isBindProperty: true,
isTriggerProperty: true,
},
],
},
];
describe("Widget Factory Helper tests", () => {
it("Make sure dynamicHeight property configs are added when enabled in widget", () => {
const features = {
dynamicHeight: true,
};
const result = enhancePropertyPaneConfig(
ORIGINAL_PROPERTY_CONFIG,
features,
);
expect(JSON.stringify(result)).toEqual(
JSON.stringify(EXPECTED_PROPERTY_CONFIG),
);
});
it("Make sure dynamicHeight property configs are NOT added when disabled in widget", () => {
const features = {
dynamicHeight: false,
};
const result_with_false = enhancePropertyPaneConfig(
ORIGINAL_PROPERTY_CONFIG,
features,
);
const result_with_undefined = enhancePropertyPaneConfig(
ORIGINAL_PROPERTY_CONFIG,
undefined,
);
expect(result_with_false).toStrictEqual(ORIGINAL_PROPERTY_CONFIG);
expect(result_with_undefined).toStrictEqual(ORIGINAL_PROPERTY_CONFIG);
});
it("Makes sure that fn function validation params are converted to fnString", () => {
const add = (value: unknown) => {
return {
parsed: (value as string) + "__suffix",
message: [],
isValid: true,
};
};
const config = [
{
sectionName: "General",
children: [
{
propertyName: "url",
label: "URL",
controlType: "INPUT_TEXT",
placeholderText: "Enter URL",
inputType: "TEXT",
isBindProperty: true,
isTriggerProperty: false,
validation: {
type: ValidationTypes.FUNCTION,
params: {
fn: add,
expected: {
type: "number",
example: `100`,
autocompleteDataType: AutocompleteDataType.STRING,
},
},
},
},
],
},
];
const expected = [
{
sectionName: "General",
children: [
{
propertyName: "url",
label: "URL",
controlType: "INPUT_TEXT",
placeholderText: "Enter URL",
inputType: "TEXT",
isBindProperty: true,
isTriggerProperty: false,
validation: {
type: ValidationTypes.FUNCTION,
params: {
fnString: add.toString(),
expected: {
type: "number",
example: `100`,
autocompleteDataType: AutocompleteDataType.STRING,
},
},
},
},
],
},
];
const result = convertFunctionsToString(config);
expect(result).toStrictEqual(expected);
});
});