PromucFlow_constructor/app/client/src/sagas/WidgetOperationSagas.tsx
Abhinav Jha 99d660370d Cleanup
DragLayerComponent
2020-01-16 11:46:21 +00:00

211 lines
6.0 KiB
TypeScript

import {
ReduxActionTypes,
ReduxActionErrorTypes,
ReduxAction,
} from "constants/ReduxActionConstants";
import {
WidgetAddChild,
WidgetResize,
WidgetMove,
WidgetDelete,
} from "actions/pageActions";
import { FlattenedWidgetProps } from "reducers/entityReducers/canvasWidgetsReducer";
import { getWidgets, getWidget, getDefaultWidgetConfig } from "./selectors";
import {
generateWidgetProps,
updateWidgetPosition,
} from "utils/WidgetPropsUtils";
import { put, select, takeEvery, takeLatest, all } from "redux-saga/effects";
import { getNextWidgetName } from "utils/AppsmithUtils";
import { UpdateWidgetPropertyPayload } from "actions/controlActions";
import { isDynamicValue } from "utils/DynamicBindingUtils";
import { WidgetProps } from "widgets/BaseWidget";
import _ from "lodash";
import { WidgetTypes } from "constants/WidgetConstants";
export function* addChildSaga(addChildAction: ReduxAction<WidgetAddChild>) {
try {
const {
widgetId,
type,
leftColumn,
topRow,
columns,
rows,
parentRowSpace,
parentColumnSpace,
newWidgetId,
} = addChildAction.payload;
const widget: FlattenedWidgetProps = yield select(getWidget, widgetId);
const widgets = yield select(getWidgets);
const defaultWidgetConfig = yield select(getDefaultWidgetConfig, type);
const childWidget = generateWidgetProps(
widget,
type,
leftColumn,
topRow,
columns,
rows,
parentRowSpace,
parentColumnSpace,
getNextWidgetName(defaultWidgetConfig.widgetName, widgets),
defaultWidgetConfig,
);
childWidget.widgetId = newWidgetId;
widgets[childWidget.widgetId] = childWidget;
if (widget && widget.children) {
widget.children.push(childWidget.widgetId);
}
widgets[widgetId] = widget;
yield put({
type: ReduxActionTypes.UPDATE_LAYOUT,
payload: { widgets },
});
} catch (error) {
yield put({
type: ReduxActionErrorTypes.WIDGET_OPERATION_ERROR,
payload: {
action: ReduxActionTypes.WIDGET_ADD_CHILD,
error,
},
});
}
}
export function* deleteSaga(deleteAction: ReduxAction<WidgetDelete>) {
try {
const { widgetId, parentId } = deleteAction.payload;
const widgets = yield select(getWidgets);
const parent = yield select(getWidget, parentId);
parent.children = parent.children.filter(
(child: string) => child !== widgetId,
);
delete widgets[widgetId];
widgets[parentId] = parent;
yield put({
type: ReduxActionTypes.UPDATE_LAYOUT,
payload: { widgets },
});
} catch (error) {
yield put({
type: ReduxActionErrorTypes.WIDGET_OPERATION_ERROR,
payload: {
action: ReduxActionTypes.WIDGET_DELETE,
error,
},
});
}
}
export function* moveSaga(moveAction: ReduxAction<WidgetMove>) {
try {
const {
widgetId,
leftColumn,
topRow,
parentId,
newParentId,
} = moveAction.payload;
let widget: FlattenedWidgetProps = yield select(getWidget, widgetId);
// Get all widgets from DSL/Redux Store
const widgets = yield select(getWidgets) as any;
// Get parent from DSL/Redux Store
const parent = yield select(getWidget, parentId);
// Update position of widget
widget = updateWidgetPosition(widget, leftColumn, topRow);
// Replace widget with update widget props
widgets[widgetId] = widget;
// If the parent has changed i.e parentWidgetId is not parent.widgetId
if (parent.widgetId !== newParentId && widgetId !== newParentId) {
// Remove from the previous parent
parent.children = parent.children.filter(
(child: string) => child !== widgetId,
);
widgets[parent.widgetId] = parent;
// Add to new parent
widgets[newParentId].children.push(widgetId);
}
yield put({
type: ReduxActionTypes.UPDATE_LAYOUT,
payload: { widgets },
});
} catch (error) {
yield put({
type: ReduxActionErrorTypes.WIDGET_OPERATION_ERROR,
payload: {
action: ReduxActionTypes.WIDGET_MOVE,
error,
},
});
}
}
export function* resizeSaga(resizeAction: ReduxAction<WidgetResize>) {
try {
const {
widgetId,
leftColumn,
rightColumn,
topRow,
bottomRow,
} = resizeAction.payload;
let widget: FlattenedWidgetProps = yield select(getWidget, widgetId);
const widgets = yield select(getWidgets);
if (widget.type === WidgetTypes.CONTAINER_WIDGET) {
console.log(resizeAction.payload);
widget.snapRows = bottomRow - topRow - 1;
}
widget = { ...widget, leftColumn, rightColumn, topRow, bottomRow };
widgets[widgetId] = widget;
yield put({
type: ReduxActionTypes.UPDATE_LAYOUT,
payload: { widgets },
});
} catch (error) {
yield put({
type: ReduxActionErrorTypes.WIDGET_OPERATION_ERROR,
payload: {
action: ReduxActionTypes.WIDGET_RESIZE,
error,
},
});
}
}
function* updateWidgetPropertySaga(
updateAction: ReduxAction<UpdateWidgetPropertyPayload>,
) {
const {
payload: { propertyValue, propertyName, widgetId },
} = updateAction;
const isDynamic = isDynamicValue(propertyValue);
const widget: WidgetProps = yield select(getWidget, widgetId);
let dynamicBindings: Record<string, boolean> = widget.dynamicBindings || {};
if (!isDynamic && propertyName in dynamicBindings) {
dynamicBindings = _.omit(dynamicBindings, propertyName);
}
if (isDynamic && !(propertyName in dynamicBindings)) {
dynamicBindings[propertyName] = true;
}
yield put({
type: ReduxActionTypes.UPDATE_WIDGET_PROPERTY,
payload: { ...updateAction.payload, dynamicBindings },
});
}
export default function* widgetOperationSagas() {
yield all([
takeEvery(ReduxActionTypes.WIDGET_ADD_CHILD, addChildSaga),
takeEvery(ReduxActionTypes.WIDGET_DELETE, deleteSaga),
takeLatest(ReduxActionTypes.WIDGET_MOVE, moveSaga),
takeLatest(ReduxActionTypes.WIDGET_RESIZE, resizeSaga),
takeEvery(
ReduxActionTypes.UPDATE_WIDGET_PROPERTY_REQUEST,
updateWidgetPropertySaga,
),
]);
}