From ca1e49a969d7acc9f6296a6fc5196adc5205be2f Mon Sep 17 00:00:00 2001 From: kangwei Date: Wed, 6 May 2020 21:27:56 +0800 Subject: [PATCH] fix panel title --- .../editor-skeleton/src/widget/panel-dock.ts | 10 +++++----- packages/editor-skeleton/src/widget/panel.ts | 3 +++ packages/editor-skeleton/src/widget/utils.ts | 18 ++++++++++++++++-- packages/types/src/title.ts | 14 +++++++++++--- packages/utils/src/is-plain-object.ts | 2 +- 5 files changed, 36 insertions(+), 11 deletions(-) diff --git a/packages/editor-skeleton/src/widget/panel-dock.ts b/packages/editor-skeleton/src/widget/panel-dock.ts index e83bbddde..d446eeba6 100644 --- a/packages/editor-skeleton/src/widget/panel-dock.ts +++ b/packages/editor-skeleton/src/widget/panel-dock.ts @@ -59,14 +59,14 @@ export default class PanelDock implements IWidget { this.id = uniqueId(`dock:${name}$`); this.panelName = config.panelName || name; if (content) { + const _panelProps: any = { ...panelProps }; + if (_panelProps.title == null && props) { + _panelProps.title = composeTitle(props.title, undefined, props.description, true, true); + } this._panel = this.skeleton.add({ type: "Panel", name: this.panelName, - props: { - // FIXME! give default title for panel - title: props ? composeTitle(props?.title, props?.icon, props?.description, true) : '', - ...panelProps, - }, + props: _panelProps, contentProps, content, area: panelProps?.area diff --git a/packages/editor-skeleton/src/widget/panel.ts b/packages/editor-skeleton/src/widget/panel.ts index f03e6a130..c93c83989 100644 --- a/packages/editor-skeleton/src/widget/panel.ts +++ b/packages/editor-skeleton/src/widget/panel.ts @@ -60,6 +60,9 @@ export default class Panel implements IWidget { this.plain = hideTitleBar || !title; this.help = help; if (Array.isArray(content)) { + if (content.length === 1) { + // todo: not show tabs + } this.container = this.skeleton.createContainer( name, (item) => { diff --git a/packages/editor-skeleton/src/widget/utils.ts b/packages/editor-skeleton/src/widget/utils.ts index b635fbbe0..342bdfa9b 100644 --- a/packages/editor-skeleton/src/widget/utils.ts +++ b/packages/editor-skeleton/src/widget/utils.ts @@ -1,7 +1,7 @@ -import { IconType, TitleContent, isI18nData, TipContent } from '@ali/lowcode-types'; +import { IconType, TitleContent, isI18nData, TipContent, isTitleConfig } from '@ali/lowcode-types'; import { isValidElement } from 'react'; -export function composeTitle(title?: TitleContent, icon?: IconType, tip?: TipContent, tipAsTitle?: boolean) { +export function composeTitle(title?: TitleContent, icon?: IconType, tip?: TipContent, tipAsTitle?: boolean, noIcon?: boolean) { if (!title) { title = {}; if (!icon || tipAsTitle) { @@ -11,6 +11,17 @@ export function composeTitle(title?: TitleContent, icon?: IconType, tip?: TipCon } if (icon || tip) { if (typeof title !== 'object' || isValidElement(title) || isI18nData(title)) { + if (isValidElement(title)) { + if (title.type === 'svg' || (title.type as any).getIcon) { + if (!icon) { + icon = title as any; + } + if (tipAsTitle) { + title = tip as any; + tip = null; + } + } + } title = { label: title, icon, @@ -24,5 +35,8 @@ export function composeTitle(title?: TitleContent, icon?: IconType, tip?: TipCon }; } } + if (isTitleConfig(title) && noIcon) { + title.icon = undefined; + } return title; } diff --git a/packages/types/src/title.ts b/packages/types/src/title.ts index 658ddf73a..7a260ebeb 100644 --- a/packages/types/src/title.ts +++ b/packages/types/src/title.ts @@ -1,5 +1,5 @@ import { ReactElement, ReactNode } from 'react'; -import { I18nData } from './i18n'; +import { I18nData, isI18nData } from './i18n'; import { TipContent } from './tip'; import { IconType } from './icon'; @@ -13,6 +13,14 @@ export interface TitleConfig { export type TitleContent = string | I18nData | ReactElement | TitleConfig; -export function isTitleConfig(obj: any): obj is TitleConfig { - return obj && (obj.label || obj.tip || obj.icon); +function isPlainObject(value: any): value is object { + if (typeof value !== 'object') { + return false; + } + const proto = Object.getPrototypeOf(value); + return proto === Object.prototype || proto === null || Object.getPrototypeOf(proto) === null; +} + +export function isTitleConfig(obj: any): obj is TitleConfig { + return isPlainObject(obj) && !isI18nData(obj); } diff --git a/packages/utils/src/is-plain-object.ts b/packages/utils/src/is-plain-object.ts index 899ec5c64..59260d6cb 100644 --- a/packages/utils/src/is-plain-object.ts +++ b/packages/utils/src/is-plain-object.ts @@ -1,6 +1,6 @@ import { isObject } from './is-object'; -export function isPlainObject(value: any) { +export function isPlainObject(value: any): value is object { if (!isObject(value)) { return false; }