PromucFlow_constructor/app/client/src/pages/Editor/index.tsx

153 lines
4.5 KiB
TypeScript
Raw Normal View History

import React, { Component, Context, createContext } from "react";
import { connect } from "react-redux";
import styled from "styled-components";
import Canvas from "./Canvas";
import {
WidgetCardProps,
WidgetProps,
WidgetOperation,
WidgetFunctions,
} from "../../widgets/BaseWidget";
import { AppState } from "../../reducers";
import { EditorReduxState } from "../../reducers/uiReducers/editorReducer";
import WidgetCardsPane from "./WidgetCardsPane";
import EditorHeader from "./EditorHeader";
import CanvasWidgetsNormalizer from "../../normalizers/CanvasWidgetsNormalizer";
import { ContainerWidgetProps } from "../../widgets/ContainerWidget";
import { fetchPage, updateWidget, savePage } from "../../actions/pageActions";
import { RenderModes } from "../../constants/WidgetConstants";
import { executeAction } from "../../actions/widgetActions";
import { ActionPayload } from "../../constants/ActionConstants";
import PropertyPane from "./PropertyPane";
2019-08-20 13:19:19 +00:00
2019-08-29 11:22:09 +00:00
const CanvasContainer = styled.section`
2019-08-20 13:19:19 +00:00
height: 100%;
width: 100%;
position: relative;
overflow-x: auto;
2019-08-20 13:19:19 +00:00
overflow-y: auto;
margin: 0px 10px;
2019-08-26 12:41:21 +00:00
&:before {
position: absolute;
2019-09-09 09:08:54 +00:00
top: 0;
right: 0;
bottom: 0;
left: 0;
2019-08-26 12:41:21 +00:00
pointer-events: none;
}
2019-08-20 13:19:19 +00:00
`;
2019-08-26 12:41:21 +00:00
const EditorWrapper = styled.div`
display: flex;
flex-direction: row;
align-items: stretch;
justify-content: flex-start;
width: 100vw;
overflow: hidden;
padding: 10px;
height: calc(100vh - 60px);
2019-08-29 11:22:09 +00:00
`;
type EditorProps = {
dsl: ContainerWidgetProps<WidgetProps> | any;
2019-08-29 11:22:09 +00:00
fetchCanvasWidgets: Function;
executeAction: (actionPayloads?: ActionPayload[]) => void;
updateWidget: Function;
cards: { [id: string]: WidgetCardProps[] } | any;
savePageLayout: Function;
currentPageName: string;
currentPageId: string;
currentLayoutId: string;
isSaving: boolean;
};
2019-08-26 12:41:21 +00:00
export const WidgetFunctionsContext: Context<WidgetFunctions> = createContext(
{},
);
2019-08-29 11:22:09 +00:00
class Editor extends Component<EditorProps> {
2019-08-26 12:41:21 +00:00
componentDidMount() {
this.props.fetchCanvasWidgets(this.props.currentPageId);
2019-08-26 12:41:21 +00:00
}
2019-08-29 11:22:09 +00:00
public render() {
return (
<WidgetFunctionsContext.Provider
value={{
executeAction: this.props.executeAction,
updateWidget: this.props.updateWidget,
}}
>
<EditorHeader
notificationText={this.props.isSaving ? "Saving page..." : undefined}
pageName={this.props.currentPageName}
/>
2019-08-26 12:41:21 +00:00
<EditorWrapper>
<WidgetCardsPane cards={this.props.cards} />
2019-08-29 11:22:09 +00:00
<CanvasContainer>
{this.props.dsl && <Canvas dsl={this.props.dsl} />}
2019-08-29 11:22:09 +00:00
</CanvasContainer>
<PropertyPane />
2019-08-26 12:41:21 +00:00
</EditorWrapper>
</WidgetFunctionsContext.Provider>
);
}
}
const mapStateToProps = (state: AppState): EditorReduxState => {
// TODO(abhinav) : Benchmark this, see how many times this is called in the application
// lifecycle. Move to using flattend redux state for widgets if necessary.
// Also, try to merge the widgetCards and widgetConfigs in the fetch Saga.
// No point in storing widgetCards, without widgetConfig
// Alternatively, try to see if we can continue to use only WidgetConfig and eliminate WidgetCards
const dsl = CanvasWidgetsNormalizer.denormalize(
state.ui.editor.pageWidgetId,
state.entities,
);
2019-09-27 16:05:33 +00:00
const cards = state.ui.editor.cards;
const groups: string[] = Object.keys(cards);
groups.forEach((group: string) => {
cards[group] = cards[group].map((widget: WidgetCardProps) => {
const { rows, columns } = state.entities.widgetConfig.config[widget.type];
return { ...widget, rows, columns };
});
});
2019-08-26 12:41:21 +00:00
return {
cards,
dsl,
pageWidgetId: state.ui.editor.pageWidgetId,
currentPageId: state.ui.editor.currentPageId,
currentLayoutId: state.ui.editor.currentLayoutId,
currentPageName: state.ui.editor.currentPageName,
isSaving: state.ui.editor.isSaving,
};
};
2019-08-26 12:41:21 +00:00
const mapDispatchToProps = (dispatch: any) => {
return {
executeAction: (actionPayloads?: ActionPayload[]) =>
dispatch(executeAction(actionPayloads)),
fetchCanvasWidgets: (pageId: string) =>
dispatch(fetchPage(pageId, RenderModes.CANVAS)),
updateWidget: (
operation: WidgetOperation,
widgetId: string,
payload: any,
) => dispatch(updateWidget(operation, widgetId, payload)),
savePageLayout: (
pageId: string,
layoutId: string,
dsl: ContainerWidgetProps<WidgetProps>,
) => dispatch(savePage(pageId, layoutId, dsl)),
};
};
2019-08-26 12:41:21 +00:00
export default connect(
mapStateToProps,
mapDispatchToProps,
)(Editor);