UNPKG

@riil-frontend/component-page-creater

Version:

page creater components,include components list,component attribute panel and page canvas

299 lines (268 loc) 8.1 kB
import _Tab from "@alifd/next/es/tab"; import _extends from "@babel/runtime/helpers/extends"; import React, { forwardRef, useRef, useImperativeHandle, useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import _ from 'lodash'; import { usePrevious } from 'ahooks'; import './AttributesPanel.scss'; import PageContent from './AttrContents/PageContent'; import TemplateContent from './AttrContents/TemplateContent'; import ComponentContent from './AttrContents/ComponentContent'; import { CONTAINER_COM_TYPE, LAYOUT_TYPE } from '../constant'; //formily表单初始化 // setup(); var AttributesPanel = /*#__PURE__*/forwardRef(function (props, ref) { var pageConfig = props.pageConfig, selectId = props.selectId, pageProps = props.pageProps, request = props.request, onChange = props.onChange, attrConfig = props.attrConfig, templateData = props.templateData, onTemplateChange = props.onTemplateChange, imgPath = props.imgPath, layoutList = props.layoutList, tabProps = props.tabProps, customGetComRequire = props.customGetComRequire; var templateRef = useRef(); var pageRef = useRef(); var componentRef = useRef(); useImperativeHandle(ref, function () { return { templateRef: templateRef, componentRef: componentRef, pageRef: pageRef }; }); var _useState = useState('page'), activeTab = _useState[0], setActiveTab = _useState[1]; var _useState2 = useState({ selectItem: undefined, isInTemplate: false }), selectItem = _useState2[0], setSelectItem = _useState2[1]; var _useState3 = useState(attrConfig), tabData = _useState3[0], setTabData = _useState3[1]; //当前选中组件上一次状态,用来实现自动切换页签时的判断 var preSelectItem = usePrevious(selectItem); useEffect(function () { var _selectItem = undefined; //标记是否是容器内组件 var isInTemplate = false; if (selectId) { pageConfig.widgets.forEach(function (item) { if (item.id === selectId) { _selectItem = item; } else { if (item.type === CONTAINER_COM_TYPE) { item.attributes.cols.forEach(function (ele) { ele.widgets.forEach(function (fd) { if (fd.id === selectId) { isInTemplate = true; _selectItem = fd; } }); }); } } }); } setSelectItem({ selectItem: _selectItem, isInTemplate: isInTemplate }); }, [selectId]); useEffect(function () { var _tabData = attrConfig.filter(function (item) { return !(!selectItem.selectItem && item.key === 'component'); }); setTabData(_tabData); //若当前选中组件不存在,则自动跳转到页面设置 //若当前选中组件存在,且和上一次选中状态比较,为不同组件,则自动跳转到组件页签 if (!selectItem.selectItem) { setActiveTab('page'); } else { if (!preSelectItem.selectItem || selectItem.selectItem.id !== preSelectItem.selectItem.id) { setActiveTab('component'); } } }, [selectItem]); /** * 属性面板变更回调 * fix bug info 仅对组件配置数据中的attributes属性进行赋值操作, * 避免属性面板显示时,改变组件布局,再修改属性值,引起布局数据被覆盖的问题 * @param {array} widget * @param {boolean} isIn 判断是否是容器内组件 */ var onAttrChange = function onAttrChange(widget, isIn) { var widgets = _.cloneDeep(pageConfig.widgets); //若是容器内组件,则更新容器内attributes组件配置 if (isIn) { widgets = widgets.map(function (item) { if (item.id === widget.id) { item = _extends({}, item, { attributes: widget.attributes }); return item; } else if (item.type === CONTAINER_COM_TYPE) { var cols = item.attributes.cols.map(function (ele) { var widSub = ele.widgets.map(function (fd) { if (fd.id === widget.id) { fd = _extends({}, fd, { attributes: widget.attributes }); } return fd; }); return _extends({}, ele, { widgets: widSub }); }); return _extends({}, item, { attributes: _extends({}, item.attributes, { cols: cols }) }); } }); } else { widgets = widgets.map(function (item) { if (item.id === selectId) { item = _extends({}, item, { attributes: widget.attributes }); } return item; }); } onChange(_extends({}, pageConfig, { widgets: widgets })); }; return /*#__PURE__*/React.createElement("div", { className: "uicbb-attr-panel" }, /*#__PURE__*/React.createElement(_Tab, _extends({ shape: "pure", className: "uicbb-attr-panel-pure" }, tabProps, { activeKey: activeTab, onChange: function onChange(key) { setActiveTab(key); } }), tabData.map(function (item) { var content = null; if (item.key === 'component') { content = /*#__PURE__*/React.createElement(ComponentContent, { ref: componentRef, selectItem: selectItem.selectItem, pageProps: pageProps, request: request, onAttrChange: onAttrChange, isInTemplate: selectItem.isInTemplate, customGetComRequire: customGetComRequire }); } else if (item.key === 'template') { content = /*#__PURE__*/React.createElement(TemplateContent, { layoutList: layoutList, imgPath: imgPath, ref: templateRef, templateData: templateData, onTemplateChange: onTemplateChange }); } else if (item.key === 'page') { content = /*#__PURE__*/React.createElement(PageContent, { ref: pageRef, pageConfig: pageConfig, templateData: templateData, onTemplateChange: onTemplateChange }); } else { content = item.render(selectItem, pageConfig, templateData); } return /*#__PURE__*/React.createElement(_Tab.Item, { key: item.key, title: item.name }, /*#__PURE__*/React.createElement("div", { style: { height: '100%', overflow: 'auto' } }, content)); }))); }); AttributesPanel.propTypes = { /** * 模板数据 */ templateData: PropTypes.object, /** * 画布的配置数据 */ pageConfig: PropTypes.object, /** * 当前选中组件id */ selectId: PropTypes.string, /** * (pageConfig)=>{}属性面板发生改变时的回调 */ onChange: PropTypes.func, /** * 页面公共属性 */ pageProps: PropTypes.any, /** * 数据请求体 */ request: PropTypes.any, /** * 属性面板配置数据 */ attrConfig: PropTypes.array, /** * 模板属性发生变化时回调 */ onTemplateChange: PropTypes.func, /** * 图标组件中的图片路径 */ imgPath: PropTypes.string, /** * 模板属性中,布局类型列表 */ layoutList: PropTypes.array, /** * 透传tab组件属性 */ tabProps: PropTypes.object, /** * 自定义组件引用方法 */ customGetComRequire: PropTypes.func }; AttributesPanel.defaultProps = { noDataImgSrc: '/noDataImg/tableNotData.svg', imgPath: '/img/uicbb/layout/', layoutList: [{ key: LAYOUT_TYPE.horizontal, label: '左侧页签', img: 'hlayout.png' }, { key: LAYOUT_TYPE.vertical, label: '上页签', img: 'vlayout.png' }, { key: LAYOUT_TYPE.single, label: '无页签', img: 'slayout.png' }], attrConfig: [{ name: '模板设置', key: 'template' }, { name: '页面设置', key: 'page' }, { name: '组件设置', key: 'component' }] }; export default AttributesPanel;