Merge pull request #9393 from zhangtao07/master

容器、头像等功能优化
This commit is contained in:
张涛 2024-01-10 17:45:22 +08:00 committed by GitHub
commit efcf8e2c66
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 90 additions and 43 deletions

View File

@ -243,21 +243,22 @@ src、text 都支持变量,可以从上下文中动态获取图片或文字,
## 属性表 ## 属性表
| 属性名 | 类型 | 默认值 | 说明 | | 属性名 | 类型 | 默认值 | 说明 |
| ----------- | ------------------------------------------------------------------ | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | ------------- | ------------------------------------------------------------------ | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| className | `string` | | 外层 dom 的类名 | | className | `string` | | 外层 dom 的类名 |
| style | `object` | | 外层 dom 的样式 | | style | `object` | | 外层 dom 的样式 |
| fit | `'contain'` \| `'cover'` \| `'fill'` \| `'none'` \| `'scale-down'` | `'cover'` | 具体细节可以参考 MDN [文档](https://developer.mozilla.org/zh-CN/docs/Web/CSS/object-fit) | | fit | `'contain'` \| `'cover'` \| `'fill'` \| `'none'` \| `'scale-down'` | `'cover'` | 具体细节可以参考 MDN [文档](https://developer.mozilla.org/zh-CN/docs/Web/CSS/object-fit) |
| src | `string` | | 图片地址 | | src | `string` | | 图片地址 |
| text | `string` | | 文字 | | defaultAvatar | `string` | | 占位图 |
| icon | `string` | `'fa fa-user'` | 图标 | | text | `string` | | 文字 |
| shape | `'circle'` \| `'square'` \| `'rounded'` | `'circle'` | 形状,有三种 `'circle'` (圆形)、`'square'`(正方形)、`'rounded'`(圆角) | | icon | `string` | `'fa fa-user'` | 图标 |
| size | `number` \| `'default'` \| `'normal'` \| `'small'` | `'default'` | `'default' \| 'normal' \| 'small'`三种字符串类型代表不同大小(分别是 48、40、32也可以直接数字表示 | | shape | `'circle'` \| `'square'` \| `'rounded'` | `'circle'` | 形状,有三种 `'circle'` (圆形)、`'square'`(正方形)、`'rounded'`(圆角) |
| gap | `number` | 4 | 控制字符类型距离左右两侧边界单位像素 | | size | `number` \| `'default'` \| `'normal'` \| `'small'` | `'default'` | `'default' \| 'normal' \| 'small'`三种字符串类型代表不同大小(分别是 48、40、32也可以直接数字表示 |
| alt | `number` | | 图像无法显示时的替代文本 | | gap | `number` | 4 | 控制字符类型距离左右两侧边界单位像素 |
| draggable | `boolean` | | 图片是否允许拖动 | | alt | `number` | | 图像无法显示时的替代文本 |
| crossOrigin | `'anonymous'` \| `'use-credentials'` \| `''` | | 图片的 `CORS` 属性设置 | | draggable | `boolean` | | 图片是否允许拖动 |
| onError | `string` | | 图片加载失败的字符串,这个字符串是一个 New Function 内部执行的字符串,参数是 event使用 event.nativeEvent 获取原生 dom 事件),这个字符串需要返回 boolean 值。设置 `"return ture;"` 会在图片加载失败后,使用 `text` 或者 `icon` 代表的信息来进行替换。目前图片加载失败默认是不进行置换。注意:图片加载失败,不包括$获取数据为空情况 | | crossOrigin | `'anonymous'` \| `'use-credentials'` \| `''` | | 图片的 `CORS` 属性设置 |
| onError | `string` | | 图片加载失败的字符串,这个字符串是一个 New Function 内部执行的字符串,参数是 event使用 event.nativeEvent 获取原生 dom 事件),这个字符串需要返回 boolean 值。设置 `"return ture;"` 会在图片加载失败后,使用 `text` 或者 `icon` 代表的信息来进行替换。目前图片加载失败默认是不进行置换。注意:图片加载失败,不包括$获取数据为空情况 |
## 事件表 ## 事件表

View File

@ -81,6 +81,14 @@
background-color: #f7f7f9; background-color: #f7f7f9;
} }
fieldset {
margin-bottom: var(--Form-item-gap);
.cxd-Collapse-content {
background-color: transparent;
}
}
&.right::after { &.right::after {
right: 12px; right: 12px;
left: auto; left: auto;

View File

@ -210,7 +210,13 @@ export default class Editor extends Component<EditorProps> {
} }
componentDidMount() { componentDidMount() {
if (!this.props.isSubEditor) { const store = this.manager.store;
if (this.props.isSubEditor) {
// 等待子编辑器动画结束重新获取高亮组件位置
setTimeout(() => {
store.calculateHighlightBox(store.highlightNodes.map(node => node.id));
}, 500);
} else {
this.manager.trigger('init', { this.manager.trigger('init', {
data: this.manager data: this.manager
}); });

View File

@ -915,26 +915,28 @@ export class EditorManager {
const curElemSchema = schemaData || subRenderer?.scaffold; const curElemSchema = schemaData || subRenderer?.scaffold;
const isSpecialLayout = this.isSpecialLayout(curElemSchema); const isSpecialLayout = this.isSpecialLayout(curElemSchema);
if (
(node.type === 'wrapper' || node.type === 'container') && // 不直接替换容器
node.schema?.body?.length === 0 && // if (
curElemSchema?.type === 'flex' && // (node.type === 'wrapper' || node.type === 'container') &&
!node.schema?.isFreeContainer && // node.schema?.body?.length === 0 &&
!isSpecialLayout // curElemSchema?.type === 'flex' &&
) { // !node.schema?.isFreeContainer &&
// 布局能力提升: 点击插入新元素当wrapper为空插入布局容器时自动改为置换避免过多层级 // !isSpecialLayout
this.replaceChild( // ) {
curActiveId, // // 布局能力提升: 点击插入新元素当wrapper为空插入布局容器时自动改为置换避免过多层级
curElemSchema, // this.replaceChild(
subRenderer, // curActiveId,
store.insertRegion, // curElemSchema,
reGenerateId // subRenderer,
); // store.insertRegion,
setTimeout(() => { // reGenerateId
this.updateConfigPanel(); // );
}, 0); // setTimeout(() => {
return; // this.updateConfigPanel();
} // }, 0);
// return;
// }
const parentNode = node.parent as EditorNodeType; // 父级节点 const parentNode = node.parent as EditorNodeType; // 父级节点

View File

@ -518,6 +518,13 @@ export class BasicToolbarPlugin extends BasePlugin {
}); });
} }
} }
if (node.type === 'container') {
menus.push({
label: '清空容器',
disabled: !node.schema.body?.length,
onSelect: () => manager.emptyRegion(id, 'body')
});
}
menus.push({ menus.push({
label: '替换组件', label: '替换组件',

View File

@ -159,6 +159,7 @@ export class AvatarPlugin extends BasePlugin {
onChange: (value: any, origin: any, item: any, form: any) => { onChange: (value: any, origin: any, item: any, form: any) => {
form.setValues({ form.setValues({
src: undefined, src: undefined,
defaultAvatar: undefined,
fit: 'cover', fit: 'cover',
text: undefined, text: undefined,
gap: 4, gap: 4,
@ -182,7 +183,13 @@ export class AvatarPlugin extends BasePlugin {
type: 'input-url' type: 'input-url'
}, },
name: 'src', name: 'src',
label: '链接', label: '头像地址',
visibleOn: 'data.showtype === "image"'
}),
// 占位图片
getSchemaTpl('imageUrl', {
name: 'defaultAvatar',
label: '默认头像',
visibleOn: 'data.showtype === "image"' visibleOn: 'data.showtype === "image"'
}), }),
{ {

View File

@ -17,13 +17,13 @@ export const defaultFlexColumnSchema = (title?: string) => {
return { return {
type: 'container', type: 'container',
body: [], body: [],
size: 'xs', size: 'none',
style: { style: {
position: 'static', position: 'static',
display: 'block', display: 'block',
flex: '1 1 auto', flex: '1 1 auto',
flexGrow: 1, flexGrow: 1,
flexBasis: 'auto' flexBasis: 0
}, },
wrapperBody: false, wrapperBody: false,
isFixedHeight: false, isFixedHeight: false,
@ -40,7 +40,7 @@ const defaultFlexPreviewSchema = (title?: string) => {
style: { style: {
display: 'block', display: 'block',
flex: '1 1 auto', flex: '1 1 auto',
flexBasis: 'auto', flexBasis: 0,
textAlign: 'center', textAlign: 'center',
marginRight: 10 marginRight: 10
}, },
@ -53,14 +53,15 @@ const defaultFlexContainerSchema = (
flexItemSchema: (title?: string) => any = defaultFlexColumnSchema flexItemSchema: (title?: string) => any = defaultFlexColumnSchema
) => ({ ) => ({
type: 'flex', type: 'flex',
className: 'p-1',
items: [ items: [
flexItemSchema('第一列'), flexItemSchema('第一列'),
flexItemSchema('第二列'), flexItemSchema('第二列'),
flexItemSchema('第三列') flexItemSchema('第三列')
], ],
style: { style: {
position: 'relative' position: 'relative',
rowGap: '10px',
columnGap: '10px'
} }
}); });
@ -131,6 +132,15 @@ export class FlexPluginBase extends LayoutBasePlugin {
getSchemaTpl('layout:flex-wrap'), getSchemaTpl('layout:flex-wrap'),
getSchemaTpl('layout:flex-basis', {
label: '行间隔',
name: 'style.rowGap'
}),
getSchemaTpl('layout:flex-basis', {
label: '列间隔',
name: 'style.columnGap'
}),
...(isFlexItem ...(isFlexItem
? [ ? [
getSchemaTpl('layout:flex', { getSchemaTpl('layout:flex', {

View File

@ -34,6 +34,11 @@ export interface AvatarSchema extends BaseSchema {
*/ */
src?: string; src?: string;
/**
*
*/
defaultAvatar?: string;
/** /**
* *
*/ */
@ -113,6 +118,7 @@ export class AvatarField extends React.Component<AvatarProps> {
className, className,
classnames: cx, classnames: cx,
src, src,
defaultAvatar,
icon = 'fa fa-user', icon = 'fa fa-user',
fit, fit,
shape, shape,
@ -153,7 +159,7 @@ export class AvatarField extends React.Component<AvatarProps> {
style={style} style={style}
className={className} className={className}
classnames={cx} classnames={cx}
src={src} src={src || defaultAvatar}
icon={icon} icon={icon}
fit={fit} fit={fit}
shape={shape} shape={shape}