UNPKG

@quiet-front-end/json-schema-editor-antd

Version:
247 lines (245 loc) 9.66 kB
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } import { message } from 'antd'; import _ from 'lodash'; import React, { forwardRef, useEffect, useImperativeHandle, useState } from 'react'; import SchemaItem from "./SchemaItem"; import { getDefaultSchema, getValueByPath, inferSchema } from "./utils"; var JsonSchemaEditor = /*#__PURE__*/forwardRef(function (props, ref) { var _message$useMessage = message.useMessage(), _message$useMessage2 = _slicedToArray(_message$useMessage, 2), messageApi = _message$useMessage2[0], contextHolder = _message$useMessage2[1]; function initSchema(data) { var defaultSchema = { type: 'object', properties: { field: { type: 'string' } } }; if (!data) { return defaultSchema; } switch (_typeof(data)) { case 'string': try { return inferSchema(JSON.parse(data)); } catch (e) { messageApi.warning('初始化数据不是 Json 字符串,无法生成 JsonSchema'); return defaultSchema; } case 'object': return data; } } // const [schema, setSchema] = useState<JSONSchema7>({ // type: 'object', properties: { // 'objectP': {type: 'object', properties: {'o1numberP': {type: 'number'}}}, // 'numberP': {type: 'number'}, // 'booleanP': {type: 'boolean'}, // 'arrayString': {type: 'array', items: {type: 'string'}}, // 'arrayObject': {type: 'array', items: {type: 'object', properties: {'arrayObjStr': {type: 'string'}}}}, // 'integerP': {type: 'integer'}, // 'stringP': {type: 'string'}, // } // }) var _useState = useState(initSchema(props.data)), _useState2 = _slicedToArray(_useState, 2), schema = _useState2[0], setSchema = _useState2[1]; var _useState3 = useState(0), _useState4 = _slicedToArray(_useState3, 2), fieldCount = _useState4[0], setFieldCount = _useState4[1]; useEffect(function () { if (props.onSchemaChange) { props.onSchemaChange(schema); } }, [schema]); var changeSchema = function changeSchema(namePath, value, propertyName) { // console.log("changeSchema", namePath, value, propertyName); if (namePath.length === 0) { setSchema(value); return; } var schemaClone = _.cloneDeep(schema); var current = schemaClone; for (var i = 0; i < namePath.length - 1; i++) { var key = Object.keys(current)[namePath[i]]; if (!current[key]) { current[key] = {}; } current = current[key]; } var lastKey = namePath[namePath.length - 1]; var lastKeyActual = Object.keys(current)[lastKey]; if (lastKey === -1) { if (typeof value === 'undefined' || !propertyName) { return; } current[propertyName] = value; } else { if (current[lastKeyActual] === value) { return; } current[lastKeyActual] = value; } setSchema(schemaClone); }; function renameProperty(path, newKey) { var schemaClone = _.cloneDeep(schema); var current = schemaClone; var parent = null; var lastKey = ''; for (var i = 0; i < path.length - 1; i++) { var _keys = Object.keys(current); var index = void 0; if (typeof path[i] === 'number') { index = path[i]; } else { index = _keys.indexOf(String(path[i])); } if (index < 0 || index >= _keys.length) { console.error("Path not found: ".concat(path.slice(0, i + 1).join('.'))); return; } parent = current; lastKey = _keys[index]; current = current[lastKey]; } var oldKeyIndex = path[path.length - 1]; var keys = Object.keys(current); var oldKey = keys[oldKeyIndex]; if (oldKey === newKey) { return; } if (current.hasOwnProperty(oldKey)) { parent[lastKey] = Object.fromEntries(Object.entries(current).map(function (_ref) { var _ref2 = _slicedToArray(_ref, 2), key = _ref2[0], value = _ref2[1]; if (key === oldKey) { var parentRequired = parent['required']; if (parentRequired) { var requiredIndex = parentRequired.indexOf(oldKey); if (requiredIndex >= 0) { parentRequired.splice(requiredIndex, 1, newKey); } } return [newKey, value]; } return [key, value]; })); } else { console.error("Key not found: ".concat(oldKey)); return; } setSchema(schemaClone); } function updateRequired(target, property, remove) { if (!target.required) { target.required = []; } var index = target.required.indexOf(property); if (remove) { if (index !== -1) { target.required.splice(index, 1); } } else { if (index === -1) { target.required.push(property); } } if (target.required.length === 0) { delete target.required; } } function updateRequiredProperty(namePath, removed) { if (namePath.length < 2) { console.error('路径长度不足,无法更新必选属性'); return; } var schemaClone = _.cloneDeep(schema); var parentPath = namePath.slice(0, -2); var propertyIndex = namePath[namePath.length - 1]; var parentObject = getValueByPath(schemaClone, parentPath); if (!parentObject || !parentObject.properties) { console.error('无法找到必选属性的父对象', parentObject); return; } var propertyKeys = Object.keys(parentObject.properties); if (propertyIndex < 0 || propertyIndex >= propertyKeys.length) { console.error('属性索引超出范围', propertyIndex); return; } var propertyName = propertyKeys[propertyIndex]; updateRequired(parentObject, propertyName, removed); setSchema(schemaClone); } function removeProperty(path) { var schemaClone = _.cloneDeep(schema); var current = schemaClone; var pre = schemaClone; for (var i = 0; i < path.length - 1; i++) { if (current !== undefined && current !== null) { pre = current; current = current[Object.keys(current)[path[i]]]; } else { console.error('移除的路径无效', path); return; // 如果路径无效,则直接返回 } } var finalKey = Object.keys(current)[path[path.length - 1]]; updateRequired(pre, finalKey, true); if (current && _typeof(current) === 'object' && current.hasOwnProperty(finalKey)) { delete current[finalKey]; } setSchema(schemaClone); } function addProperty(namePath, isChild) { // console.log(namePath, isChild, 'addProperty'); var schemaClone = _.cloneDeep(schema); var current = schemaClone; for (var i = 0; i < namePath.length - (isChild ? 0 : 1); i++) { var key = Object.keys(current)[namePath[i]]; if (!current[key]) { current[key] = {}; } current = current[key]; } var newSchema = getDefaultSchema('string'); if (isChild) { current['properties']["field_".concat(fieldCount)] = newSchema; } else { current["field_".concat(fieldCount)] = newSchema; } setFieldCount(fieldCount + 1); setSchema(schemaClone); } useImperativeHandle(ref, function () { return { changeSchema: changeSchema }; }); return /*#__PURE__*/React.createElement("div", { style: { paddingTop: '10px 10px 0 10px' } }, contextHolder, /*#__PURE__*/React.createElement(SchemaItem, { schema: schema, changeSchema: changeSchema, renameProperty: renameProperty, removeProperty: removeProperty, addProperty: addProperty, updateRequiredProperty: updateRequiredProperty, handleAdvancedSettingClick: props.handleAdvancedSettingClick })); }); export default JsonSchemaEditor;