PromucFlow_constructor/app/client/src/widgets/IframeWidget/widget/index.tsx

209 lines
6.0 KiB
TypeScript
Raw Normal View History

import React from "react";
import BaseWidget, { WidgetState } from "widgets/BaseWidget";
import { ValidationTypes } from "constants/WidgetValidation";
import { EventType } from "constants/AppsmithActionConstants/ActionConstants";
import IframeComponent from "../component";
import { IframeWidgetProps } from "../constants";
class IframeWidget extends BaseWidget<IframeWidgetProps, WidgetState> {
static getPropertyPaneConfig() {
return [
{
sectionName: "General",
children: [
{
propertyName: "source",
helpText: "The URL of the page to embed",
label: "URL",
controlType: "INPUT_TEXT",
placeholderText: "https://docs.appsmith.com",
isBindProperty: true,
isTriggerProperty: false,
validation: {
2021-07-28 06:01:09 +00:00
type: ValidationTypes.SAFE_URL,
params: {
default: "https://www.example.com",
},
},
},
{
propertyName: "srcDoc",
helpText: "Inline HTML to embed, overriding the src attribute",
label: "srcDoc",
controlType: "INPUT_TEXT",
placeholderText: "<p>Inline HTML</p>",
isBindProperty: true,
isTriggerProperty: false,
validation: {
type: ValidationTypes.TEXT,
},
},
{
propertyName: "title",
helpText: "Label the content of the page to embed",
label: "Title",
controlType: "INPUT_TEXT",
placeholderText: "Documentation",
isBindProperty: true,
isTriggerProperty: false,
validation: { type: ValidationTypes.TEXT },
},
{
propertyName: "animateLoading",
label: "Animate Loading",
controlType: "SWITCH",
helpText: "Controls the loading of the widget",
defaultValue: true,
isJSConvertible: true,
isBindProperty: true,
isTriggerProperty: false,
validation: { type: ValidationTypes.BOOLEAN },
},
],
},
{
sectionName: "Events",
children: [
{
helpText: "Triggers an action when the source URL is changed",
propertyName: "onURLChanged",
label: "onURLChanged",
controlType: "ACTION_SELECTOR",
isJSConvertible: true,
isBindProperty: true,
isTriggerProperty: true,
},
{
helpText: "Triggers an action when the srcDoc is changed",
propertyName: "onSrcDocChanged",
label: "onSrcDocChanged",
controlType: "ACTION_SELECTOR",
isJSConvertible: true,
isBindProperty: true,
isTriggerProperty: true,
},
{
helpText: "Triggers an action when a message event is received",
propertyName: "onMessageReceived",
label: "onMessageReceived",
controlType: "ACTION_SELECTOR",
isJSConvertible: true,
isBindProperty: true,
isTriggerProperty: true,
},
],
},
{
sectionName: "Styles",
children: [
{
propertyName: "borderColor",
label: "Border Color",
controlType: "COLOR_PICKER",
isBindProperty: false,
isTriggerProperty: false,
},
{
propertyName: "borderOpacity",
label: "Border Opacity (%)",
controlType: "INPUT_TEXT",
isBindProperty: true,
isTriggerProperty: false,
inputType: "NUMBER",
validation: {
type: ValidationTypes.NUMBER,
params: { min: 0, max: 100, default: 100 },
},
},
{
propertyName: "borderWidth",
label: "Border Width (px)",
controlType: "INPUT_TEXT",
isBindProperty: true,
isTriggerProperty: false,
inputType: "NUMBER",
validation: {
type: ValidationTypes.NUMBER,
params: { min: 0, default: 1 },
},
},
],
},
];
}
static getMetaPropertiesMap(): Record<string, any> {
return {
message: undefined,
};
}
handleUrlChange = (url: string) => {
if (url && this.props.onURLChanged) {
super.executeAction({
triggerPropertyName: "onURLChanged",
dynamicString: this.props.onURLChanged,
event: {
type: EventType.ON_IFRAME_URL_CHANGED,
},
});
}
};
handleSrcDocChange = (srcDoc?: string) => {
if (srcDoc && this.props.onSrcDocChanged) {
super.executeAction({
triggerPropertyName: "onSrcDocChanged",
dynamicString: this.props.onSrcDocChanged,
event: {
type: EventType.ON_IFRAME_SRC_DOC_CHANGED,
},
});
}
};
handleMessageReceive = (event: MessageEvent) => {
this.props.updateWidgetMetaProperty("message", event.data, {
triggerPropertyName: "onMessageReceived",
dynamicString: this.props.onMessageReceived,
event: {
type: EventType.ON_IFRAME_MESSAGE_RECEIVED,
},
});
};
getPageView() {
const {
borderColor,
borderOpacity,
borderWidth,
renderMode,
source,
srcDoc,
title,
widgetId,
} = this.props;
2021-07-28 06:01:09 +00:00
return (
<IframeComponent
borderColor={borderColor}
borderOpacity={borderOpacity}
borderWidth={borderWidth}
onMessageReceived={this.handleMessageReceive}
onSrcDocChanged={this.handleSrcDocChange}
onURLChanged={this.handleUrlChange}
renderMode={renderMode}
source={source}
srcDoc={srcDoc}
title={title}
widgetId={widgetId}
/>
);
}
static getWidgetType(): string {
return "IFRAME_WIDGET";
}
}
export default IframeWidget;