@prisma-cms/front-editor
Version:
219 lines • 11.7 kB
JavaScript
;
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