cdp-material-sdk 0.0.8 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hooks/useFieldRegistry.d.ts +36 -0
- package/dist/host-react.d.ts +2 -0
- package/dist/host-react.js +7 -6
- package/dist/index.js +14 -13
- package/dist/useFieldRegistry-CwjlA-ja.js +123 -0
- package/docs/component-development/README.md +10 -0
- package/docs/component-development/recipes//344/275/277/347/224/250Adapter/351/200/202/351/205/215/347/273/204/344/273/266API.md +121 -23
- package/docs/component-development/recipes//345/243/260/346/230/216props.md +313 -0
- package/docs/component-development/recipes//345/243/260/346/230/216/345/270/203/345/261/200/345/256/271/345/231/250/347/273/204/344/273/266.md +38 -14
- package/docs/component-development/recipes//345/243/260/346/230/216/346/217/222/346/247/275.md +4 -2
- package/docs/component-development/recipes//345/243/260/346/230/216/346/225/260/346/215/256/345/255/227/346/256/265/347/273/204/344/273/266.md +122 -12
- package/docs/component-development/recipes//345/243/260/346/230/216/346/225/260/346/215/256/345/256/271/345/231/250/347/273/204/344/273/266.md +10 -4
- package/docs/component-development/recipes//351/205/215/347/275/256Loading/347/255/226/347/225/245.md +96 -0
- package/docs/component-development/reference/Manifest/345/255/227/346/256/265/345/217/202/350/200/203.md +2 -1
- package/docs/component-development/reference/SDK/345/257/274/345/205/245/350/276/271/347/225/214.md +5 -4
- package/docs/component-development/reference/Traits/350/203/275/345/212/233/346/250/241/345/236/213.md +59 -14
- package/docs/component-development/reference//345/274/225/346/223/216/345/237/272/347/241/200/350/203/275/345/212/233/346/250/241/345/236/213.md +11 -9
- package/package.json +1 -1
- package/dist/DataScope-B7ffH5qN.js +0 -106
|
@@ -147,6 +147,102 @@ actions: {
|
|
|
147
147
|
|
|
148
148
|
---
|
|
149
149
|
|
|
150
|
+
## 自实现 loading 的 hook
|
|
151
|
+
|
|
152
|
+
`none` 策略下组件得自己维护 loading state。SDK 在 `cdp-material-sdk/portable` 提供两个**纯 React、无宿主耦合**的便利 hook,避免每家组件重复实现引用计数与 dual-loading 合并逻辑。
|
|
153
|
+
|
|
154
|
+
### useConcurrentLoading:并发动作 loading
|
|
155
|
+
|
|
156
|
+
适合按钮上同时挂多个异步动作、或同一组件可能并发触发多次请求的场景。返回的 `startLoading` / `stopLoading` 是**引用计数式**的——后到的 stop 不会误清先到的 start。
|
|
157
|
+
|
|
158
|
+
```tsx
|
|
159
|
+
import { useConcurrentLoading } from 'cdp-material-sdk/portable';
|
|
160
|
+
|
|
161
|
+
export function AcmePanel() {
|
|
162
|
+
const { isLoading, loadingText, startLoading, stopLoading } = useConcurrentLoading();
|
|
163
|
+
|
|
164
|
+
const handleSave = async () => {
|
|
165
|
+
startLoading('保存中…');
|
|
166
|
+
try {
|
|
167
|
+
await saveToServer();
|
|
168
|
+
} finally {
|
|
169
|
+
stopLoading();
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
return (
|
|
174
|
+
<button disabled={isLoading} onClick={handleSave}>
|
|
175
|
+
{isLoading ? loadingText ?? '处理中…' : '保存'}
|
|
176
|
+
</button>
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
返回值要点:
|
|
182
|
+
|
|
183
|
+
- `isLoading` 是触发重渲染的状态值,可直接驱动 UI。
|
|
184
|
+
- `getLoading()` 是 ref 读取,适合放进 `useCallback`、事件处理器中按需读取,无需进依赖列表。
|
|
185
|
+
- `loadingText` 由最近一次 `startLoading(text)` 设置;不传 `text` 则保持上次值。
|
|
186
|
+
|
|
187
|
+
### useDualLoading:动作 loading 与数据 loading 分离
|
|
188
|
+
|
|
189
|
+
适合 Table、查询面板这类**同时存在「按钮触发的动作」与「后台数据请求」**的组件。两类 loading 单独建模,但对外仍暴露统一的 `isLoading`。
|
|
190
|
+
|
|
191
|
+
```tsx
|
|
192
|
+
import { useEffect } from 'react';
|
|
193
|
+
import { useDualLoading } from 'cdp-material-sdk/portable';
|
|
194
|
+
|
|
195
|
+
export function AcmeTable({ query }) {
|
|
196
|
+
const {
|
|
197
|
+
actionLoading, // 动作触发的 loading(引用计数)
|
|
198
|
+
startActionLoading,
|
|
199
|
+
stopActionLoading,
|
|
200
|
+
dataLoading, // 数据请求 loading(布尔)
|
|
201
|
+
setDataLoading,
|
|
202
|
+
isLoading, // 二者的 OR
|
|
203
|
+
isLoadingRef, // 引用稳定的最新值
|
|
204
|
+
} = useDualLoading();
|
|
205
|
+
|
|
206
|
+
// 数据请求:标记 dataLoading
|
|
207
|
+
useEffect(() => {
|
|
208
|
+
let cancelled = false;
|
|
209
|
+
setDataLoading(true);
|
|
210
|
+
fetchRows(query).finally(() => {
|
|
211
|
+
if (!cancelled) setDataLoading(false);
|
|
212
|
+
});
|
|
213
|
+
return () => { cancelled = true; };
|
|
214
|
+
}, [query, setDataLoading]);
|
|
215
|
+
|
|
216
|
+
// 行内动作:标记 actionLoading
|
|
217
|
+
const handleRowDelete = async (id: string) => {
|
|
218
|
+
startActionLoading('删除中…');
|
|
219
|
+
try {
|
|
220
|
+
await deleteRow(id);
|
|
221
|
+
} finally {
|
|
222
|
+
stopActionLoading();
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
return <TableUi loading={isLoading} onDelete={handleRowDelete} />;
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
要点:
|
|
231
|
+
|
|
232
|
+
- 用 `dataLoading` 表达「后台拉数据」,用 `actionLoading` 表达「用户动作触发的并发任务」,二者互不污染。
|
|
233
|
+
- 对外通过 `isLoading` 对接 UI 即可,不必在外层组合两个布尔。
|
|
234
|
+
- `isLoadingRef.current` 提供引用稳定的最新值,方便在事件回调里判断「当前是否仍处于 loading」而不必把状态加进依赖列表。
|
|
235
|
+
|
|
236
|
+
### 与 manifest loading 策略的搭配
|
|
237
|
+
|
|
238
|
+
| 场景 | manifest 策略 | hook |
|
|
239
|
+
|------|---------------|------|
|
|
240
|
+
| 完全交给宿主 | `native` 或 `wrapper` | 不需要 |
|
|
241
|
+
| 宿主只接管视觉、组件内部仍想细分 loading | `wrapper` + 这两个 hook | `useConcurrentLoading` 或 `useDualLoading`,组件内部用 hook 状态驱动局部 UI,宿主负责整体遮罩 |
|
|
242
|
+
| 完全自管 | `none` + 自定义 `setLoading` / `getLoading` actions | 推荐 `useConcurrentLoading`;用 hook 的 `getLoading` 实现 action 的 `getLoading`,用 `startLoading` / `stopLoading` 实现 action 的 `setLoading` |
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
150
246
|
## 选择表
|
|
151
247
|
|
|
152
248
|
| 组件情况 | 推荐策略 |
|
|
@@ -22,7 +22,7 @@ related:
|
|
|
22
22
|
| `alias` | `string[]` | 否 | 历史别名或兼容名 |
|
|
23
23
|
| `meta` | `object` | 是 | 基本信息 |
|
|
24
24
|
| `traits` | `ComponentTrait[]` | 否 | 能力声明 |
|
|
25
|
-
| `props` | `ObjectSchema` | 否 | 可配置 props 的 JSON Schema |
|
|
25
|
+
| `props` | `ObjectSchema` | 否 | 可配置 props 的 JSON Schema,详见 [声明 props](../recipes/声明props.md) |
|
|
26
26
|
| `events` | `EventSpec[]` | 否 | 标准事件声明 |
|
|
27
27
|
| `customEvents` | `Record<string, CustomEventSpec>` | 否 | 自定义事件声明 |
|
|
28
28
|
| `actions` | `Record<string, ActionSpec>` | 否 | 组件动作声明 |
|
|
@@ -245,6 +245,7 @@ export const manifest = {
|
|
|
245
245
|
本文档只保留本层级职责内容:Recipe 提供任务步骤,Reference 提供稳定模型和规则,validateManifest 文档提供校验级别事实源。
|
|
246
246
|
|
|
247
247
|
- 关联文档:[03-开发最小可运行组件](../getting-started/03-开发最小可运行组件.md)
|
|
248
|
+
- 任务 Recipe:[声明 props](../recipes/声明props.md)
|
|
248
249
|
- 任务 Recipe:[声明布局容器组件](../recipes/声明布局容器组件.md)
|
|
249
250
|
- 任务 Recipe:[配置设计器元信息](../recipes/配置设计器元信息.md)
|
|
250
251
|
- 校验规则:[validateManifest校验规则](./validateManifest校验规则.md)
|
package/docs/component-development/reference/SDK/345/257/274/345/205/245/350/276/271/347/225/214.md
CHANGED
|
@@ -31,6 +31,7 @@ related:
|
|
|
31
31
|
- `validateManifest()`
|
|
32
32
|
- `diagnoseMissingActionImpls()`
|
|
33
33
|
- `diagnoseMissingStateKeys()`
|
|
34
|
+
- `useConcurrentLoading` / `useDualLoading`(组件自实现 loading 时的开箱即用 hook)
|
|
34
35
|
|
|
35
36
|
示例:
|
|
36
37
|
|
|
@@ -53,10 +54,10 @@ import {
|
|
|
53
54
|
|
|
54
55
|
可用于:
|
|
55
56
|
|
|
56
|
-
- `DataScope`
|
|
57
|
-
- `useDataContainer`
|
|
58
|
-
- `
|
|
59
|
-
- `PageContext`
|
|
57
|
+
- `DataScope` / `DataScopeContext` / 类型 `FieldState` / `LazyScope` / `PathResolver`
|
|
58
|
+
- `useDataContainer` / `useDataContainerApi`
|
|
59
|
+
- `useFieldRegistry`(与 `DataScope` 配套,给数据容器组件聚合子字段状态)
|
|
60
|
+
- `PageContext` / `DataContainerRuntimeContext`
|
|
60
61
|
|
|
61
62
|
如果不能确认共享 runtime,请不要使用该入口。
|
|
62
63
|
|
|
@@ -22,7 +22,7 @@ Traits 之间不互斥,一个组件可以同时声明多个 trait。例如 For
|
|
|
22
22
|
|-------|------|----------|------------|
|
|
23
23
|
| `Data.Field` | `COMPONENT_TRAIT.DATA_FIELD` | Input、Select、Switch、DatePicker | 组件是一个数据字段 |
|
|
24
24
|
| `Data.Container` | `COMPONENT_TRAIT.DATA_CONTAINER` | Form、Table、List、CardList | 组件管理一组数据作用域 |
|
|
25
|
-
| `Layout.Container` | `COMPONENT_TRAIT.LAYOUT_CONTAINER` | Card、Grid、Tabs、
|
|
25
|
+
| `Layout.Container` | `COMPONENT_TRAIT.LAYOUT_CONTAINER` | 通用容器:Card、Grid、Section;强组合关系:Tabs、Steps、Form(带 `nesting` 类型约束) | 组件具备**默认 children 区域**(与 `manifest.slots` 是两条独立机制) |
|
|
26
26
|
| `Interaction.Clickable` | `COMPONENT_TRAIT.INTERACTION_CLICKABLE` | Button、Link、ClickableCard | 组件具备点击交互语义 |
|
|
27
27
|
|
|
28
28
|
---
|
|
@@ -37,15 +37,52 @@ Traits 之间不互斥,一个组件可以同时声明多个 trait。例如 For
|
|
|
37
37
|
|
|
38
38
|
- 声明 `COMPONENT_TRAIT.DATA_FIELD`。
|
|
39
39
|
- 声明 `meta.valueSchema`。
|
|
40
|
-
-
|
|
41
|
-
-
|
|
40
|
+
- 组件接收并渲染 `value`,值变化时调用 `onChange(nextValue)`。
|
|
41
|
+
- 如组件支持只读/必填/标签语义,分别接收 `readOnly` / `required` / `label`;置于数据容器内时支持 `name`。
|
|
42
|
+
|
|
43
|
+
下列 props / actions / state / events 由引擎在声明 `DATA_FIELD` 后**自动注入并合并到 manifest**,作者一般**不需要**在自己的 manifest 中重复声明——重复声明会**覆盖**引擎注入的版本(包括 `valueSchema` 自动特化),破坏对外行为一致性。仅当组件**确有特化需求**(例如定制 `setValue.params` 取值规则)时,才建议显式声明覆盖:
|
|
44
|
+
|
|
45
|
+
#### 自动注入的 props
|
|
46
|
+
|
|
47
|
+
| Prop | 类型 | 说明 |
|
|
48
|
+
|------|------|------|
|
|
49
|
+
| `value` | 由 `meta.valueSchema` 决定 | 字段当前值 |
|
|
50
|
+
| `readOnly` | `boolean` | 是否只读 |
|
|
51
|
+
| `required` | `boolean` | 是否必填 |
|
|
52
|
+
| `name` | `string` | 字段名(容器内组织值用) |
|
|
53
|
+
| `label` | `string` | 显示标签 |
|
|
54
|
+
| `labelStrategy` | 标签策略对象 | 字段级标签策略局部覆盖;未设置时向上继承(FieldLayout / Form / Page / 默认) |
|
|
55
|
+
|
|
56
|
+
#### 自动注入的 actions
|
|
57
|
+
|
|
58
|
+
| Action | 说明 |
|
|
59
|
+
|--------|------|
|
|
60
|
+
| `getValue` | 获取当前值;返回类型由 `valueSchema` 特化 |
|
|
61
|
+
| `setValue({ value, triggerEvent? })` | 设置值;返回 `{ newValue, oldValue }`;`triggerEvent` 默认 `true` |
|
|
62
|
+
| `getReadOnly` / `setReadOnly({ readOnly })` / `toggleReadOnly` | 只读状态读写与切换 |
|
|
63
|
+
| `getRequired` / `setRequired({ required })` / `toggleRequired` | 必填状态读写与切换 |
|
|
64
|
+
| `triggerValueChange({ newValue?, oldValue? })` | 手动触发 `valueChange` 事件,用于 `updateFields` / 直写 Store 等绕过 `setValue` 的场景 |
|
|
65
|
+
|
|
66
|
+
#### 自动注入的 state
|
|
67
|
+
|
|
68
|
+
| State | Schema | 说明 |
|
|
69
|
+
|-------|--------|------|
|
|
70
|
+
| `value` | `meta.valueSchema` | 当前值;schema 由 `valueSchema` 自动透传 |
|
|
71
|
+
| `readOnly` | `boolean` | 当前只读状态 |
|
|
72
|
+
| `required` | `boolean` | 当前必填状态 |
|
|
73
|
+
|
|
74
|
+
#### 自动注入的 events
|
|
75
|
+
|
|
76
|
+
| Event | 说明 |
|
|
77
|
+
|-------|------|
|
|
78
|
+
| `valueChange` | 值变更事件;`onChange(nextValue)` 或 `setValue` 默认触发;可被事件编排消费 |
|
|
42
79
|
|
|
43
80
|
### 宿主可据此做什么
|
|
44
81
|
|
|
45
|
-
-
|
|
46
|
-
-
|
|
47
|
-
-
|
|
48
|
-
-
|
|
82
|
+
- 注入和回写字段值,在数据容器内按 `name` 组织值。
|
|
83
|
+
- 让表达式、设计器和 AI 工具识别 value 类型与字段语义。
|
|
84
|
+
- 基于 `valueSchema` 自动特化 `getValue` / `setValue` / `state.value` 的类型描述。
|
|
85
|
+
- 统一管理只读/必填状态,支持事件编排基于 `readOnly` / `required` / `value` 状态联动。
|
|
49
86
|
|
|
50
87
|
---
|
|
51
88
|
|
|
@@ -75,15 +112,21 @@ Traits 之间不互斥,一个组件可以同时声明多个 trait。例如 For
|
|
|
75
112
|
|
|
76
113
|
### 什么时候声明
|
|
77
114
|
|
|
78
|
-
|
|
115
|
+
组件需要一个**默认 children 区域**:设计器中拖入的子节点会被宿主递归渲染并作为 React `children` 传入。
|
|
116
|
+
|
|
117
|
+
只通过命名 / 作用域 / 动态插槽承载子内容的组件**不需要**声明此 trait,直接通过 `manifest.slots` 即可。
|
|
79
118
|
|
|
80
119
|
### 作者要做什么
|
|
81
120
|
|
|
82
121
|
- 声明 `COMPONENT_TRAIT.LAYOUT_CONTAINER`。
|
|
83
|
-
- 在组件实现中渲染 `children
|
|
84
|
-
-
|
|
122
|
+
- 在组件实现中渲染 `children`。
|
|
123
|
+
- 需要限制默认 children 区域的子组件类型、最少/最多数量、或能作为子节点的父组件时,声明 `nesting`。
|
|
85
124
|
- 详细任务步骤见 [声明布局容器组件](../recipes/声明布局容器组件.md)。
|
|
86
125
|
|
|
126
|
+
### 与 slots 的关系
|
|
127
|
+
|
|
128
|
+
宿主在运行时独立判断 `LAYOUT_CONTAINER` trait 与 `manifest.slots`:前者控制默认 children 区域,后者控制具名插槽。两者可以并存,也可以独立使用。
|
|
129
|
+
|
|
87
130
|
### 宿主可据此做什么
|
|
88
131
|
|
|
89
132
|
- 在设计器中允许拖入子组件。
|
|
@@ -133,9 +176,11 @@ meta: {
|
|
|
133
176
|
| 组件场景 | 推荐 traits |
|
|
134
177
|
|----------|-------------|
|
|
135
178
|
| 输入框、选择器、开关 | `DATA_FIELD` |
|
|
136
|
-
| 表单 | `DATA_CONTAINER` + `LAYOUT_CONTAINER` |
|
|
137
|
-
| 表格、列表 | `DATA_CONTAINER
|
|
138
|
-
| 卡片、栅格、
|
|
179
|
+
| 表单 | `DATA_CONTAINER` + `LAYOUT_CONTAINER`(搭配 `nesting.allowedChildren` 锁定 FormItem 等) |
|
|
180
|
+
| 表格、列表 | `DATA_CONTAINER`,列/行模板用动态 / 作用域 `slots` |
|
|
181
|
+
| 卡片、栅格、Section(通用 children 区域) | `LAYOUT_CONTAINER` |
|
|
182
|
+
| Tabs / Steps / Collapse(强组合关系) | `LAYOUT_CONTAINER` + `nesting`(子/父类型约束) |
|
|
183
|
+
| Modal / Card 的多具名扩展区(header / footer) | `slots` |
|
|
139
184
|
| 按钮、链接 | `INTERACTION_CLICKABLE` |
|
|
140
185
|
| 普通文本展示 | 可不声明 |
|
|
141
186
|
|
|
@@ -147,7 +192,7 @@ meta: {
|
|
|
147
192
|
|------|------|
|
|
148
193
|
| `DATA_FIELD` | 仅用于有主要业务值且能回写的组件 |
|
|
149
194
|
| `DATA_CONTAINER` | 用于管理子字段数据作用域;必须在子组件渲染区域提供 `DataScope`。与 `LAYOUT_CONTAINER` 不互斥,Form 这类容器应同时声明 |
|
|
150
|
-
| `LAYOUT_CONTAINER` |
|
|
195
|
+
| `LAYOUT_CONTAINER` | 控制**默认 children 区域**开关,仅影响 `schema.children` 是否被宿主递归渲染。具名子区域走 `manifest.slots`,与本 trait 互不依赖 |
|
|
151
196
|
| `INTERACTION_CLICKABLE` | 表示具备点击语义;需要编排响应时再声明 click event |
|
|
152
197
|
|
|
153
198
|
数据 trait 与 `meta.valueSchema` 的校验级别见 [validateManifest 校验规则](./validateManifest校验规则.md)。
|
|
@@ -9,7 +9,7 @@ related:
|
|
|
9
9
|
---
|
|
10
10
|
# 引擎基础能力模型
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
引擎基础能力是宿主自动赋予所有组件的通用运行时能力。组件作者一般不需要在 manifest 中重复声明这些能力——它们由宿主统一注入,重复声明会**覆盖**宿主版本,破坏对外行为的一致性。仅当组件**确有特化需求**时,才建议显式声明覆盖。
|
|
13
13
|
|
|
14
14
|
---
|
|
15
15
|
|
|
@@ -17,24 +17,26 @@ related:
|
|
|
17
17
|
|
|
18
18
|
| 能力 | 外部含义 | 组件作者需要做什么 |
|
|
19
19
|
|------|----------|-------------------|
|
|
20
|
-
| `hidden` prop | 宿主告诉组件当前是否隐藏 |
|
|
21
|
-
| `getHidden` action | 外部流程读取组件显隐状态 |
|
|
22
|
-
| `setHidden` action | 外部流程设置组件显隐状态 |
|
|
23
|
-
| `toggleHidden` action | 外部流程切换组件显隐状态 |
|
|
24
|
-
| `hidden` state | 外部表达式、编排或 AI 读取当前显隐状态 |
|
|
25
|
-
| `mount` / `unmount` events | 基础生命周期通知 |
|
|
20
|
+
| `hidden` prop | 宿主告诉组件当前是否隐藏 | 可按需读取;不建议改写为其他业务语义 |
|
|
21
|
+
| `getHidden` action | 外部流程读取组件显隐状态 | 默认不声明;如需特化(例如不同的 returns 描述)再显式覆盖 |
|
|
22
|
+
| `setHidden` action | 外部流程设置组件显隐状态 | 默认不声明;如需特化再显式覆盖 |
|
|
23
|
+
| `toggleHidden` action | 外部流程切换组件显隐状态 | 默认不声明;如需特化再显式覆盖 |
|
|
24
|
+
| `hidden` state | 外部表达式、编排或 AI 读取当前显隐状态 | 默认不声明;如需特化 schema 再显式覆盖 |
|
|
25
|
+
| `mount` / `unmount` events | 基础生命周期通知 | 默认不声明;普通组件无需重复 |
|
|
26
|
+
|
|
27
|
+
> 显式声明同名字段会覆盖宿主默认版本,请确认特化是必要的,并在 review 时让上游能识别这是有意覆盖。
|
|
26
28
|
|
|
27
29
|
---
|
|
28
30
|
|
|
29
31
|
## 与组件 manifest 的关系
|
|
30
32
|
|
|
31
|
-
基础能力由宿主在运行时补充。第三方组件 manifest
|
|
33
|
+
基础能力由宿主在运行时补充。第三方组件 manifest 通常只需声明组件自己的业务能力,例如:
|
|
32
34
|
|
|
33
35
|
- 业务 actions,例如 `refresh`、`clear`、`focus`。
|
|
34
36
|
- 业务 state,例如 `selectedRows`、`keyword`。
|
|
35
37
|
- 业务 events,例如 `valueChange`、`itemClick` 或自定义事件。
|
|
36
38
|
|
|
37
|
-
|
|
39
|
+
一般不需要为了获得显隐控制而在 manifest 中手写 `getHidden`、`setHidden`、`toggleHidden` 或 `hidden` state;只在确有特化需求时再覆盖。
|
|
38
40
|
|
|
39
41
|
---
|
|
40
42
|
|
package/package.json
CHANGED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import { createContext as D, useContext as f, useCallback as l, useRef as j, useMemo as E } from "react";
|
|
2
|
-
import { useStore as O } from "zustand";
|
|
3
|
-
import { cloneDeep as i, has as g, set as M } from "lodash-es";
|
|
4
|
-
import { jsx as k } from "react/jsx-runtime";
|
|
5
|
-
const b = D(null), d = D(null), x = "value", m = (t) => t !== null && typeof t == "object" && !Array.isArray(t), p = (t) => Array.isArray(t) && t.every((n) => n === void 0 || m(n)), C = (t, n, e = [x]) => {
|
|
6
|
-
if (!g(t, e)) {
|
|
7
|
-
M(t, e, i(n));
|
|
8
|
-
return;
|
|
9
|
-
}
|
|
10
|
-
if (p(n)) {
|
|
11
|
-
n.forEach((r, o) => {
|
|
12
|
-
C(t, r, [...e, o]);
|
|
13
|
-
});
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
if (m(n))
|
|
17
|
-
for (const [r, o] of Object.entries(n))
|
|
18
|
-
C(
|
|
19
|
-
t,
|
|
20
|
-
o,
|
|
21
|
-
[...e, r]
|
|
22
|
-
);
|
|
23
|
-
}, $ = (t, n) => {
|
|
24
|
-
if (n === void 0)
|
|
25
|
-
return t;
|
|
26
|
-
if (t === void 0)
|
|
27
|
-
return i(n);
|
|
28
|
-
const e = p(n), r = p(t), o = Array.isArray(n), s = Array.isArray(t), u = m(n), a = m(t);
|
|
29
|
-
if (o !== s || u !== a)
|
|
30
|
-
return i(n);
|
|
31
|
-
if ((o || s) && (!e || !r))
|
|
32
|
-
return i(n);
|
|
33
|
-
if (e !== r || u !== a)
|
|
34
|
-
return i(n);
|
|
35
|
-
if (!e && !u)
|
|
36
|
-
return i(n);
|
|
37
|
-
const c = { value: i(n) };
|
|
38
|
-
return C(c, t), c.value;
|
|
39
|
-
}, P = (t) => t === void 0 || t !== null && typeof t == "object", K = (t, n, e) => !t || !n || t !== n.componentId || n.hasInitializedRef.current || n.initialDefaultValueRef.current === void 0 ? !1 : P(e), I = (t, n, e) => K(t, n, e) ? $(e, n?.initialDefaultValueRef.current) : e;
|
|
40
|
-
function U(t) {
|
|
41
|
-
const n = f(b), e = f(d), r = n?.store ?? null, o = t ?? e?.componentId, s = l(() => {
|
|
42
|
-
const c = r && o ? r.getState().components[o]?.value : void 0;
|
|
43
|
-
return I(o, e, c);
|
|
44
|
-
}, [o, e, r]), u = l((c) => {
|
|
45
|
-
!r || !o || r.getState().setComponentData(o, c);
|
|
46
|
-
}, [o, r]), a = l(() => {
|
|
47
|
-
!r || !o || r.getState().resetComponentData(o);
|
|
48
|
-
}, [o, r]);
|
|
49
|
-
return { getContainerData: s, setContainerData: u, resetContainerData: a };
|
|
50
|
-
}
|
|
51
|
-
function T(t) {
|
|
52
|
-
const n = U(t), e = f(b), r = f(d), o = e?.store ?? null, s = t ?? r?.componentId;
|
|
53
|
-
return {
|
|
54
|
-
containerData: o ? I(
|
|
55
|
-
s,
|
|
56
|
-
r,
|
|
57
|
-
O(o, (a) => s ? a.components[s]?.value : void 0)
|
|
58
|
-
) : void 0,
|
|
59
|
-
...n
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
const Y = D(null), _ = "components", h = "value", w = (t, n) => `${_}.${t}.${h}.${n}`, q = ({
|
|
63
|
-
relativePath: t,
|
|
64
|
-
record: n,
|
|
65
|
-
getRecord: e,
|
|
66
|
-
index: r,
|
|
67
|
-
registerField: o,
|
|
68
|
-
unregisterField: s,
|
|
69
|
-
children: u
|
|
70
|
-
}) => {
|
|
71
|
-
const a = f(d);
|
|
72
|
-
if (!a?.componentId)
|
|
73
|
-
throw new Error(
|
|
74
|
-
"[cdp-material-sdk] DataScope 必须在数据容器组件内部使用,请确保上层提供 DataContainerRuntimeContext。"
|
|
75
|
-
);
|
|
76
|
-
const c = a.componentId, y = l(
|
|
77
|
-
(v) => {
|
|
78
|
-
const S = t ? t(v) : v;
|
|
79
|
-
return w(c, S);
|
|
80
|
-
},
|
|
81
|
-
[c, t]
|
|
82
|
-
), A = j(n);
|
|
83
|
-
A.current = n;
|
|
84
|
-
const R = E(
|
|
85
|
-
() => ({
|
|
86
|
-
resolvePath: y,
|
|
87
|
-
inScope: !0,
|
|
88
|
-
getRecord: e ?? (() => A.current),
|
|
89
|
-
index: r,
|
|
90
|
-
registerField: o,
|
|
91
|
-
unregisterField: s
|
|
92
|
-
}),
|
|
93
|
-
[y, e, r, o, s]
|
|
94
|
-
);
|
|
95
|
-
return /* @__PURE__ */ k(Y.Provider, { value: R, children: u });
|
|
96
|
-
};
|
|
97
|
-
export {
|
|
98
|
-
d as D,
|
|
99
|
-
b as P,
|
|
100
|
-
q as a,
|
|
101
|
-
Y as b,
|
|
102
|
-
U as c,
|
|
103
|
-
I as r,
|
|
104
|
-
K as s,
|
|
105
|
-
T as u
|
|
106
|
-
};
|