import React, { CSSProperties } from "react";
import ContainerWidget from "widgets/ContainerWidget/widget";
import { GridDefaults } from "constants/WidgetConstants";
import DropTargetComponent from "components/editorComponents/DropTargetComponent";
import { getCanvasSnapRows } from "utils/WidgetPropsUtils";
import { getCanvasClassName } from "utils/generators";
import WidgetFactory, { DerivedPropertiesMap } from "utils/WidgetFactory";
import { DSLWidget } from "./constants";
import { CanvasWidgetStructure } from "./constants";
import { CANVAS_DEFAULT_MIN_HEIGHT_PX } from "constants/AppConstants";
class CanvasWidget extends ContainerWidget {
static getPropertyPaneConfig() {
return [];
}
static getWidgetType() {
return "CANVAS_WIDGET";
}
getCanvasProps(): DSLWidget & { minHeight: number } {
return {
...this.props,
parentRowSpace: 1,
parentColumnSpace: 1,
topRow: 0,
leftColumn: 0,
containerStyle: "none",
detachFromLayout: true,
minHeight: this.props.minHeight || CANVAS_DEFAULT_MIN_HEIGHT_PX,
shouldScrollContents: false,
};
}
renderAsDropTarget() {
const canvasProps = this.getCanvasProps();
const { snapColumnSpace } = this.getSnapSpaces();
return (
{this.renderAsContainerComponent(canvasProps)}
);
}
renderChildWidget(childWidgetData: CanvasWidgetStructure): React.ReactNode {
if (!childWidgetData) return null;
const childWidget = { ...childWidgetData };
const snapSpaces = this.getSnapSpaces();
childWidget.parentColumnSpace = snapSpaces.snapColumnSpace;
childWidget.parentRowSpace = snapSpaces.snapRowSpace;
if (this.props.noPad) childWidget.noContainerOffset = true;
childWidget.parentId = this.props.widgetId;
return WidgetFactory.createWidget(childWidget, this.props.renderMode);
}
getPageView() {
let height = 0;
const snapRows = getCanvasSnapRows(this.props.bottomRow);
height = snapRows * GridDefaults.DEFAULT_GRID_ROW_HEIGHT;
const style: CSSProperties = {
width: "100%",
height: `${height}px`,
background: "none",
position: "relative",
};
// This div is the DropTargetComponent alternative for the page view
// DropTargetComponent and this div are responsible for the canvas height
return (
{this.renderAsContainerComponent(this.getCanvasProps())}
);
}
getCanvasView() {
if (!this.props.dropDisabled) {
return this.renderAsDropTarget();
}
return this.getPageView();
}
static getDerivedPropertiesMap(): DerivedPropertiesMap {
return {};
}
static getDefaultPropertiesMap(): Record {
return {};
}
// TODO Find a way to enforce this, (dont let it be set)
static getMetaPropertiesMap(): Record {
return {};
}
}
export const CONFIG = {
type: CanvasWidget.getWidgetType(),
name: "Canvas",
hideCard: true,
eagerRender: true,
defaults: {
rows: 0,
columns: 0,
widgetName: "Canvas",
version: 1,
detachFromLayout: true,
},
properties: {
derived: CanvasWidget.getDerivedPropertiesMap(),
default: CanvasWidget.getDefaultPropertiesMap(),
meta: CanvasWidget.getMetaPropertiesMap(),
config: CanvasWidget.getPropertyPaneConfig(),
},
};
export default CanvasWidget;