UNPKG

@prisma-cms/front-editor

Version:
219 lines 11.7 kB
"use strict"; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const react_1 = __importDefault(require("react")); // import PropTypes from 'prop-types'; const EditorComponent_1 = __importDefault(require("../../../../../EditorComponent")); const ListView_1 = require("../../ListView"); const ShortText_1 = __importDefault(require("material-ui-icons/ShortText")); const __1 = require("../.."); const react_number_format_1 = __importDefault(require("react-number-format")); const moment_1 = __importDefault(require("moment")); const Typography_1 = __importDefault(require("material-ui/Typography")); const DefaultValue_1 = __importDefault(require("./DefaultValue")); const Grid_1 = __importDefault(require("../../../../../common/Grid")); class NamedField extends EditorComponent_1.default { renderPanelView(content) { return super.renderPanelView(content || (react_1.default.createElement("div", { className: "editor-component--panel-icon" }, react_1.default.createElement(ShortText_1.default, null), " Object field"))); } getRootElement() { const { tag } = this.getComponentProps(this); return tag || 'span'; } renderBadgeTitle(title) { const { name } = this.getComponentProps(this); return (react_1.default.createElement(Grid_1.default, { container: true, spacing: 8, alignItems: "center", style: { flexWrap: 'nowrap', } }, react_1.default.createElement(Grid_1.default, { item: true }, super.renderBadgeTitle(title)), name ? (react_1.default.createElement(Grid_1.default, { item: true }, react_1.default.createElement("b", null, name))) : null)); } getComponentProps(component) { const _a = super.getComponentProps(component), { type } = _a, props = __rest(_a, ["type"]); let otherProps = {}; switch (type) { case 'number': { const { thousandSeparator = ' ', decimalSeparator = '.', decimalScale, prefix, suffix, defaultValue, isNumericString = false, displayType = 'text', mask, } = props; otherProps = { thousandSeparator, decimalSeparator, decimalScale: decimalScale ? parseInt(decimalScale) : undefined, prefix, suffix, defaultValue: defaultValue ? parseFloat(defaultValue) : undefined, isNumericString, displayType, mask, }; } break; default: } return Object.assign(Object.assign({ type }, props), otherProps); } renderChildren() { // const { // UserLink, // } = this.context; const _a = this.getComponentProps(this), { // props: { // name, // ...otherProps // }, name, type, override_context } = _a, other = __rest(_a, ["name", "type", "override_context"]); if (!name) { return null; } // const { // inEditMode, // } = this.getEditorContext(); /** * Дочерние элементы выводим только в том случае, если значение массив или объект, * иначе есть вероятность, что на нижних уровнях компоненты попадут в контект не того объекта */ return (react_1.default.createElement(ListView_1.ObjectContext.Consumer, { key: "object_context" }, (context) => { const { object } = context; if (!object) { return null; } let output = null; if (name) { let { [name]: value } = object; let children = super.renderChildren() || []; const childrenWithoutDefaultValue = children.filter((n) => n && n.type !== DefaultValue_1.default); /** Так как без опеределения типа данных мы можем уйти не в тот контекст, возвращаем ничего, если значение отсутствует или null */ { /* TODO: Check if broken */ } { /* if (value !== undefined || true) { */ } if (value !== undefined) { if (typeof value === 'object' && value !== null) { if (Array.isArray(value)) { /** Если это массив, то передаем как массив объектов. Если объект, то передаем как объект */ output = value.length ? children.filter((n) => n && n.type !== DefaultValue_1.default) : children.filter((n) => n && n.type === DefaultValue_1.default); if (override_context) { output = (react_1.default.createElement(__1.ConnectorContext.Provider, { value: { data: { objects: value, }, } }, output)); } } else { // children = children.filter(n => n && n.type !== DefaultValue); // output = value ? children.filter(n => n && n.type !== DefaultValue) : children.filter(n => n && n.type === DefaultValue); output = value ? childrenWithoutDefaultValue : children.filter((n) => n && n.type === DefaultValue_1.default); if (override_context) { output = (react_1.default.createElement(ListView_1.ObjectContext.Provider, { value: { object: value, } }, output)); } } } else if (!value) { /** Есть предположение, что надо перетирать контекст, даже если нет объекта. Но это сейчас больше неудобств добавить. Вероятнее всего надо добавлять сущность новую Child для предполагаемого дочернего объекта и Children для предполагаемого массива дочерних объектов */ children = children.filter((n) => n && n.type === DefaultValue_1.default); output = children; } else { /** Если есть скалярное значение Если есть дочерние элементы, то выводим их. */ if (childrenWithoutDefaultValue.length) { /** Даже если за вычетом дефолтных элементов не останется дочерних элементов, все равно выводим остаточный пустой массив, а не само значение, так как логика может быть заложена именно на проверку значения, чтобы ничего не выводить, если значение есть. */ output = childrenWithoutDefaultValue; } else { /** Иначе выводим просто скалярное значение */ value = this.prepareScalarValue(value, context); switch (type) { case 'number': { const { defaultValue } = other; output = (react_1.default.createElement(react_number_format_1.default, Object.assign({ value: value || defaultValue || '' }, other))); } break; case 'date': if (value) { const { format } = other; let date = moment_1.default(value); if (date.isValid()) { if (format) { date = date.format(format); } output = date.toString(); } else { output = (react_1.default.createElement(Typography_1.default, { color: "error" }, "Invalid date")); } } break; default: output = value; } } } } } return output; })); } prepareScalarValue(value) { return value; } } NamedField.Name = 'NamedField'; // static propTypes = { // // eslint-disable-next-line react/forbid-foreign-prop-types // ...EditorComponent.propTypes, // /** // * Если нет, то контекст родителя не будет перетерт. // * Это удобно для того, чтобы просто проверять на наличие значения. // */ // override_context: PropTypes.bool.isRequired, // } NamedField.defaultProps = Object.assign(Object.assign({}, EditorComponent_1.default.defaultProps), { name: '', tag: 'span', type: undefined, format: undefined, override_context: true, hide_wrapper_in_default_mode: true }); exports.default = NamedField; //# sourceMappingURL=index.js.map