react-json-schema-editor-antd
Version:
Json Schema Editor
180 lines (179 loc) • 9.75 kB
JavaScript
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); }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread 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 _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
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; }
import { useDroppable } from '@dnd-kit/core';
import { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';
import { has, isArray, isBoolean, isPlainObject, isString, isUndefined } from 'lodash';
import React, { useMemo, useRef } from 'react';
import SchemaItem from "../..";
import DataModel from "../DataModel";
var DataObject = function DataObject(props) {
var schema = props.schema,
_props$nodeDepth = props.nodeDepth,
nodeDepth = _props$nodeDepth === void 0 ? 0 : _props$nodeDepth,
_props$modalDepth = props.modalDepth,
modalDepth = _props$modalDepth === void 0 ? 0 : _props$modalDepth,
_props$namePath = props.namePath,
namePath = _props$namePath === void 0 ? [] : _props$namePath,
refSchema = props.refSchema,
components = props.components,
refIds = props.refIds,
isDataModelItems = props.isDataModelItems,
_props$nodeDepthPathO = props.nodeDepthPathObj,
nodeDepthPathObj = _props$nodeDepthPathO === void 0 ? {} : _props$nodeDepthPathO,
isUnLinkDataModelItems = props.isUnLinkDataModelItems;
var _useDroppable = useDroppable({
id: String(namePath),
data: {
accepts: nodeDepth
}
}),
setNodeRef = _useDroppable.setNodeRef,
isOver = _useDroppable.isOver;
var getRefData = function getRefData(data) {
var refPath = data === null || data === void 0 ? void 0 : data['$ref'];
var schemas = components === null || components === void 0 ? void 0 : components.schemas;
if (isString(refPath)) {
var refId = refPath.split('/').pop() || '';
if (isPlainObject(schemas === null || schemas === void 0 ? void 0 : schemas[refId])) {
return schemas === null || schemas === void 0 ? void 0 : schemas[refId];
}
}
return null;
};
var nodeNamePathCache = useRef(new Map());
function getNodeNamePath(namePath) {
for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
rest[_key - 1] = arguments[_key];
}
var key = JSON.stringify([].concat(_toConsumableArray(namePath), rest));
if (!nodeNamePathCache.current.has(key)) {
nodeNamePathCache.current.set(key, [].concat(_toConsumableArray(namePath), rest));
}
return nodeNamePathCache.current.get(key);
}
var nodeOrders = useMemo(function () {
var echoapiOrders = schema === null || schema === void 0 ? void 0 : schema['x-schema-orders'];
var propertyKeys = Object.keys((schema === null || schema === void 0 ? void 0 : schema.properties) || {});
var orderKeys = [];
if (isArray(echoapiOrders)) {
var newKeys = propertyKeys.filter(function (item) {
return !echoapiOrders.includes(item);
});
orderKeys = echoapiOrders.concat(newKeys);
} else {
orderKeys = propertyKeys;
}
return orderKeys.map(function (item, index) {
var _schema$properties, _schema$xSchemaRefs;
var key = namePath.length > 0 ? "".concat(namePath, "-").concat(index) : "root-".concat(index);
var name = item;
var type = 'property';
var nodeSchema = schema === null || schema === void 0 || (_schema$properties = schema.properties) === null || _schema$properties === void 0 ? void 0 : _schema$properties[name];
var overrides = (refSchema === null || refSchema === void 0 ? void 0 : refSchema['x-schema-overrides']) || {};
var isHidden = Boolean((overrides === null || overrides === void 0 ? void 0 : overrides[name]) === null);
var nodeIsUnLinkDataModelItems = isBoolean(isUnLinkDataModelItems) ? isUnLinkDataModelItems : false;
var refData = null;
if (has(overrides, name)) {
type = 'override';
if (!isHidden) {
nodeSchema = overrides === null || overrides === void 0 ? void 0 : overrides[name];
}
nodeIsUnLinkDataModelItems = true;
} else if (schema !== null && schema !== void 0 && (_schema$xSchemaRefs = schema['x-schema-refs']) !== null && _schema$xSchemaRefs !== void 0 && _schema$xSchemaRefs[name]) {
var _schema$xSchemaRefs2;
type = 'ref';
nodeSchema = schema === null || schema === void 0 || (_schema$xSchemaRefs2 = schema['x-schema-refs']) === null || _schema$xSchemaRefs2 === void 0 ? void 0 : _schema$xSchemaRefs2[name];
refData = getRefData(nodeSchema);
// 需要解析更多的信息 是否为对象 属性是否重复
}
// 计算 namePath
var nodeNamePath = [];
if (type === 'override') {
nodeNamePath = getNodeNamePath(namePath, modalDepth === 0 ? 'x-schema-overrides' : 'properties', name);
} else if (type === 'property') {
nodeNamePath = getNodeNamePath(namePath, modalDepth === 0 && isDataModelItems ? 'x-schema-overrides' : 'properties', name);
} else if (type === 'ref') {
nodeNamePath = getNodeNamePath(namePath, 'x-schema-refs', name);
}
// // 计算 nodeDepthPathObj
if (!has(nodeDepthPathObj, name)) {
nodeDepthPathObj[name] = key;
}
return {
key: key,
name: name,
type: type,
nodeSchema: nodeSchema,
isHidden: isHidden,
isUnLinkDataModelItems: nodeIsUnLinkDataModelItems,
refData: refData,
nodeNamePath: nodeNamePath,
isRepeat: has(nodeDepthPathObj, name) && nodeDepthPathObj[name] !== key
};
});
}, [schema, refSchema, namePath, modalDepth, isDataModelItems, nodeDepthPathObj]);
return /*#__PURE__*/React.createElement("div", {
ref: setNodeRef,
className: "sortable-table-container",
style: {
background: isOver ? 'transparent' : 'var(--color-bg-right)',
transition: 'none' // 禁用 CSS 过渡
}
}, /*#__PURE__*/React.createElement(SortableContext, {
items: nodeOrders.map(function (i) {
return i === null || i === void 0 ? void 0 : i.key;
}),
strategy: verticalListSortingStrategy
}, nodeOrders.map(function (node) {
if (isUndefined(node === null || node === void 0 ? void 0 : node.nodeSchema)) {
return /*#__PURE__*/React.createElement(React.Fragment, null);
}
if (node.type === 'override' || node.type === 'property') {
var _refSchema$required, _schema$required, _node$nodeSchema;
return /*#__PURE__*/React.createElement(SchemaItem, _extends({
key: node.key
}, props, {
uniqueKey: node.key,
isRequire: node.type === 'override' ? refSchema === null || refSchema === void 0 || (_refSchema$required = refSchema.required) === null || _refSchema$required === void 0 ? void 0 : _refSchema$required.includes(node.name) : (_schema$required = schema.required) === null || _schema$required === void 0 ? void 0 : _schema$required.includes(node.name),
allowNull: node === null || node === void 0 || (_node$nodeSchema = node.nodeSchema) === null || _node$nodeSchema === void 0 || (_node$nodeSchema = _node$nodeSchema.type) === null || _node$nodeSchema === void 0 ? void 0 : _node$nodeSchema.includes('null'),
isArrayItems: false,
isRepeat: node.isRepeat,
isCombinedItems: false,
nodeDepth: nodeDepth,
isUnLinkDataModelItems: node.isUnLinkDataModelItems,
displayRefPropertyActions: isArray(refIds) && refIds.length === 1,
isHidden: node.isHidden,
namePath: node.nodeNamePath,
propertyName: node.name,
schema: node.nodeSchema
}));
}
if (node.type === 'ref') {
var _node$refData;
return /*#__PURE__*/React.createElement(DataModel, _extends({
key: node.key
}, props, {
uniqueKey: node.key,
nodeDepth: nodeDepth,
refName: String(node.name),
schema: node.nodeSchema,
namePath: node.nodeNamePath,
nodeDepthPathObj: nodeDepthPathObj,
refData: node.refData,
refIds: (refIds || []).concat((_node$refData = node.refData) === null || _node$refData === void 0 ? void 0 : _node$refData.model_id)
}));
}
return /*#__PURE__*/React.createElement(React.Fragment, null);
})), /*#__PURE__*/React.createElement("div", {
className: "dash-line",
style: {
left: "".concat(34 + (nodeDepth - 1) * 16, "px")
}
}));
};
export default DataObject;