@riil-frontend/component-page-creater
Version:
page creater components,include components list,component attribute panel and page canvas
612 lines (542 loc) • 19.8 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports["default"] = void 0;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _button = _interopRequireDefault(require("@alifd/next/lib/button"));
var _icon = _interopRequireDefault(require("@alifd/next/lib/icon"));
var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
var _box = _interopRequireDefault(require("@alifd/next/lib/box"));
var _dialog = _interopRequireDefault(require("@alifd/next/lib/dialog"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _grid = _interopRequireDefault(require("@alifd/next/lib/grid"));
var _react = _interopRequireWildcard(require("react"));
var _utils = require("@riil-frontend/utils");
var _reactSortablejs = require("react-sortablejs");
var _ColEdit = _interopRequireDefault(require("./ColEdit"));
var _lodash = _interopRequireDefault(require("lodash"));
require("./index.scss");
var _constant = require("./constant");
var _IconTitle = _interopRequireDefault(require("./IconTitle"));
var Row = _grid["default"].Row,
Col = _grid["default"].Col;
var Template = function Template(props) {
var config = props.config,
customGetComRequire = props.customGetComRequire,
getComRequire = props.getComRequire,
isEdit = props.isEdit,
selectedId = props.selectedId,
getBaseAttributes = props.getBaseAttributes,
onSelect = props.onSelect,
setPageState = props.setPageState,
removePageState = props.removePageState,
widgetsProps = props.widgetsProps,
setWidgetsState = props.setWidgetsState,
pageProps = props.pageProps,
request = props.request,
jumpto = props.jumpto,
onConfigChange = props.onConfigChange,
toggleFullScreen = props.toggleFullScreen,
getFullScreenState = props.getFullScreenState,
allWidgets = props.allWidgets,
onAllWidgetsChangeByCom = props.onAllWidgetsChangeByCom,
dragPanelIsDroppable = props.dragPanelIsDroppable,
hideComList = props.hideComList;
var attributes = config.attributes;
var onSortChange = function onSortChange(widgets, item, index) {
var newItem = (0, _extends2["default"])({}, item, {
widgets: widgets
});
var newCols = attributes.cols.map(function (ele, idx) {
if (idx === index) {
return newItem;
} else {
return ele;
}
});
onConfigChange((0, _extends2["default"])({}, config, {
attributes: (0, _extends2["default"])({}, config.attributes, {
cols: newCols
})
}));
}; //删除组件
var _onRemoveItem = function onRemoveItem(item) {
_dialog["default"].confirm({
title: '删除',
content: '是否删除所选组件?',
messageProps: {
type: 'warning'
},
onOk: function onOk() {
var newCols = attributes.cols.map(function (ele) {
var newWidgets = ele.widgets.filter(function (fd) {
return fd.id !== item.id;
});
return (0, _extends2["default"])({}, ele, {
widgets: newWidgets
});
});
onConfigChange((0, _extends2["default"])({}, config, {
attributes: (0, _extends2["default"])({}, config.attributes, {
cols: newCols
})
}));
}
});
};
var onChildConfigChange = function onChildConfigChange(comWidget, callback, isUpdateService) {
if (isUpdateService === void 0) {
isUpdateService = true;
}
var newCols = attributes.cols.map(function (ele) {
var newWidgets = ele.widgets.map(function (fd) {
if (fd.id === comWidget.id) {
return comWidget;
} else {
return fd;
}
});
return (0, _extends2["default"])({}, ele, {
widgets: newWidgets
});
});
onConfigChange((0, _extends2["default"])({}, config, {
attributes: (0, _extends2["default"])({}, config.attributes, {
cols: newCols
})
}), callback, isUpdateService);
};
var generateDOM = function generateDOM(widgets, direction) {
if ((0, _utils.isAvailableArray)(widgets)) {
return widgets.filter(function (ele) {
return !hideComList.includes(ele.type);
}).map(function (item, i) {
var Com = getComRequire(item.type, item.importFrom, customGetComRequire);
var layouts = item.layouts;
if (layouts.y === null) {
layouts.y = 0;
}
var editClassName = isEdit ? ' edit' : '';
var selectClassName = selectedId === item.id && isEdit ? ' selected' : '';
var _style = item.comContainerAttributes ? item.comContainerAttributes : getBaseAttributes();
var paddingLeft = _style.paddingLeft,
paddingRight = _style.paddingRight,
paddingTop = _style.paddingTop,
paddingBottom = _style.paddingBottom;
return /*#__PURE__*/_react["default"].createElement("div", {
onClick: function onClick(e) {
e.stopPropagation(); // isEdit && onSelect && onSelect(item.id);
},
onMouseDown: function onMouseDown(e) {
e.stopPropagation();
isEdit && onSelect && onSelect(item.id);
},
className: 'drag-item-custom' + editClassName + selectClassName,
key: item.id,
style: {
width: direction === 'row' ? 0 : "calc(100% - " + (paddingLeft + paddingRight) + "px)",
position: 'relative',
marginTop: paddingTop,
marginLeft: paddingLeft,
marginRight: paddingRight,
marginBottom: paddingBottom,
flex: 1,
height: direction === 'row' ? "calc(100% - " + (paddingBottom + paddingTop) + "px)" : 0
},
id: item.id,
draggable: isEdit,
onDragStart: function onDragStart(e) {
if (!isEdit) {
return;
}
e.dataTransfer.setData('text/plain', JSON.stringify(item));
}
}, /*#__PURE__*/_react["default"].createElement(DragItem, {
config: item,
setPageState: setPageState,
removePageState: removePageState,
pageProps: pageProps,
isEdit: isEdit,
onRemoveItem: function onRemoveItem() {
_onRemoveItem(item);
},
render: /*#__PURE__*/_react["default"].createElement(Com, {
isEdit: isEdit,
config: item,
pageProps: pageProps,
widgetsProps: widgetsProps,
setPageState: setPageState,
setWidgetsState: setWidgetsState,
request: request,
jumpto: jumpto,
onConfigChange: onChildConfigChange,
toggleFullScreen: toggleFullScreen,
getFullScreenState: getFullScreenState,
getBaseAttributes: getBaseAttributes,
getComRequire: getComRequire,
customGetComRequire: customGetComRequire
})
}));
});
} else {
return null;
}
};
var findItemById = function findItemById(id, index) {
var dragFrom;
var dragTo = index;
var isPass = true;
var newConfig;
var dragItem;
config.attributes.cols.forEach(function (item, idx) {
item.widgets.forEach(function (ele) {
if (ele.id === id) {
isPass = false;
dragFrom = idx;
dragItem = ele;
}
});
});
if (dragFrom === dragTo || dragFrom === undefined) {
newConfig = null;
} else {
newConfig = _lodash["default"].cloneDeep(config);
newConfig.attributes.cols.forEach(function (item, idx) {
if (idx === dragFrom) {
item.widgets = item.widgets.filter(function (ele) {
return ele.id != id;
});
} else if (idx === dragTo) {
item.widgets.push(dragItem);
}
});
}
if (newConfig) {
onConfigChange(newConfig);
}
return isPass;
};
/**
* 查找拖拽的业务组件,是否存在于其他的容器内
* @param {string} id
* @returns {null|{ widgetsIndex: number, colsIndex: number, childrenWidgetsIndex: number }} -若查无数据,返回null,若查找到,返回对应索引
*/
var findItemInOtherTemplate = function findItemInOtherTemplate(id) {
var result = null;
allWidgets.forEach(function (item, index) {
if (item.type === _constant.CONTAINER_COM_TYPE) {
item.attributes.cols.forEach(function (ele, eleIndex) {
ele.widgets.forEach(function (fd, fdIndex) {
if (fd.id === id) {
result = {
widgetsIndex: index,
colsIndex: eleIndex,
childrenWidgetsIndex: fdIndex
};
}
});
});
}
});
return result;
};
return /*#__PURE__*/_react["default"].createElement("div", {
className: "uicbb-container-wrap"
}, /*#__PURE__*/_react["default"].createElement(Row, {
className: "template-row",
wrap: true
}, attributes.cols.map(function (item, index) {
var span = item.span,
widgets = item.widgets,
direction = item.direction;
return /*#__PURE__*/_react["default"].createElement(Col, {
className: "template-col " + (isEdit ? '' : 'view') + " " + (selectedId === config.id && isEdit ? 'content-selected ' : ''),
span: span,
key: 'cols' + index
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "template-col-content",
onDragOver: function onDragOver(e) {
if (!isEdit) {
return;
}
if (!dragPanelIsDroppable) {
e.preventDefault();
e.stopPropagation();
}
},
onDrop: function onDrop(e) {
var _config = JSON.parse(e.dataTransfer.getData('text/plain'));
var hasCom = findItemById(_config.id, index); // 查找本容器内是否包含拖拽业务组件,若存在,则不执行drop
if (!hasCom || _config.type === _constant.CONTAINER_COM_TYPE || _config.type === 'layout' || !isEdit) {
return;
} // 查找拖拽业务组件是否来自本页面其他容器,若是,则进行移动组件操作
var hasComInOtherTemplate = findItemInOtherTemplate(_config.id);
if (hasComInOtherTemplate) {
var newAllWidgets = _lodash["default"].cloneDeep(allWidgets);
newAllWidgets.forEach(function (item1, widgetsIndex) {
if (widgetsIndex === hasComInOtherTemplate.widgetsIndex) {
item1.attributes.cols.forEach(function (item2, eleIndex) {
if (eleIndex === hasComInOtherTemplate.colsIndex) {
item2.widgets.splice(hasComInOtherTemplate.childrenWidgetsIndex, 1);
}
});
} else if (item1.id === config.id) {
item1.attributes.cols[index].widgets.push(_config);
}
});
onAllWidgetsChangeByCom(newAllWidgets);
return;
} //从工具栏拖拽进入本容器,创建新的业务组件
var id = (0, _utils.getUUID)();
_config.id = id;
var newWidgets = [].concat(widgets, [_config]);
var newItem = (0, _extends2["default"])({}, item, {
widgets: newWidgets
});
var newCols = attributes.cols.map(function (ele, idx) {
if (idx === index) {
return newItem;
} else {
return ele;
}
});
onConfigChange((0, _extends2["default"])({}, config, {
attributes: (0, _extends2["default"])({}, config.attributes, {
cols: newCols
})
}));
onSelect(id);
}
}, isEdit ? /*#__PURE__*/_react["default"].createElement(_reactSortablejs.ReactSortable, {
list: widgets,
setList: function setList(wd) {
onSortChange(wd, item, index);
},
style: {
width: '100%',
height: '100%',
display: 'flex',
flexDirection: direction
}
}, (0, _utils.isAvailableArray)(widgets) ? generateDOM(widgets, direction) : null) : /*#__PURE__*/_react["default"].createElement("div", {
style: {
width: '100%',
height: '100%',
display: 'flex',
flexDirection: direction
}
}, (0, _utils.isAvailableArray)(widgets) ? generateDOM(widgets, direction) : null), widgets.length === 0 && isEdit ? /*#__PURE__*/_react["default"].createElement(_box["default"], {
align: "center",
justify: "center",
className: "drag-background-info"
}, "\u5C06\u7EC4\u4EF6\u62D6\u81F3\u6B64\u533A\u57DF") : null));
})));
};
var DragItem = /*#__PURE__*/function (_Component) {
(0, _inheritsLoose2["default"])(DragItem, _Component);
function DragItem(props) {
var _this;
_this = _Component.call(this, props) || this;
var config = props.config,
setPageState = props.setPageState;
if (config && config.publishProps) {
config.publishProps.forEach(function (item) {
var _setPageState;
setPageState((_setPageState = {}, _setPageState[item.key] = item.defaultValue, _setPageState));
});
}
return _this;
}
var _proto = DragItem.prototype;
_proto.componentWillUnmount = function componentWillUnmount() {
var _this$props = this.props,
config = _this$props.config,
removePageState = _this$props.removePageState;
if (config && config.publishProps) {
removePageState(config.publishProps.map(function (item) {
return item.key;
}));
}
};
_proto.render = function render() {
var _this$props2 = this.props,
children = _this$props2.children,
config = _this$props2.config,
pageProps = _this$props2.pageProps,
isEdit = _this$props2.isEdit,
onRemoveItem = _this$props2.onRemoveItem,
render = _this$props2.render;
var lackInfoElements = [];
var removeElement = isEdit ? /*#__PURE__*/_react["default"].createElement(_button["default"], {
className: "content-remove",
onMouseDown: function onMouseDown(e) {
e.stopPropagation();
},
onClick: function onClick(e) {
e.stopPropagation();
onRemoveItem();
},
title: "\u5220\u9664\u7EC4\u4EF6",
style: {
background: '#666666',
color: 'white'
},
text: true
}, /*#__PURE__*/_react["default"].createElement(_icon["default"], {
type: "ashbin"
})) : null; //只有在浏览模式下(!isEdit),缺少等级属性,才会显示为lackInfoElements
if (!isEdit && config && config.dependentProps) {
config.dependentProps.forEach(function (item) {
if (!(item.key in pageProps)) {
lackInfoElements.push( /*#__PURE__*/_react["default"].createElement("div", {
key: item.key
}, item.info));
}
});
}
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, lackInfoElements.length > 0 ? /*#__PURE__*/_react["default"].createElement("div", {
style: {
width: '100%',
height: '100%',
border: '1px solid #e9e9e9',
background: 'white'
}
}, lackInfoElements) : render, isEdit && config.type !== _constant.CONTAINER_COM_TYPE ? /*#__PURE__*/_react["default"].createElement("div", {
className: "edit-item-mask"
}) : null, removeElement, children);
};
return DragItem;
}(_react.Component);
Template.config = {
layouts: {
x: 0,
y: 0,
w: 24,
h: 8,
i: 'uuid',
"static": false
},
id: 'uuid',
title: '这是逻辑面板组件,拖拽添加到画布',
icon: '',
type: 'uicbb-container',
importFrom: 'local',
isOnlyOne: false,
comContainerAttributes: {
paddingLeft: 0,
paddingTop: 0,
paddingRight: 0,
paddingBottom: 0
},
attributes: {
comName: '布局模板',
cols: [{
span: 12,
direction: 'row',
widgets: []
}, {
span: 12,
direction: 'column',
widgets: []
}]
}
};
Template.getSchema = /*#__PURE__*/function () {
var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(_ref) {
var pageProps, config, request;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
pageProps = _ref.pageProps, config = _ref.config, request = _ref.request;
return _context.abrupt("return", {
type: 'object',
defaultValue: {
cols: [{
span: 6,
widgets: []
}, {
span: 18,
widgets: []
}]
},
properties: {
Collapse: {
type: 'object',
'x-component': 'FormCollapse',
'x-component-props': {
defaultExpandedKeys: ['panel1', 'panel2']
},
'x-props': {
style: {
paddingTop: 12
}
},
properties: {
panel1: {
type: 'object',
'x-component': 'FormCollapsePanel',
'x-component-props': {
title: /*#__PURE__*/_react["default"].createElement(_IconTitle["default"], {
title: "\u6837\u5F0F",
iconInfo: {
icon: 'Businesscenter-Details',
tooltip: '最多配置6列,列的总栅格数为24。'
}
}),
key: 'panel1'
},
properties: {
cols: {
triggerType: 'onChange',
type: 'array',
'x-component': 'ColEdit',
'x-rules': function xRules(value) {
var totle = 0;
value.forEach(function (element) {
var num = Number(element.span);
totle += num;
});
if (totle === 24) {
return null;
} else {
return '请调整栅格数,保证总数为24栅格!';
}
}
}
}
}
}
}
}
});
case 2:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return function (_x) {
return _ref2.apply(this, arguments);
};
}();
Template.CustomScCom = {
ColEdit: _ColEdit["default"]
};
Template.validate = function (attributes) {
var totle = 0;
attributes.cols.forEach(function (element) {
var num = Number(element.span);
totle += num;
});
return totle === 24;
};
Template.stopChangeOnValidateError = true;
Template.defaultProps = {
hideComList: []
};
var _default = Template;
exports["default"] = _default;