-
{
- c.onClickNew(event, group?.key);
- }}
- >
+
c.loadMore()}
+ >
+ {slots}
+ {renderLoadMore()}
+
+ );
+ };
+
+ const renderGroup = (slots: IData) => {
+ const showGroupAnchor =
+ c.state.groups.length > 1 && (c as MDCtrlController).showGroupAnchor;
+ const content = (
+
+
+ {c.state.groups.map(group => {
+ let header = (
+
{group.caption}
+ );
+ if (showGroupAnchor) {
+ header = (
+
+ {header}
+
+ );
+ }
+ return (
+
+ {header}
+
+ {slots.children && slots.children(group.children)}
+ {renderAddItem(group)}
+
+
+ );
+ })}
+
);
+ if (showGroupAnchor) {
+ const indexList = c.state.groups.map(x => x.caption);
+ return (
+
+ {content}
+
+ );
+ }
+ return content;
};
- return { renderNoData, renderItem, renderLoadMore, renderAddItem };
+ return {
+ enableLoadMore,
+ renderNoData,
+ renderItem,
+ renderLoadMore,
+ renderAddItem,
+ renderScrollList,
+ renderGroup,
+ };
}
--
Gitee
From 4c1c43055324da39cc1fb40b775ab2c237e2a44c Mon Sep 17 00:00:00 2001
From: Cano1997 <1978141412@qq.com>
Date: Fri, 31 Oct 2025 15:59:54 +0800
Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=E7=BC=96=E8=BE=91=E8=A1=A8?=
=?UTF-8?q?=E5=8D=95=E6=94=AF=E6=8C=81=E5=88=86=E7=BB=84=E9=94=9A=E7=82=B9?=
=?UTF-8?q?=E3=80=81=E8=A1=A8=E5=8D=95=E9=A1=B9=E9=94=9A=E7=82=B9=EF=BC=8C?=
=?UTF-8?q?=E9=94=9A=E7=82=B9=E4=BD=8D=E7=BD=AE=E6=94=AF=E6=8C=81=E5=8F=B3?=
=?UTF-8?q?=E4=BE=A7=E4=B8=AD=E9=97=B4=E3=80=81=E5=8F=B3=E4=B8=8A=E8=A7=92?=
=?UTF-8?q?=E3=80=81=E5=8F=B3=E4=B8=8B=E8=A7=92?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
CHANGELOG.md | 1 +
src/control/form/edit-form/edit-form.scss | 23 +++++++++++
src/control/form/edit-form/edit-form.tsx | 38 +++++++++++++++++--
.../form-group-panel/form-group-panel.tsx | 7 +++-
.../form-item-container.tsx | 9 ++++-
5 files changed, 72 insertions(+), 6 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8ab2d6aef38..3f5932011cf 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -45,6 +45,7 @@
- 标签编辑器支持转化为代码项文本
- 表单视图消息支持直接内容展示,无效配置为对象格式
- 新增加载更多按钮,用于多数据、卡片加载更多模式使用
+- 编辑表单支持分组锚点、表单项锚点,锚点位置支持右侧中间、右上角、右下角
### Change
diff --git a/src/control/form/edit-form/edit-form.scss b/src/control/form/edit-form/edit-form.scss
index e2a3acbdf2f..440c6240500 100644
--- a/src/control/form/edit-form/edit-form.scss
+++ b/src/control/form/edit-form/edit-form.scss
@@ -1,3 +1,26 @@
@include b(control-edit-form) {
width: 100%;
+ @include e(anchor) {
+ position: relative;
+ .van-index-anchor {
+ padding: 0;
+ }
+ // 右下角
+ @include m(bottomright) {
+ .van-index-bar__sidebar {
+ bottom: 0;
+ transform: none;
+ top: auto;
+ }
+ }
+ // 右上角
+ @include m(topright) {
+ .van-index-bar__sidebar {
+ position: absolute;
+ top: 0;
+ transform: none;
+ bottom: auto;
+ }
+ }
+ }
}
diff --git a/src/control/form/edit-form/edit-form.tsx b/src/control/form/edit-form/edit-form.tsx
index f2178e85a1d..5ea69026b69 100644
--- a/src/control/form/edit-form/edit-form.tsx
+++ b/src/control/form/edit-form/edit-form.tsx
@@ -3,7 +3,7 @@ import { EditFormController, IControlProvider } from '@ibiz-template/runtime';
import { useControlController, useNamespace } from '@ibiz-template/vue3-util';
import { IDEEditForm } from '@ibiz/model-core';
import { debounce } from 'lodash-es';
-import { defineComponent, PropType, reactive, ref, watch } from 'vue';
+import { defineComponent, PropType, reactive, Ref, ref, watch } from 'vue';
import './edit-form.scss';
export const EditFormControl: ReturnType
=
@@ -63,6 +63,9 @@ export const EditFormControl: ReturnType =
const filter = ref(undefined);
+ // 所有启用了锚点的表单项
+ const anchorList: Ref = ref([]);
+
if (props.isSimple) {
if (props.simpleDataIndex || props.simpleDataIndex === 0) {
c.setSimpleDataIndex(props.simpleDataIndex);
@@ -99,6 +102,7 @@ export const EditFormControl: ReturnType =
const detail = c.details[key];
detail.state = reactive(detail.state);
});
+ anchorList.value = c.anchorData;
});
const handleInput = debounce(
@@ -110,12 +114,18 @@ export const EditFormControl: ReturnType =
{ leading: true },
);
- return { c, ns, filter, handleInput };
+ return {
+ c,
+ ns,
+ filter,
+ handleInput,
+ anchorList,
+ };
},
render() {
- const { enableItemFilter } = this.c.model;
- return (
+ const { enableItemFilter, showFormNavBar } = this.c.model;
+ const content = (
{enableItemFilter && (
=
);
+ if (showFormNavBar) {
+ const { navBarSysCss, navBarPos } = this.c.model;
+ const items = this.anchorList.filter(
+ (item: IData) => item.pageId === this.c.state.activeTab,
+ );
+ return (
+ x.title)}
+ sticky={false}
+ class={[
+ this.ns.e('anchor'),
+ navBarSysCss,
+ this.ns.em('anchor', navBarPos?.toLowerCase()),
+ ]}
+ >
+ {content}
+
+ );
+ }
+ return content;
},
});
diff --git a/src/control/form/form-detail/form-group-panel/form-group-panel.tsx b/src/control/form/form-detail/form-group-panel/form-group-panel.tsx
index 08abbd07c7b..6df6fdaa3ad 100644
--- a/src/control/form/form-detail/form-group-panel/form-group-panel.tsx
+++ b/src/control/form/form-detail/form-group-panel/form-group-panel.tsx
@@ -46,6 +46,7 @@ export const FormGroupPanel = defineComponent({
},
render() {
const { state } = this.controller;
+ const { enableAnchor } = this.modelData;
const defaultSlots: VNode[] = this.$slots.default?.() || [];
const content = (
@@ -147,7 +148,11 @@ export const FormGroupPanel = defineComponent({
class={[classArr, this.ns.is('loading', this.controller.state.loading)]}
onClick={(event: MouseEvent) => this.controller.onClick(event)}
>
- {header}
+ {enableAnchor ? (
+ {header}
+ ) : (
+ header
+ )}
{content}
{footer}
{this.controller.state.loading ? (
diff --git a/src/control/form/form-detail/form-item/form-item-container/form-item-container.tsx b/src/control/form/form-detail/form-item/form-item-container/form-item-container.tsx
index 019a5f615b2..5e181836256 100644
--- a/src/control/form/form-detail/form-item/form-item-container/form-item-container.tsx
+++ b/src/control/form/form-detail/form-item/form-item-container/form-item-container.tsx
@@ -99,6 +99,7 @@ export const IBizFormItemContainer = defineComponent({
};
const renderLabel = () => {
+ const { enableAnchor } = c.model;
return (
)}
- {c.labelCaption}
+ {enableAnchor ? (
+
+ {c.labelCaption}
+
+ ) : (
+ {c.labelCaption}
+ )}
);
},
--
Gitee
From f330d02c7112bc3ecb8b99154d3a3d5e951c5194 Mon Sep 17 00:00:00 2001
From: Cano1997 <1978141412@qq.com>
Date: Fri, 31 Oct 2025 16:05:51 +0800
Subject: [PATCH 4/4] =?UTF-8?q?feat:=20=E5=A4=9A=E6=95=B0=E6=8D=AE?=
=?UTF-8?q?=E3=80=81=E5=8D=A1=E7=89=87=E5=8F=98=E9=87=8F=E6=A0=B7=E5=BC=8F?=
=?UTF-8?q?=E8=A7=84=E8=8C=83=E8=B0=83=E6=95=B4=EF=BC=8C=E9=83=A8=E4=BB=B6?=
=?UTF-8?q?=E7=BB=9F=E4=B8=80=E4=BD=BF=E7=94=A8useListRender?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
CHANGELOG.md | 1 +
src/control/data-view/data-view.scss | 168 ++++++----------
src/control/data-view/data-view.tsx | 266 ++++----------------------
src/control/list/list/list.tsx | 2 +-
src/control/list/md-ctrl/md-ctrl.scss | 188 +++++++-----------
src/control/list/md-ctrl/md-ctrl.tsx | 215 +++------------------
6 files changed, 189 insertions(+), 651 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3f5932011cf..06bf6ec5b45 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -88,6 +88,7 @@
- 统一处理界面行为按钮按钮类型、按钮行为级别、按钮样式
- 优化多数据选择编辑器的呈现样式
- 多数据、卡片通用逻辑提取,支持滚动加载loading、加载完成提示、分组锚点
+- 多数据、卡片变量样式规范调整,部件统一使用useListRender
### Fixed
diff --git a/src/control/data-view/data-view.scss b/src/control/data-view/data-view.scss
index 2faf3ee74be..5d99d07eb8a 100644
--- a/src/control/data-view/data-view.scss
+++ b/src/control/data-view/data-view.scss
@@ -1,26 +1,20 @@
$control-dataview: (
- text-color: getCssVar(color, text, 0),
- item-padding: getCssVar(spacing, base-tight) getCssVar(spacing, base),
- padding: getCssVar(spacing, tight),
- item-gap: getCssVar(spacing, base, tight),
- item-bg-color: transparent,
- active-text-color: getCssVar(color, primary),
- active-bg-color: getCssVar(color, primary, light, default),
- group-font-size: getCssVar(font-size, header-6),
- group-bg-color: getCssVar(color, bg, 0),
- group-text-color: getCssVar(color, text, 1),
- group-header-padding: getCssVar(spacing, base),
- group-padding: 0 getCssVar(spacing, tight),
- group-anchor-bg-color: getCssVar(color, bg, 1),
- group-anchor-border-radius: getCssVar(border, radius, small),
- group-anchor-right: getCssVar('spacing', 'tight'),
- group-anchor-item-padding: getCssVar('spacing', 'tight') getCssVar('spacing', 'base'),
- item-shadow: getCssVar(shadow, elevated),
- button-padding: getCssVar(spacing, tight) 0,
- button-bg: getCssVar(color, fill, 0),
- button-active-bg: getCssVar(color, fill, 2),
- button-color: getCssVar(color, primary),
- add-border: 2px dashed getCssVar(color, border),
+ // Color
+ color-text: getCssVar(color, text, 0),
+ color-bg: getCssVar(color, bg, 0),
+ color-item-active: getCssVar(color, primary, light, default),
+ color-group-bg: getCssVar(color, bg, 0),
+ color-group-text: getCssVar(color, text, 1),
+ // Spacing
+ spacing-item-padding: getCssVar(spacing, base-tight) getCssVar(spacing, base),
+ spacing-padding: getCssVar(spacing, tight) getCssVar(spacing, base),
+ spacing-item-gap: getCssVar(spacing, base, tight),
+ spacing-group-padding: getCssVar(spacing, tight) getCssVar(spacing, base),
+ // Font
+ font-group-fontSize: getCssVar(font-size, header-6),
+ font-group-lineHeight: getCssVar(height-control, default),
+ // Other
+ shadow: getCssVar(shadow, elevated),
);
@include b(control-dataview) {
@@ -32,73 +26,79 @@ $control-dataview: (
@include e(content-container) {
height: 100%;
width: 100%;
- padding: getCssVar(control-dataview, padding);
- overflow-y: auto;
}
@include e(content) {
display: flex;
flex-wrap: wrap;
- height: 100%;
- gap: getCssVar(control-dataview, item-gap);
+ max-height: 100%;
+ gap: getCssVar(control-dataview, spacing-item-gap);
+ overflow-y: auto;
+ padding: getCssVar(control-dataview, spacing-padding);
- @include when(enable-anchor) {
- height: 100%;
+ .van-list__loading,.van-list__finished-text,.van-list__error-text {
+ width: 100%;
}
}
@include e(row) {
gap: 0;
+ margin: calc(-1 * getCssVar(control-dataview, spacing-item-gap)/ 2);
.#{bem(control-dataview, item-col)} {
- padding: calc(getCssVar(control-dataview, item-gap) / 2);
+ padding: calc(getCssVar(control-dataview, spacing-item-gap) / 2);
}
}
- @include when(enable-page) {
+ @include when(enable-pagination) {
display: flex;
flex-direction: column;
.#{bem(control-dataview, content-container)} {
flex: auto;
+ height: 0;
}
.#{bem(control-dataview, pagination)} {
flex: none;
}
}
- @include when(enable-pagination) {
+ @include when(hidden-finished) {
+ // 启用分页时隐藏列表加载完成提示
+ .van-list__finished-text {
+ display: none;
+ }
+ }
+
+ @include when(enable-group) {
.#{bem(control-dataview, content)} {
- height: auto;
+ padding: 0;
+ }
+ .#{bem(control-dataview-group, item)} {
+ padding: getCssVar(control-dataview, spacing-padding);
}
}
- @include e(load-more) {
- padding: getCssVar(control-dataview, button-padding);
- .van-button {
- width: 100%;
- border: none;
- background-color: getCssVar(control-dataview, button-bg);
- color: getCssVar(control-dataview, button-color);
- &:active {
- background-color: getCssVar(control-dataview, button-active-bg);
- }
+ @include e(anchor) {
+ width: 100%;
+ .van-index-anchor {
+ padding: 0;
}
}
}
@include b(control-dataview-item) {
flex: none;
- padding: getCssVar(control-dataview, item-padding);
- box-shadow: getCssVar(control-dataview, item-shadow);
- background-color: getCssVar(control-dataview, item-bg-color);
- color: getCssVar(control-dataview, text-color);
+ padding: getCssVar(control-dataview, spacing-item-padding);
+ box-shadow: getCssVar(control-dataview, shadow);
+ color: getCssVar(control-dataview, color-text);
+ background-color: getCssVar(control-dataview, color-bg);
width: 100%;
@include when(active) {
- background-color: getCssVar(control-dataview,
- item-active-color
- );
+ background-color: getCssVar(control-dataview, color-item-active);
}
>.van-card {
- padding: 0
+ padding: 0;
+ background-color: transparent;
+ color: inherit;
}
}
@@ -109,77 +109,21 @@ $control-dataview: (
@include e('container') {
width: 100%;
height: 100%;
- padding: getCssVar(control-dataview, group-padding);
- overflow-y: auto;
}
@include e(item) {
display: flex;
flex-direction: column;
- gap: getCssVar(control-dataview, item-gap);
+ gap: getCssVar(control-dataview, spacing-item-gap);
}
// 分组标题样式
@include e('caption') {
- padding: getCssVar(control-dataview, group-header-padding);
- font-size: getCssVar(control-dataview, group-font-size);
- color: getCssVar(control-dataview, group-text-color);
- background-color: getCssVar(control-dataview, group-bg-color);
- }
-
- // 分组锚点容器样式
- @include e('anchor-container') {
- position: absolute;
- right: getCssVar(control-dataview, group-anchor-right);
- top: 45%;
- transform: translateY(-50%);
- border-radius: getCssVar(control-dataview, group-anchor-border-radius);
- overflow: hidden;
- display: flex;
- flex-direction: column;
- background-color: getCssVar(control-dataview, group-anchor-bg-color);
- box-shadow:
- getCssVar(control-dataview, box-shadow-inner),
- getCssVar(control-dataview, box-shadow-outer);
- }
-
- // 分组锚点项样式
- @include e('anchor-item') {
- width: 100%;
- text-align: center;
- padding: getCssVar(control-dataview, group-anchor-item-padding);
-
- @include when(active) {
- color: getCssVar(control-dataview, active-text-color);
- background-color: getCssVar(control-dataview, active-bg-color);
- }
- }
-}
-
-// 分组锚点容器样式
-@include e('anchor-container') {
- position: absolute;
- right: getCssVar(control-dataview, group-anchor-right);
- top: 45%;
- transform: translateY(-50%);
- border-radius: getCssVar(control-dataview, group-anchor-border-radius);
- overflow: hidden;
- display: flex;
- flex-direction: column;
- background-color: getCssVar(control-dataview, group-anchor-bg-color);
- box-shadow:
- getCssVar(control-dataview, item-shadow);
-}
-
-// 分组锚点项样式
-@include e('anchor-item') {
- width: 100%;
- text-align: center;
- padding: getCssVar(control-dataview, group-anchor-item-padding);
-
- @include when(active) {
- color: getCssVar(control-dataview, active-text-color);
- background-color: getCssVar(control-dataview, active-bg-color);
+ padding: getCssVar(control-dataview, spacing-group-padding);
+ font-size: getCssVar(control-dataview, font-group-fontSize);
+ line-height: getCssVar(control-dataview, font-group-lineHeight);
+ color: getCssVar(control-dataview, color-group-text);
+ background-color: getCssVar(control-dataview, color-group-bg);
}
}
diff --git a/src/control/data-view/data-view.tsx b/src/control/data-view/data-view.tsx
index 1d28739e80d..3e0cb60b1ed 100644
--- a/src/control/data-view/data-view.tsx
+++ b/src/control/data-view/data-view.tsx
@@ -1,17 +1,15 @@
import { useControlController, useNamespace } from '@ibiz-template/vue3-util';
-import { computed, defineComponent, PropType, ref, VNode, watch } from 'vue';
+import { defineComponent, PropType, VNode } from 'vue';
import {
IDEDataView,
ILayoutPanel,
IUIActionGroupDetail,
} from '@ibiz/model-core';
import {
- ControlVO,
DataViewControlController,
IControlProvider,
} from '@ibiz-template/runtime';
-import { createUUID } from 'qx-util';
-import { usePagination } from '../../util';
+import { useListRender, usePagination } from '../../util';
import './data-view.scss';
export const DataViewControl = defineComponent({
@@ -58,106 +56,16 @@ export const DataViewControl = defineComponent({
(...args) => new DataViewControlController