@cloudtower/eagle 490.0.5 → 490.0.7
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/README.md +34 -0
- package/dist/cjs/core/Cascader/cascader.widget.js +12 -12
- package/dist/cjs/core/SearchInput/SearchInput.hook.js +124 -0
- package/dist/cjs/core/SearchInput/SearchInput.js +253 -0
- package/dist/cjs/core/SearchInput/SearchInput.style.js +13 -0
- package/dist/cjs/core/index.js +6 -6
- package/dist/cjs/index.js +172 -172
- package/dist/cjs/legacy-antd.js +89 -89
- package/dist/cjs/stats1.html +1 -1
- package/dist/components.css +3836 -3813
- package/dist/esm/core/Cascader/cascader.widget.js +1 -1
- package/dist/esm/core/SearchInput/SearchInput.hook.js +117 -0
- package/dist/esm/core/SearchInput/SearchInput.js +247 -0
- package/dist/esm/core/SearchInput/SearchInput.style.js +7 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/legacy-antd.js +1 -1
- package/dist/esm/stats1.html +1 -1
- package/dist/linaria.merged.scss +3611 -3582
- package/dist/src/core/Cascader/cascader.type.d.ts +1 -1
- package/dist/src/core/ImmersiveDialog/type.d.ts +127 -19
- package/dist/src/core/MediumDialog/MediumDialog.type.d.ts +49 -1
- package/dist/src/core/SearchInput/SearchInput.d.ts +2 -0
- package/dist/src/core/SearchInput/SearchInput.hook.d.ts +9 -0
- package/dist/src/core/SearchInput/SearchInput.style.d.ts +5 -0
- package/dist/src/core/SearchInput/SearchInput.type.d.ts +150 -0
- package/dist/src/core/SearchInput/__test__/SearchInput.hook.test.d.ts +1 -0
- package/dist/src/core/SearchInput/index.d.ts +2 -4
- package/dist/src/core/SmallDialog/SmallDialog.type.d.ts +150 -21
- package/dist/src/core/TableForm/types.d.ts +216 -68
- package/dist/src/core/WizardDialog/type.d.ts +147 -13
- package/dist/src/core/index.d.ts +0 -1
- package/dist/src/coreX/Dialogs/DeleteDialog/DeleteDialog.type.d.ts +100 -9
- package/dist/src/coreX/Dialogs/RejectDialog/RejectDialog.type.d.ts +126 -19
- package/dist/stories/docs/core/ImmersiveDialog.stories.d.ts +76 -8
- package/dist/stories/docs/core/MediumDialog.stories.d.ts +42 -8
- package/dist/stories/docs/core/SearchInput.stories.d.ts +6 -1
- package/dist/stories/docs/core/SmallDialog.stories.d.ts +86 -7
- package/dist/stories/docs/core/TableForm.stories.d.ts +40 -26
- package/dist/stories/docs/core/WizardDialog.stories.d.ts +65 -6
- package/dist/stories/docs/coreX/Dialogs/DeleteDialog.stories.d.ts +20 -19
- package/dist/stories/docs/coreX/Dialogs/RejectDialog.stories.d.ts +24 -23
- package/dist/style.css +3836 -3813
- package/docs/core/ImmersiveDialog/guide.md +298 -0
- package/docs/core/LegacyModal/migrate-guide.md +422 -0
- package/docs/core/MediumDialog/guide.md +263 -0
- package/docs/core/SearchInput/guide.md +125 -0
- package/docs/core/SmallDialog/guide.md +224 -0
- package/docs/core/TableForm/guide.md +195 -0
- package/docs/core/WizardDialog/guide.md +322 -0
- package/docs/coreX/DeleteDialog/guide.md +161 -0
- package/docs/coreX/RejectDialog/guide.md +185 -0
- package/docs/llms.txt +169 -0
- package/package.json +6 -5
- package/dist/cjs/core/SearchInput/index.js +0 -164
- package/dist/esm/core/SearchInput/index.js +0 -157
- package/dist/src/core/SearchInput/searchInput.type.d.ts +0 -63
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
# ImmersiveDialog
|
|
2
|
+
|
|
3
|
+
## 简介
|
|
4
|
+
|
|
5
|
+
ImmersiveDialog 是一个沉浸式全屏对话框组件,支持左中右三栏布局。默认三栏布局宽度:左侧面板 192px、中间内容区 648px、右侧面板 192px。设置 `isContentFull` 后内容区占满整个对话框,不再渲染左右面板。通过 `usePushModal` / `usePopModal` 管理弹窗生命周期,内置初始化加载态、错误信息展示和骨架屏等能力。
|
|
6
|
+
|
|
7
|
+
## 何时使用
|
|
8
|
+
|
|
9
|
+
- 需要大面积内容展示的场景(如详情页、配置面板)
|
|
10
|
+
- 复杂操作流程,需要同时展示导航、内容和辅助信息
|
|
11
|
+
- 需要左侧导航 + 中间表单/内容 + 右侧帮助信息的三栏布局
|
|
12
|
+
|
|
13
|
+
不要使用:
|
|
14
|
+
|
|
15
|
+
- 多步骤向导流程 --> 请用 `WizardDialog`
|
|
16
|
+
- 简单确认操作 --> 请用 `SmallDialog`
|
|
17
|
+
- 包含表单的中等复杂度场景 --> 请用 `MediumDialog`
|
|
18
|
+
|
|
19
|
+
## 布局说明
|
|
20
|
+
|
|
21
|
+
ImmersiveDialog 提供两种布局模式:
|
|
22
|
+
|
|
23
|
+
### 三栏布局(默认)
|
|
24
|
+
|
|
25
|
+
默认模式下,对话框分为左、中、右三栏:
|
|
26
|
+
|
|
27
|
+
- **左侧面板**(`left`):宽度 192px,适合放置导航菜单或步骤指示器
|
|
28
|
+
- **中间内容区**(`children`):宽度 648px,标题和 footer 与中间内容区对齐
|
|
29
|
+
- **右侧面板**(`right`):宽度 192px,适合放置辅助信息或快捷操作
|
|
30
|
+
|
|
31
|
+
左右面板为 `position: fixed` 定位,中间内容区可独立滚动。
|
|
32
|
+
|
|
33
|
+
### 全屏内容模式(`isContentFull`)
|
|
34
|
+
|
|
35
|
+
设置 `isContentFull={true}` 后,左右面板不再渲染,内容区占满整个对话框宽度(左右各留 40px 内边距)。适用于不需要侧边栏的全屏展示场景。
|
|
36
|
+
|
|
37
|
+
## 基础用法
|
|
38
|
+
|
|
39
|
+
```tsx
|
|
40
|
+
import React from "react";
|
|
41
|
+
import { ImmersiveDialog, Button } from "@cloudtower/eagle";
|
|
42
|
+
import { usePushModal, usePopModal } from "@cloudtower/eagle";
|
|
43
|
+
|
|
44
|
+
const NetworkConfigDialog: React.FC = () => {
|
|
45
|
+
const popModal = usePopModal();
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<ImmersiveDialog
|
|
49
|
+
title="网络配置"
|
|
50
|
+
left={<div>导航菜单</div>}
|
|
51
|
+
right={<div>帮助信息</div>}
|
|
52
|
+
onOk={() => {
|
|
53
|
+
console.log("确认保存");
|
|
54
|
+
popModal();
|
|
55
|
+
}}
|
|
56
|
+
>
|
|
57
|
+
<p>这里是网络配置的主体内容。</p>
|
|
58
|
+
</ImmersiveDialog>
|
|
59
|
+
);
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// 使用方式
|
|
63
|
+
const App = () => {
|
|
64
|
+
const pushModal = usePushModal();
|
|
65
|
+
|
|
66
|
+
return (
|
|
67
|
+
<Button
|
|
68
|
+
type="primary"
|
|
69
|
+
onClick={() =>
|
|
70
|
+
pushModal({
|
|
71
|
+
component: () => <NetworkConfigDialog />,
|
|
72
|
+
props: { name: "NetworkConfigDialog" },
|
|
73
|
+
})
|
|
74
|
+
}
|
|
75
|
+
>
|
|
76
|
+
网络配置
|
|
77
|
+
</Button>
|
|
78
|
+
);
|
|
79
|
+
};
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
> **注意**:ImmersiveDialog 的 `onOk` 签名是 `(e: React.MouseEvent) => void`,不会自动关闭弹窗。必须通过 `usePopModal()` 获取 `popModal` 函数手动关闭,这一点与 SmallDialog / MediumDialog 的 `(popModal: () => void) => void` 签名不同。
|
|
83
|
+
|
|
84
|
+
## 常见模式
|
|
85
|
+
|
|
86
|
+
### 模式一:三栏布局
|
|
87
|
+
|
|
88
|
+
适用于需要导航、内容和辅助信息同时展示的场景。左右面板固定定位,中间内容区可滚动。
|
|
89
|
+
|
|
90
|
+
```tsx
|
|
91
|
+
import React from "react";
|
|
92
|
+
import { ImmersiveDialog, Button } from "@cloudtower/eagle";
|
|
93
|
+
import { usePushModal, usePopModal } from "@cloudtower/eagle";
|
|
94
|
+
|
|
95
|
+
const ClusterConfigDialog: React.FC = () => {
|
|
96
|
+
const popModal = usePopModal();
|
|
97
|
+
|
|
98
|
+
return (
|
|
99
|
+
<ImmersiveDialog
|
|
100
|
+
title="集群配置"
|
|
101
|
+
left={
|
|
102
|
+
<ul>
|
|
103
|
+
<li>基本信息</li>
|
|
104
|
+
<li>网络设置</li>
|
|
105
|
+
<li>存储配置</li>
|
|
106
|
+
<li>高可用</li>
|
|
107
|
+
</ul>
|
|
108
|
+
}
|
|
109
|
+
right={
|
|
110
|
+
<div>
|
|
111
|
+
<h4>帮助</h4>
|
|
112
|
+
<p>集群配置说明文档...</p>
|
|
113
|
+
</div>
|
|
114
|
+
}
|
|
115
|
+
onOk={() => {
|
|
116
|
+
console.log("保存配置");
|
|
117
|
+
popModal();
|
|
118
|
+
}}
|
|
119
|
+
>
|
|
120
|
+
<div>
|
|
121
|
+
<h3>基本信息</h3>
|
|
122
|
+
<p>集群名称、描述等配置项...</p>
|
|
123
|
+
</div>
|
|
124
|
+
</ImmersiveDialog>
|
|
125
|
+
);
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const App = () => {
|
|
129
|
+
const pushModal = usePushModal();
|
|
130
|
+
|
|
131
|
+
return (
|
|
132
|
+
<Button
|
|
133
|
+
type="primary"
|
|
134
|
+
onClick={() =>
|
|
135
|
+
pushModal({
|
|
136
|
+
component: () => <ClusterConfigDialog />,
|
|
137
|
+
props: { name: "ClusterConfigDialog" },
|
|
138
|
+
})
|
|
139
|
+
}
|
|
140
|
+
>
|
|
141
|
+
集群配置
|
|
142
|
+
</Button>
|
|
143
|
+
);
|
|
144
|
+
};
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 模式二:全屏内容(isContentFull)
|
|
148
|
+
|
|
149
|
+
适用于不需要侧边栏的全屏展示场景,如查看大量数据、展示图表等。
|
|
150
|
+
|
|
151
|
+
```tsx
|
|
152
|
+
import React from "react";
|
|
153
|
+
import { ImmersiveDialog, Button } from "@cloudtower/eagle";
|
|
154
|
+
import { usePushModal, usePopModal } from "@cloudtower/eagle";
|
|
155
|
+
|
|
156
|
+
const MonitorDashboardDialog: React.FC = () => {
|
|
157
|
+
const popModal = usePopModal();
|
|
158
|
+
|
|
159
|
+
return (
|
|
160
|
+
<ImmersiveDialog
|
|
161
|
+
title="监控面板"
|
|
162
|
+
isContentFull
|
|
163
|
+
showOk={false}
|
|
164
|
+
cancelText="关闭"
|
|
165
|
+
onCancel={() => {
|
|
166
|
+
popModal();
|
|
167
|
+
}}
|
|
168
|
+
>
|
|
169
|
+
<div>
|
|
170
|
+
<h3>CPU 使用率</h3>
|
|
171
|
+
<p>图表内容...</p>
|
|
172
|
+
<h3>内存使用率</h3>
|
|
173
|
+
<p>图表内容...</p>
|
|
174
|
+
</div>
|
|
175
|
+
</ImmersiveDialog>
|
|
176
|
+
);
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
const App = () => {
|
|
180
|
+
const pushModal = usePushModal();
|
|
181
|
+
|
|
182
|
+
return (
|
|
183
|
+
<Button
|
|
184
|
+
onClick={() =>
|
|
185
|
+
pushModal({
|
|
186
|
+
component: () => <MonitorDashboardDialog />,
|
|
187
|
+
props: { name: "MonitorDashboardDialog" },
|
|
188
|
+
})
|
|
189
|
+
}
|
|
190
|
+
>
|
|
191
|
+
查看监控
|
|
192
|
+
</Button>
|
|
193
|
+
);
|
|
194
|
+
};
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### 模式三:带 footerLeftAction 的对话框
|
|
198
|
+
|
|
199
|
+
适用于需要在 footer 左侧放置额外操作(如"重置"按钮、提示文案)的场景。
|
|
200
|
+
|
|
201
|
+
```tsx
|
|
202
|
+
import React, { useState } from "react";
|
|
203
|
+
import { ImmersiveDialog, Button } from "@cloudtower/eagle";
|
|
204
|
+
import { usePushModal, usePopModal } from "@cloudtower/eagle";
|
|
205
|
+
|
|
206
|
+
const AdvancedSettingsDialog: React.FC = () => {
|
|
207
|
+
const popModal = usePopModal();
|
|
208
|
+
const [loading, setLoading] = useState(false);
|
|
209
|
+
const [error, setError] = useState<string>();
|
|
210
|
+
|
|
211
|
+
return (
|
|
212
|
+
<ImmersiveDialog
|
|
213
|
+
title="高级设置"
|
|
214
|
+
isContentFull
|
|
215
|
+
confirmLoading={loading}
|
|
216
|
+
error={error}
|
|
217
|
+
footerLeftAction={
|
|
218
|
+
<Button type="quiet" onClick={() => console.log("重置为默认值")}>
|
|
219
|
+
重置为默认值
|
|
220
|
+
</Button>
|
|
221
|
+
}
|
|
222
|
+
onOk={async () => {
|
|
223
|
+
setLoading(true);
|
|
224
|
+
setError(undefined);
|
|
225
|
+
try {
|
|
226
|
+
await saveSettings();
|
|
227
|
+
popModal();
|
|
228
|
+
} catch (e) {
|
|
229
|
+
setError("保存设置失败,请重试");
|
|
230
|
+
} finally {
|
|
231
|
+
setLoading(false);
|
|
232
|
+
}
|
|
233
|
+
}}
|
|
234
|
+
>
|
|
235
|
+
<div>
|
|
236
|
+
<h3>高级配置项</h3>
|
|
237
|
+
<p>配置内容...</p>
|
|
238
|
+
</div>
|
|
239
|
+
</ImmersiveDialog>
|
|
240
|
+
);
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
const App = () => {
|
|
244
|
+
const pushModal = usePushModal();
|
|
245
|
+
|
|
246
|
+
return (
|
|
247
|
+
<Button
|
|
248
|
+
type="primary"
|
|
249
|
+
onClick={() =>
|
|
250
|
+
pushModal({
|
|
251
|
+
component: () => <AdvancedSettingsDialog />,
|
|
252
|
+
props: { name: "AdvancedSettingsDialog" },
|
|
253
|
+
})
|
|
254
|
+
}
|
|
255
|
+
>
|
|
256
|
+
高级设置
|
|
257
|
+
</Button>
|
|
258
|
+
);
|
|
259
|
+
};
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
## 关键警告
|
|
263
|
+
|
|
264
|
+
ImmersiveDialog 的 `onOk` 签名是 `(e: React.MouseEvent) => void`,与 SmallDialog / MediumDialog 的 `(popModal: () => void) => void` **不同**。
|
|
265
|
+
|
|
266
|
+
- SmallDialog / MediumDialog:`onOk` 回调的第一个参数就是 `popModal` 函数,可以直接调用来关闭弹窗。
|
|
267
|
+
- ImmersiveDialog:`onOk` 回调的参数是原生的鼠标事件对象,**不会自动关闭弹窗**。必须在组件内部通过 `usePopModal()` hook 获取 `popModal` 函数,手动调用来关闭弹窗。
|
|
268
|
+
|
|
269
|
+
```tsx
|
|
270
|
+
// SmallDialog -- onOk 的参数就是 popModal
|
|
271
|
+
<SmallDialog
|
|
272
|
+
onOk={(popModal) => {
|
|
273
|
+
popModal(); // 直接通过参数关闭
|
|
274
|
+
}}
|
|
275
|
+
/>
|
|
276
|
+
|
|
277
|
+
// ImmersiveDialog -- 需要 usePopModal() hook
|
|
278
|
+
const MyDialog = () => {
|
|
279
|
+
const popModal = usePopModal(); // 必须通过 hook 获取
|
|
280
|
+
|
|
281
|
+
return (
|
|
282
|
+
<ImmersiveDialog
|
|
283
|
+
onOk={(e) => {
|
|
284
|
+
// e 是 React.MouseEvent,不是 popModal
|
|
285
|
+
popModal(); // 通过 hook 返回的函数关闭
|
|
286
|
+
}}
|
|
287
|
+
/>
|
|
288
|
+
);
|
|
289
|
+
};
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
## 相关组件
|
|
293
|
+
|
|
294
|
+
- `SmallDialog` -- 小型对话框(492px),适用于简单确认和信息提示场景
|
|
295
|
+
- `MediumDialog` -- 中等尺寸对话框(720px),适用于包含表单输入的场景
|
|
296
|
+
- `WizardDialog` -- 向导式对话框,适用于多步骤流程
|
|
297
|
+
- `DeleteDialog` -- 删除确认对话框,封装了删除场景的标准样式和交互(位于 `@cloudtower/eagle` 的 coreX 模块)
|
|
298
|
+
- `RejectDialog` -- 操作拒绝反馈对话框,支持 Single(单条拒绝)、All(全部拒绝)、Part(部分拒绝)、Custom(自定义内容)四种模式(位于 `@cloudtower/eagle` 的 coreX 模块)
|