eapp-amis-theme-editor
Version:
amis主题编辑器
220 lines (214 loc) • 13.1 kB
JavaScript
/**
* amis-theme-editor v2.0.11-beta.2
* Copyright 2018-2023 @fex
*/
'use strict';
var tslib = require('tslib');
var amisCore = require('amis-core');
var amisUi = require('amis-ui');
var React = require('react');
var cx = require('classnames');
var lodash = require('lodash');
var ThemeSelect = require('./ThemeSelect.js');
var amisThemeEditorHelper = require('amis-theme-editor-helper');
var util = require('../util.js');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
/**
* 主题内外边距
*/
function PaddingAndMarginDialog(props) {
var onChange = props.onChange, value = props.value, data = props.data, custom = props.custom, label = props.label, options = props.options, hideMargin = props.hideMargin, hidePadding = props.hidePadding, state = props.state, editorThemePath = props.editorThemePath;
var _a = React.useState('all'), type = _a[0], setType = _a[1];
var _b = React.useState(null), customRef = _b[0], setCustomRef = _b[1];
var _c = React.useState(false), customShow = _c[0], setCustomShow = _c[1];
var _d = React.useState(0), customIndex = _d[0], setCustomIndex = _d[1];
var _e = React.useState('marginTop'), customKey = _e[0], setCustomKey = _e[1];
var _f = React.useState(false), isPaddingInherit = _f[0], setIsPaddingInherit = _f[1];
var _g = React.useState(false), isMarginInherit = _g[0], setIsMarginInherit = _g[1];
var LABELS = [
{ value: 'marginTop' },
{ value: 'marginRight' },
{ value: 'marginBottom' },
{ value: 'marginLeft' },
{ value: 'paddingTop' },
{ value: 'paddingRight' },
{ value: 'paddingBottom' },
{ value: 'paddingLeft' }
].filter(function (n) {
if (hideMargin) {
return !!~n.value.indexOf('padding');
}
else if (hidePadding) {
return !!~n.value.indexOf('margin');
}
else {
return n;
}
});
var editorDefaultValue = formatData(util.getValueByPath(editorThemePath, data));
var spaceData = formatData(value || {});
var optionsData = options || data.sizesOptions || [];
function formatData(sourceData) {
if (!sourceData) {
return null;
}
var data = lodash.cloneDeep(sourceData);
if ((data === null || data === void 0 ? void 0 : data.marginTop) === (data === null || data === void 0 ? void 0 : data.marginRight) &&
(data === null || data === void 0 ? void 0 : data.marginRight) === (data === null || data === void 0 ? void 0 : data.marginBottom) &&
(data === null || data === void 0 ? void 0 : data.marginBottom) === (data === null || data === void 0 ? void 0 : data.marginLeft)) {
data.margin = data === null || data === void 0 ? void 0 : data.marginTop;
}
else {
data.margin = 'custom';
}
if ((data === null || data === void 0 ? void 0 : data.paddingTop) === (data === null || data === void 0 ? void 0 : data.paddingRight) &&
(data === null || data === void 0 ? void 0 : data.paddingRight) === (data === null || data === void 0 ? void 0 : data.paddingBottom) &&
(data === null || data === void 0 ? void 0 : data.paddingBottom) === (data === null || data === void 0 ? void 0 : data.paddingLeft)) {
data.padding = data === null || data === void 0 ? void 0 : data.paddingTop;
}
else {
data.padding = 'custom';
}
return data;
}
function onSpaceChange(position) {
return function (value) {
var res = lodash.cloneDeep(spaceData);
delete res.margin;
delete res.padding;
if (value === 'custom') {
return;
}
if (position === 'margin-all') {
if (value.includes('all')) {
var defaultToken = function (key) {
return "var(".concat(data.default.token).concat(key, ")");
};
res.marginTop = defaultToken('marginTop');
res.marginRight = defaultToken('marginRight');
res.marginBottom = defaultToken('marginBottom');
res.marginLeft = defaultToken('marginLeft');
}
else {
res.marginTop = value;
res.marginRight = value;
res.marginBottom = value;
res.marginLeft = value;
}
}
else if (position === 'padding-all') {
if (value.includes('all')) {
var defaultToken = function (key) {
return "var(".concat(data.default.token).concat(key, ")");
};
res.paddingTop = defaultToken('paddingTop');
res.paddingRight = defaultToken('paddingRight');
res.paddingBottom = defaultToken('paddingBottom');
res.paddingLeft = defaultToken('paddingLeft');
}
else {
res.paddingTop = value;
res.paddingRight = value;
res.paddingBottom = value;
res.paddingLeft = value;
}
}
else if (typeof position === 'number') {
var label_1 = LABELS[position].value;
res[label_1] = value;
if (label_1.includes('padding')) {
setIsPaddingInherit(false);
}
else {
setIsMarginInherit(false);
}
}
onChange(res);
};
}
function findRealValue(value) {
return amisThemeEditorHelper.getCssVarByName(value) || value;
}
function handleCustomClick(e, index, key) {
setCustomShow(true);
setCustomRef(e.currentTarget);
setCustomIndex(index);
setCustomKey(key);
}
React.useEffect(function () {
var _a, _b, _c, _d, _e, _f, _g, _h;
if (state && state !== 'default' && value) {
if (((_a = value['paddingTop']) === null || _a === void 0 ? void 0 : _a.includes('default-paddingTop')) &&
((_b = value['paddingBottom']) === null || _b === void 0 ? void 0 : _b.includes('default-paddingBottom')) &&
((_c = value['paddingRight']) === null || _c === void 0 ? void 0 : _c.includes('default-paddingRight')) &&
((_d = value['paddingLeft']) === null || _d === void 0 ? void 0 : _d.includes('default-paddingLeft'))) {
setIsPaddingInherit(true);
}
if (((_e = value['marginTop']) === null || _e === void 0 ? void 0 : _e.includes('default-marginTop')) &&
((_f = value['marginBottom']) === null || _f === void 0 ? void 0 : _f.includes('default-marginBottom')) &&
((_g = value['marginRight']) === null || _g === void 0 ? void 0 : _g.includes('default-marginRight')) &&
((_h = value['marginLeft']) === null || _h === void 0 ? void 0 : _h.includes('default-marginLeft'))) {
setIsMarginInherit(true);
}
}
}, [value]);
return (React__default["default"].createElement("div", { className: "Theme-PaddingAndMargin" },
label ? (React__default["default"].createElement("div", { className: "Theme-PaddingAndMargin-title" }, label)) : null,
React__default["default"].createElement("div", { className: "Theme-PaddingAndMargin-inner" },
React__default["default"].createElement("div", { className: cx__default["default"]('Theme-PaddingAndMargin-label', custom && 'Theme-PaddingAndMargin-label--custom') },
React__default["default"].createElement("div", { className: cx__default["default"]('Theme-PaddingAndMargin-label-all', type === 'all' && 'Theme-PaddingAndMargin-label-all--active'), onClick: function () { return setType('all'); } }),
custom ? (React__default["default"].createElement("div", { className: cx__default["default"]('Theme-PaddingAndMargin-label-custom', type !== 'all' && 'Theme-PaddingAndMargin-label-custom--active'), onClick: function () { return setType('custom'); } },
React__default["default"].createElement("div", null),
React__default["default"].createElement("div", null))) : null),
type === 'all' ? (React__default["default"].createElement(React__default["default"].Fragment, null,
!hideMargin && (React__default["default"].createElement("div", { className: "Theme-PaddingAndMargin-input" },
React__default["default"].createElement(ThemeSelect["default"], tslib.__assign({}, props, { options: optionsData, value: isMarginInherit
? "var(".concat(data.default.token, "margin-all)")
: spaceData.margin, onChange: onSpaceChange('margin-all'), itemName: "margin-all", state: state, inheritValue: editorThemePath ? 'inherit' : '', placeholder: editorDefaultValue === null || editorDefaultValue === void 0 ? void 0 : editorDefaultValue.margin })),
React__default["default"].createElement("div", { className: "Theme-PaddingAndMargin-input-label" }, "Margin"))),
!hidePadding && (React__default["default"].createElement("div", { className: "Theme-PaddingAndMargin-input" },
React__default["default"].createElement(ThemeSelect["default"], tslib.__assign({}, props, { options: optionsData, value: isPaddingInherit
? "var(".concat(data.default.token, "padding-all)")
: spaceData.padding, onChange: onSpaceChange('padding-all'), itemName: "padding-all", state: state, inheritValue: editorThemePath ? 'inherit' : '', placeholder: editorDefaultValue === null || editorDefaultValue === void 0 ? void 0 : editorDefaultValue.padding })),
React__default["default"].createElement("div", { className: "Theme-PaddingAndMargin-input-label" }, "Padding"))))) : null),
type !== 'all' ? (React__default["default"].createElement("div", { className: cx__default["default"]('Theme-PaddingAndMargin-custom', !hidePadding && 'Theme-PaddingAndMargin-custom--padding', !hideMargin && 'Theme-PaddingAndMargin-custom--margin') },
LABELS.map(function (item, index) {
return (React__default["default"].createElement("div", { key: item.value, className: cx__default["default"]('Theme-PaddingAndMargin-custom-' + item.value), onClick: function (e) { return handleCustomClick(e, index, item.value); } },
React__default["default"].createElement("div", null, findRealValue(spaceData[item.value] || (editorDefaultValue === null || editorDefaultValue === void 0 ? void 0 : editorDefaultValue[item.value])) || '-')));
}),
React__default["default"].createElement(amisUi.Overlay
// @ts-ignore
, {
// @ts-ignore
container: document.body,
// @ts-ignore
target: customRef, show: customShow, rootClose: false },
React__default["default"].createElement(amisUi.PopOver, { overlay: true, onHide: function () { return setCustomShow(false); } },
React__default["default"].createElement("div", { className: "Theme-PaddingAndMargin-custom-popover" },
React__default["default"].createElement(ThemeSelect["default"], tslib.__assign({}, props, { options: optionsData, value: spaceData[customKey], onChange: onSpaceChange(customIndex), itemName: customKey, state: state, inheritValue: editorThemePath ? 'inherit' : '', placeholder: editorDefaultValue === null || editorDefaultValue === void 0 ? void 0 : editorDefaultValue[customKey] }))))))) : null));
}
/** @class */ ((function (_super) {
tslib.__extends(PaddingAndMarginDialogRender, _super);
function PaddingAndMarginDialogRender() {
return _super !== null && _super.apply(this, arguments) || this;
}
Object.defineProperty(PaddingAndMarginDialogRender.prototype, "render", {
enumerable: false,
configurable: true,
writable: true,
value: function () {
var _a;
return (React__default["default"].createElement(PaddingAndMarginDialog, tslib.__assign({}, this.props, { custom: (_a = this.props.custom) !== null && _a !== void 0 ? _a : true })));
}
});
PaddingAndMarginDialogRender = tslib.__decorate([
amisCore.FormItem({
type: 'amis-theme-padding-and-margin',
strictMode: false,
renderLabel: false
})
], PaddingAndMarginDialogRender);
return PaddingAndMarginDialogRender;
})(React__default["default"].Component));