UNPKG

jjb-lc-designable

Version:

基于alibaba-designable源码二次封装的表单设计器。

94 lines 3.12 kB
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } /* * 支持文本、数字、布尔、表达式 * Todo: JSON、富文本,公式 */ import React from 'react'; import { createPolyInput } from '../PolyInput'; import { Input, Button, Popover, InputNumber, Select } from 'antd'; import { MonacoInput } from '../MonacoInput'; import { TextWidget } from 'jjb-lc-designable/react'; const STARTTAG_REX = /<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/; const EXPRESSION_REX = /^\{\{([\s\S]*)\}\}$/; const isNumber = value => typeof value === 'number'; const isBoolean = value => typeof value === 'boolean'; const isExpression = value => { return typeof value === 'string' && EXPRESSION_REX.test(value); }; const isRichText = value => { return typeof value === 'string' && STARTTAG_REX.test(value); }; const isNormalText = value => { return typeof value === 'string' && !isExpression(value) && !isRichText(value); }; const takeNumber = value => { const num = String(value).replace(/[^\d\.]+/, ''); if (num === '') return; return Number(num); }; export const ValueInput = createPolyInput([{ type: 'TEXT', icon: 'Text', component: Input, checker: isNormalText }, { type: 'EXPRESSION', icon: 'Expression', component: props => { return /*#__PURE__*/React.createElement(Popover, { content: /*#__PURE__*/React.createElement("div", { style: { width: 400, height: 200, marginLeft: -16, marginRight: -16, marginBottom: -12 } }, /*#__PURE__*/React.createElement(MonacoInput, _extends({}, props, { language: "javascript.expression" }))), trigger: "click" }, /*#__PURE__*/React.createElement(Button, { block: true }, /*#__PURE__*/React.createElement(TextWidget, { token: "SettingComponents.ValueInput.expression" }))); }, checker: isExpression, toInputValue: value => { if (!value || value === '{{}}') return; const matched = String(value).match(EXPRESSION_REX); return matched?.[1] || value || ''; }, toChangeValue: value => { if (!value || value === '{{}}') return; const matched = String(value).match(EXPRESSION_REX); return `{{${matched?.[1] || value || ''}}}`; } }, { type: 'BOOLEAN', icon: 'Boolean', component: props => /*#__PURE__*/React.createElement(Select, _extends({}, props, { options: [{ label: 'True', value: true }, { label: 'False', value: false }] })), checker: isBoolean, toInputValue: value => { return !!value; }, toChangeValue: value => { return !!value; } }, { type: 'NUMBER', icon: 'Number', component: InputNumber, checker: isNumber, toInputValue: takeNumber, toChangeValue: takeNumber }]);