@alilc/lowcode-editor-skeleton
Version:
alibaba lowcode editor skeleton
298 lines (296 loc) • 10.7 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.PopupField = exports.PlainField = exports.Field = exports.EntryField = void 0;
var _icon = _interopRequireDefault(require("@alifd/next/lib/icon"));
var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
var _react = require("react");
var _lodash = require("lodash");
var _classnames = _interopRequireDefault(require("classnames"));
var _lowcodeEditorCore = require("@alilc/lowcode-editor-core");
var _popup = require("../popup");
require("./index.less");
var _inlinetip = _interopRequireDefault(require("./inlinetip"));
var _locale = require("../../locale");
var _lowcodeUtils = require("@alilc/lowcode-utils");
/* eslint-disable react/no-unused-prop-types */
var logger = new _lowcodeUtils.Logger({
level: 'warn',
bizName: 'skeleton:field'
});
var Field = exports.Field = /*#__PURE__*/function (_Component) {
function Field(props) {
var _this;
_this = _Component.call(this, props) || this;
_this.state = {
collapsed: _this.props.collapsed,
display: _this.props.defaultDisplay || 'inline',
hasError: false
};
_this.body = null;
_this.dispose = void 0;
_this.toggleExpand = function () {
var onExpandChange = _this.props.onExpandChange;
// eslint-disable-next-line react/no-access-state-in-setstate
var collapsed = !_this.state.collapsed;
_this.setState({
collapsed: collapsed
});
onExpandChange && onExpandChange(!collapsed);
};
_this.handleClear = _this.handleClear.bind(_this);
_this.clickHandler = _this.clickHandler.bind(_this);
return _this;
}
(0, _inheritsLoose2["default"])(Field, _Component);
var _proto = Field.prototype;
_proto.deployBlockTesting = function deployBlockTesting() {
var _this2 = this;
if (this.dispose) {
this.dispose();
}
var body = this.body;
if (!body) {
return;
}
var check = function check() {
var setter = body.firstElementChild;
if (setter && setter.classList.contains('lc-block-setter')) {
_this2.setState({
display: 'block'
});
} else {
_this2.setState({
display: 'inline'
});
}
};
var observer = new MutationObserver(check);
check();
observer.observe(body, {
childList: true,
subtree: true,
attributes: true,
attributeFilter: ['class']
});
this.dispose = function () {
return observer.disconnect();
};
};
_proto.handleClear = function handleClear(e) {
e.stopPropagation();
this.props.onClear && this.props.onClear();
};
_proto.componentDidMount = function componentDidMount() {
var defaultDisplay = this.props.defaultDisplay;
if (!defaultDisplay || defaultDisplay === 'inline') {
this.deployBlockTesting();
}
};
_proto.componentWillUnmount = function componentWillUnmount() {
if (this.dispose) {
this.dispose();
}
};
Field.getDerivedStateFromError = function getDerivedStateFromError() {
return {
hasError: true
};
};
_proto.componentDidCatch = function componentDidCatch(error, errorInfo) {
logger.error(this.props.title + " has error", error, errorInfo);
};
_proto.getTipContent = function getTipContent(propName, tip) {
var tipContent = /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", null, (0, _locale.intl)('Attribute: '), propName));
if ((0, _lodash.isObject)(tip)) {
tipContent = /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", null, (0, _locale.intl)('Attribute: '), propName), /*#__PURE__*/React.createElement("div", null, (0, _locale.intl)('Description: '), tip.content));
} else if (tip) {
tipContent = /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", null, (0, _locale.intl)('Attribute: '), propName), /*#__PURE__*/React.createElement("div", null, (0, _locale.intl)('Description: '), tip));
}
return tipContent;
};
_proto.clickHandler = function clickHandler(event) {
var _this$props = this.props,
editor = _this$props.editor,
name = _this$props.name,
title = _this$props.title,
meta = _this$props.meta;
editor === null || editor === void 0 ? void 0 : editor.eventBus.emit('setting.setter.field.click', {
name: name,
title: title,
meta: meta,
event: event
});
};
_proto.render = function render() {
var _this3 = this;
var hasError = this.state.hasError;
if (hasError) {
return null;
}
var _this$props2 = this.props,
className = _this$props2.className,
children = _this$props2.children,
meta = _this$props2.meta,
title = _this$props2.title,
valueState = _this$props2.valueState,
propName = _this$props2.name,
tip = _this$props2.tip;
var _this$state = this.state,
display = _this$state.display,
collapsed = _this$state.collapsed;
var isAccordion = display === 'accordion';
var hostName = '';
if (typeof meta === 'object') {
hostName = ((meta === null || meta === void 0 ? void 0 : meta["package"]) || '') + "-" + (meta.componentName || '');
} else if (typeof meta === 'string') {
hostName = meta;
}
var id = hostName + "-" + (propName || title['en-US'] || title['zh-CN']);
var tipContent = this.getTipContent(propName, tip);
return /*#__PURE__*/React.createElement("div", {
className: (0, _classnames["default"])("lc-field lc-" + display + "-field", className, {
'lc-field-is-collapsed': isAccordion && collapsed
}),
id: id
}, display !== 'plain' && /*#__PURE__*/React.createElement("div", {
className: "lc-field-head",
onClick: isAccordion ? this.toggleExpand : undefined
}, /*#__PURE__*/React.createElement("div", {
className: "lc-field-title"
}, createValueState(valueState, this.handleClear), /*#__PURE__*/React.createElement(_lowcodeEditorCore.Title, {
title: title || '',
onClick: this.clickHandler
}), /*#__PURE__*/React.createElement(_inlinetip["default"], {
position: "top"
}, tipContent)), isAccordion && /*#__PURE__*/React.createElement(_icon["default"], {
className: "lc-field-icon",
type: "arrow-up",
size: "xs"
})), /*#__PURE__*/React.createElement("div", {
key: "body",
ref: function ref(shell) {
_this3.body = shell;
},
className: "lc-field-body"
}, children));
};
return Field;
}(_react.Component);
/**
* **交互专利点**
*
* -1 多种值
* 0 | null 无值
* 1 类似值,比如数组长度一样
* 2 单一植
* 10 必填
*
* TODO: turn number to enum
*/
function createValueState(/* valueState?: number, onClear?: (e: React.MouseEvent) => void */
) {
return null;
}
var PopupField = exports.PopupField = /*#__PURE__*/function (_Component2) {
function PopupField() {
var _this4;
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this4 = _Component2.call.apply(_Component2, [this].concat(args)) || this;
_this4.pipe = void 0;
return _this4;
}
(0, _inheritsLoose2["default"])(PopupField, _Component2);
var _proto2 = PopupField.prototype;
_proto2.render = function render() {
var _this5 = this;
var _this$props3 = this.props,
className = _this$props3.className,
children = _this$props3.children,
title = _this$props3.title,
width = _this$props3.width;
if (!this.pipe) {
this.pipe = this.context.create({
width: width
});
}
var titleElement = title && /*#__PURE__*/React.createElement("div", {
className: "lc-field-title"
}, /*#__PURE__*/React.createElement(_lowcodeEditorCore.Title, {
title: title
}));
this.pipe.send(/*#__PURE__*/React.createElement("div", {
className: "lc-field-body"
}, children), titleElement);
return /*#__PURE__*/React.createElement("div", {
className: (0, _classnames["default"])('lc-field lc-popup-field', className)
}, title && /*#__PURE__*/React.createElement("div", {
className: "lc-field-head",
onClick: function onClick(e) {
_this5.pipe.show(e.target);
}
}, /*#__PURE__*/React.createElement("div", {
className: "lc-field-title"
}, /*#__PURE__*/React.createElement(_lowcodeEditorCore.Title, {
title: title
})), /*#__PURE__*/React.createElement(_icon["default"], {
className: "lc-field-icon",
type: "arrow-left",
size: "xs"
})));
};
return PopupField;
}(_react.Component);
PopupField.contextType = _popup.PopupContext;
PopupField.defaultProps = {
width: 300
};
var EntryField = exports.EntryField = /*#__PURE__*/function (_Component3) {
function EntryField() {
return _Component3.apply(this, arguments) || this;
}
(0, _inheritsLoose2["default"])(EntryField, _Component3);
var _proto3 = EntryField.prototype;
_proto3.render = function render() {
var _this$props4 = this.props,
title = _this$props4.title,
className = _this$props4.className,
stageName = _this$props4.stageName;
var classNameList = (0, _classnames["default"])('lc-field', 'lc-entry-field', className);
return /*#__PURE__*/React.createElement("div", {
className: classNameList
}, /*#__PURE__*/React.createElement("div", {
className: "lc-field-head",
"data-stage-target": stageName
}, /*#__PURE__*/React.createElement("div", {
className: "lc-field-title"
}, /*#__PURE__*/React.createElement(_lowcodeEditorCore.Title, {
title: title || ''
})), /*#__PURE__*/React.createElement(_icon["default"], {
className: "lc-field-icon",
type: "arrow-right",
size: "xs"
})));
};
return EntryField;
}(_react.Component);
var PlainField = exports.PlainField = /*#__PURE__*/function (_Component4) {
function PlainField() {
return _Component4.apply(this, arguments) || this;
}
(0, _inheritsLoose2["default"])(PlainField, _Component4);
var _proto4 = PlainField.prototype;
_proto4.render = function render() {
var _this$props5 = this.props,
className = _this$props5.className,
children = _this$props5.children;
return /*#__PURE__*/React.createElement("div", {
className: (0, _classnames["default"])('lc-field lc-plain-field', className)
}, /*#__PURE__*/React.createElement("div", {
className: "lc-field-body"
}, children));
};
return PlainField;
}(_react.Component);