From af788e0f10276266a46983dcf60518e0994e6114 Mon Sep 17 00:00:00 2001 From: zhf <1204297681@qq.com> Date: Fri, 12 Sep 2025 20:50:11 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E5=99=A8=E5=8F=82=E6=95=B0=E6=8F=8F=E8=BF=B0=E3=80=81?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=99=A8=E5=8F=82=E6=95=B0=E9=80=82=E9=85=8D?= =?UTF-8?q?=E5=B0=8F=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/rawitem/rawitem.tsx | 3 ++- src/editor/raw/ibiz-raw/ibiz-raw.tsx | 4 ++-- src/editor/span/span/span.tsx | 23 +++++++++++++++++------ 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/common/rawitem/rawitem.tsx b/src/common/rawitem/rawitem.tsx index 469ac23b..170af5d9 100644 --- a/src/common/rawitem/rawitem.tsx +++ b/src/common/rawitem/rawitem.tsx @@ -118,6 +118,7 @@ export const IBizRawItem = defineComponent({ 'HEADING6', 'PARAGRAPH', 'HTML', + 'RAW', ].includes(rawItemType.value) ) { rawItemText.value = rawItemContent.value; @@ -216,7 +217,7 @@ export const IBizRawItem = defineComponent({ > ); } - if (this.rawItemType === 'TEXT') { + if (this.rawItemType === 'TEXT' || this.rawItemType === 'RAW') { return {this.rawItemText}; } if (this.rawItemType === 'HEADING1') { diff --git a/src/editor/raw/ibiz-raw/ibiz-raw.tsx b/src/editor/raw/ibiz-raw/ibiz-raw.tsx index 4d147488..5f983a50 100644 --- a/src/editor/raw/ibiz-raw/ibiz-raw.tsx +++ b/src/editor/raw/ibiz-raw/ibiz-raw.tsx @@ -11,8 +11,8 @@ import './ibiz-raw.scss'; * 直接内容 * @primary * @description 用于绘制配置的直接内容,如HTML内容、视频内容、图片内容等。支持编辑器类型包含:`直接内容` - * @editorparams {name:contenttype,parameterType:string,defaultvalue:TEXT,description:内容类型} - * @editorparams {name:template,parameterType:string,description:配置的handlerBars模版,用于将组件输入参数中的value值解析并转换为HTML内容,实现动态内容的渲染} + * @editorparams {name:contenttype,parameterType:'IMAGE' | 'TEXT' | 'RAW' | 'HEADING1' | 'HEADING2' | 'HEADING3' | 'HEADING4' | 'HEADING5' | 'HEADING6' | 'PARAGRAPH' | 'HTML' | 'VIDEO' | 'DIVIDER' | 'INFO' | 'WARNING' | 'ERROR' | 'MARKDOWN' | 'PLACEHOLDER',defaultvalue:'TEXT',description:定义组件展示的内容类型。包含`IMAGE`(图片)、`TEXT`(文本)、`RAW`(直接内容)、`HEADING1`-`HEADING6`(各级标题)、`PARAGRAPH`(段落)、`HTML`(Html内容)、`VIDEO`(视频)、`DIVIDER`(分割线)、`INFO`(常规提示)、`WARNING`(警告提示)、`ERROR`(错误提示)、`MARKDOWN`(Markdown内容)、`PLACEHOLDER`(占位)} + * @editorparams {name:template,parameterType:string,description:配置的handlerBars模板内容,用于将组件输入参数中的value值解析并转换为HTML内容,实现动态内容的渲染} * @ignoreprops autoFocus | overflowMode * @ignoreemits infoTextChange | enter */ diff --git a/src/editor/span/span/span.tsx b/src/editor/span/span/span.tsx index 22c8645f..2984bc7e 100644 --- a/src/editor/span/span/span.tsx +++ b/src/editor/span/span/span.tsx @@ -25,9 +25,11 @@ function isValidDateFormat(dateStr: string, format: string): boolean { * 标签 * @primary * @description 直接呈现文本内容,可配置单位。支持编辑器类型包含:`标签` - * @editorparams {name:TEXTSEPARATOR,parameterType:string,defaultvalue:'',description:文本分隔符。如果是数组数据,在呈现时用逗号分隔并且转换为字符串显示} - * @editorparams {name:REVERSECOLOR,parameterType:boolean,description:是否反转颜色,即代码表项的color是否用于代码表项的背景色} - * @editorparams {name:SHOWMODE,parameterType:'DEFAULT' | 'ICON' | 'TEXT',defaultvalue:'DEFAULT',description:显示模式,即代码表项的显示情况,值为DEFAULT:显示图标和文本,值为ICON:只显示图标,值为TEXT:只显示文本} + * @editorparams {"name":"textseparator","parameterType":"string","defaultvalue":"','","description":"文本分隔符。如果是数组数据,在呈现时会使用文本分隔符拼接为字符串显示"} + * @editorparams {name:reversecolor,parameterType:boolean,description:是否反转颜色,即代码表项的color是否用于代码表项的背景色} + * @editorparams {name:showmode,parameterType:'DEFAULT' | 'ICON' | 'TEXT',defaultvalue:'DEFAULT',description:显示模式,即代码表项的显示情况,值为DEFAULT:显示图标和文本,值为ICON:只显示图标,值为TEXT:只显示文本} + * @editorparams {"name":"valuetype","parameterType":"string","description":"编辑器的值类型"} + * @editorparams {"name":"objectnamefield","parameterType":"string","defaultvalue":"'srfmajortext'","description":"值类型为OBJECT、OBJECTS时显示的对象属性"} * @ignoreprops autoFocus | overflowMode * @ignoreemits infoTextChange | enter | change | blur | focus */ @@ -45,7 +47,10 @@ export const IBizSpan = defineComponent({ // 文本分隔符 const textSeparator = - c.model.textSeparator || c.editorParams?.TEXTSEPARATOR || ','; + c.model.textSeparator || + c.editorParams?.TEXTSEPARATOR || + c.editorParams?.textseparator || + ','; watch( () => props.value, @@ -163,11 +168,17 @@ export const IBizSpan = defineComponent({ ); -- Gitee From 06157b6e2ec35fb4f58a2245e090f7885df140a4 Mon Sep 17 00:00:00 2001 From: zhf <1204297681@qq.com> Date: Fri, 12 Sep 2025 20:57:02 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=E7=A7=BB=E5=8A=A8=E7=AB=AF?= =?UTF-8?q?=E5=88=86=E9=A1=B5=E5=AF=BC=E8=88=AA=E8=A7=86=E5=9B=BE=E8=AF=86?= =?UTF-8?q?=E5=88=AB=E6=B5=81=E5=BC=8F=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/control/tab-exp-panel/tab-exp-panel.scss | 10 +++++ src/control/tab-exp-panel/tab-exp-panel.tsx | 42 +++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 src/control/tab-exp-panel/tab-exp-panel.scss diff --git a/src/control/tab-exp-panel/tab-exp-panel.scss b/src/control/tab-exp-panel/tab-exp-panel.scss new file mode 100644 index 00000000..6869a0b3 --- /dev/null +++ b/src/control/tab-exp-panel/tab-exp-panel.scss @@ -0,0 +1,10 @@ +@include b(control-tabexppanel-tab-item-header) { + padding: rem(8px) rem(16px); + overflow: hidden; + font-size: getCssVar(font-size, regular); + line-height: var(--van-cell-line-height); + color: getCssVar(color, text, 2); + text-overflow: ellipsis; + white-space: nowrap; + background: getCssVar(color, bg, 0); +} \ No newline at end of file diff --git a/src/control/tab-exp-panel/tab-exp-panel.tsx b/src/control/tab-exp-panel/tab-exp-panel.tsx index 0be4a4a6..133cf008 100644 --- a/src/control/tab-exp-panel/tab-exp-panel.tsx +++ b/src/control/tab-exp-panel/tab-exp-panel.tsx @@ -1,10 +1,15 @@ import { useControlController, useNamespace } from '@ibiz-template/vue3-util'; -import { defineComponent, PropType } from 'vue'; -import { ITabExpPanel } from '@ibiz/model-core'; +import { defineComponent, h, PropType, resolveComponent } from 'vue'; +import { + IAppDETabExplorerView, + IDETabViewPanel, + ITabExpPanel, +} from '@ibiz/model-core'; import { IControlProvider, TabExpPanelController, } from '@ibiz-template/runtime'; +import './tab-exp-panel.scss'; export const TabExpPanelControl = defineComponent({ name: 'IBizTabExpPanelControl', @@ -36,6 +41,12 @@ export const TabExpPanelControl = defineComponent({ (...args) => new TabExpPanelController(...args), ); const ns = useNamespace(`control-${c.model.controlType!.toLowerCase()}`); + + // 视图模型 + const model = c.view?.model as IAppDETabExplorerView; + // 布局模式 + const tabPosition = model?.tabLayout?.toLowerCase() || 'top'; + const onTabChange = (value: string) => { c.state.activeName = value; c.handleTabChange(); @@ -44,11 +55,38 @@ export const TabExpPanelControl = defineComponent({ return { c, ns, + tabPosition, onTabChange, }; }, render() { const { isCreated, tabPages } = this.c.state; + if (this.tabPosition === 'flow' || this.tabPosition === 'flow_noheader') { + if (!isCreated) { + return; + } + return ( +
+ {tabPages.map(page => { + const target = this.c.model.controls?.find( + tab => tab.id === page.tabTag, + ) as IDETabViewPanel; + return ( +
+
{page.caption}
+
+ {h(resolveComponent('IBizViewShell'), { + context: this.context, + params: this.params, + viewId: target?.embeddedAppDEViewId, + })} +
+
+ ); + })} +
+ ); + } return ( isCreated && (