@ticatec/uniface-element 0.2.0 → 0.2.2

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.
Files changed (209) hide show
  1. package/README.md +320 -1
  2. package/README_CN.md +392 -0
  3. package/dist/accordion/Accordion.svelte +1 -1
  4. package/dist/action-bar/ActionBar.svelte +7 -1
  5. package/dist/attachment-files/FileRender.svelte +1 -1
  6. package/dist/attachment-files/FileUploadBar.svelte +7 -6
  7. package/dist/attachment-files/FileUploadPanel.svelte +2 -2
  8. package/dist/base-calendar/DateContext.js +5 -4
  9. package/dist/base-calendar/YearPickupPanel.svelte +4 -4
  10. package/dist/card/Card.svelte +1 -1
  11. package/dist/card/Card.svelte.d.ts +1 -1
  12. package/dist/cascade-options-select/CascadeOptionSelect.svelte +2 -3
  13. package/dist/cascade-options-select/CascadeOptionSelect.svelte.d.ts +46 -1
  14. package/dist/cascade-options-select/CascadePanel.svelte +1 -1
  15. package/dist/checkbox/CheckBox.svelte +1 -1
  16. package/dist/color-picker/ColorPicker.svelte +9 -9
  17. package/dist/color-picker/ColorPicker.svelte.d.ts +0 -2
  18. package/dist/color-picker/ColorPickerPanel.svelte +11 -15
  19. package/dist/color-picker/ColorPickerPanel.svelte.d.ts +1 -1
  20. package/dist/common/CommonPicker.svelte +2 -2
  21. package/dist/common/CommonPicker.svelte.d.ts +1 -1
  22. package/dist/common/MouseClickHandler.d.ts +1 -1
  23. package/dist/common/Popover.svelte +28 -6
  24. package/dist/common/Popover.svelte.d.ts +9 -3
  25. package/dist/common/uniface-utils.js +6 -4
  26. package/dist/common-editor/CommonEditor.svelte +1 -1
  27. package/dist/common-editor/CommonEditor.svelte.d.ts +1 -1
  28. package/dist/common-editor/NumberInput.svelte +1 -1
  29. package/dist/common-editor/NumberInput.svelte.d.ts +1 -1
  30. package/dist/concise-data-table/ConciseListTable.svelte +7 -2
  31. package/dist/concise-data-table/ConciseListTable.svelte.d.ts +1 -0
  32. package/dist/concise-data-table/DataRow.svelte +1 -1
  33. package/dist/concise-data-table/TableOptions.d.ts +1 -1
  34. package/dist/data-table/DataTable.svelte +1 -1
  35. package/dist/data-table/parts/ActionsPanel.svelte +4 -3
  36. package/dist/data-table/parts/ActionsRow.svelte +3 -3
  37. package/dist/data-table/parts/ContentPanel.svelte +3 -2
  38. package/dist/data-table/parts/FixedColumnsPanel.svelte +0 -1
  39. package/dist/data-table/parts/FixedColumnsPanel.svelte.d.ts +1 -2
  40. package/dist/data-table/parts/FixedHeaderPanel.svelte +2 -2
  41. package/dist/data-table/parts/FixedRow.svelte +2 -1
  42. package/dist/data-table/parts/FixedRow.svelte.d.ts +1 -1
  43. package/dist/data-table/parts/HrefCell.svelte +23 -2
  44. package/dist/data-table/parts/PopupMenu.svelte +25 -2
  45. package/dist/data-table/parts/PopupMenu.svelte.d.ts +8 -1
  46. package/dist/date-picker/DatePicker.svelte +0 -1
  47. package/dist/date-picker/DateTimePicker.svelte +3 -3
  48. package/dist/date-picker/ScrollBar.svelte +4 -7
  49. package/dist/date-range/DateRangeEditor.svelte +1 -1
  50. package/dist/dialog/CommonDialog.svelte +8 -5
  51. package/dist/dialog/CommonDialog.svelte.d.ts +2 -1
  52. package/dist/dialog/Dialog.svelte +37 -12
  53. package/dist/dialog/Dialog.svelte.d.ts +4 -3
  54. package/dist/dialog/DialogBoard.svelte +11 -8
  55. package/dist/dialog/DialogWrapper.svelte +10 -0
  56. package/dist/{common-editor/DateInput.svelte.d.ts → dialog/DialogWrapper.svelte.d.ts} +6 -13
  57. package/dist/dialog/Dialogs.js +1 -1
  58. package/dist/dialog/ModalResult.d.ts +5 -0
  59. package/dist/dialog/ModalResult.js +5 -0
  60. package/dist/drawer/Drawer.svelte +1 -1
  61. package/dist/form-field/FormField.svelte +2 -1
  62. package/dist/form-field/FormField.svelte.d.ts +1 -0
  63. package/dist/form-panel/flex-row-form/FormContainer.svelte +1 -1
  64. package/dist/form-panel/grid-form/EmptyCell.svelte +8 -7
  65. package/dist/form-panel/grid-form/EmptyCell.svelte.d.ts +2 -2
  66. package/dist/form-panel/grid-form/GridField.svelte +1 -1
  67. package/dist/i18nRes/i18nRes.d.ts +2 -0
  68. package/dist/i18nRes/i18nRes.js +44 -0
  69. package/dist/i18nRes/index.d.ts +2 -0
  70. package/dist/i18nRes/index.js +2 -0
  71. package/dist/image-files/ImageFilesField.svelte +1 -1
  72. package/dist/indicator/IndicatorBoard.svelte +1 -1
  73. package/dist/inline-cell-editor/InvalidEditor.svelte +1 -0
  74. package/dist/input-options-select/InputOptionsSelect.svelte +6 -6
  75. package/dist/input-options-select/InputOptionsSelect.svelte.d.ts +1 -1
  76. package/dist/layout/flex/FlexBlock.svelte +1 -1
  77. package/dist/lookup-editor/LookupEditor.svelte +1 -1
  78. package/dist/memo-editor/MemoEditor.svelte +2 -2
  79. package/dist/message-box/IMessageBox.d.ts +2 -4
  80. package/dist/message-box/IMessageBox.js +4 -6
  81. package/dist/message-box/MessageBoxBoard.svelte +1 -3
  82. package/dist/options-multi-select/OptionsMultiSelect.svelte +1 -1
  83. package/dist/prompts-text-editor/PromptsTextEditor.svelte +2 -2
  84. package/dist/prompts-text-editor/PromptsTextEditor.svelte.d.ts +1 -1
  85. package/dist/property-editor/PropertyEditor.svelte +3 -3
  86. package/dist/text-editor/PasswordEditor.svelte +1 -1
  87. package/dist/transfer/Transfer.svelte +17 -12
  88. package/dist/transfer/Transfer.svelte.d.ts +0 -1
  89. package/dist/unit-number-editor/UnitNumberEditor.svelte +2 -2
  90. package/docs/buttons/cn/ActionBar.md +459 -0
  91. package/docs/buttons/cn/Button.md +228 -0
  92. package/docs/buttons/cn/IconButton.md +294 -0
  93. package/docs/buttons/cn/README.md +600 -0
  94. package/docs/buttons/cn/TextButton.md +163 -0
  95. package/docs/buttons/en/ActionBar.md +459 -0
  96. package/docs/buttons/en/Button.md +228 -0
  97. package/docs/buttons/en/IconButton.md +294 -0
  98. package/docs/buttons/en/README.md +600 -0
  99. package/docs/buttons/en/TextButton.md +163 -0
  100. package/docs/containers/cn/accordion.md +622 -0
  101. package/docs/containers/cn/box.md +445 -0
  102. package/docs/containers/cn/card.md +404 -0
  103. package/docs/containers/cn/page.md +576 -0
  104. package/docs/containers/cn/tabs.md +686 -0
  105. package/docs/containers/en/accordion.md +622 -0
  106. package/docs/containers/en/box.md +445 -0
  107. package/docs/containers/en/card.md +404 -0
  108. package/docs/containers/en/page.md +576 -0
  109. package/docs/containers/en/tabs.md +686 -0
  110. package/docs/data-display/cn/concise-data-table.md +731 -0
  111. package/docs/data-display/cn/listbox.md +786 -0
  112. package/docs/data-display/cn/treeview.md +863 -0
  113. package/docs/data-display/en/concise-data-table.md +732 -0
  114. package/docs/data-display/en/listbox.md +786 -0
  115. package/docs/data-display/en/treeview.md +863 -0
  116. package/docs/data-table/cn/README.md +596 -0
  117. package/docs/data-table/en/README.md +596 -0
  118. package/docs/dialog/cn/README.md +767 -0
  119. package/docs/dialog/en/README.md +767 -0
  120. package/docs/form/cn/README.md +847 -0
  121. package/docs/form/en/README.md +847 -0
  122. package/docs/form-components/cn/README.md +495 -0
  123. package/docs/form-components/cn/attachmentfilesfield.md +757 -0
  124. package/docs/form-components/cn/cascade-options-select.md +374 -0
  125. package/docs/form-components/cn/checkbox.md +58 -0
  126. package/docs/form-components/cn/date-picker.md +138 -0
  127. package/docs/form-components/cn/datetime-picker.md +228 -0
  128. package/docs/form-components/cn/group-checkbox.md +405 -0
  129. package/docs/form-components/cn/group-radiobox.md +525 -0
  130. package/docs/form-components/cn/imagefilesfield.md +651 -0
  131. package/docs/form-components/cn/input-options-select.md +250 -0
  132. package/docs/form-components/cn/lookup-editor.md +406 -0
  133. package/docs/form-components/cn/memoeditor.md +409 -0
  134. package/docs/form-components/cn/number-editor.md +261 -0
  135. package/docs/form-components/cn/options-multi-select.md +177 -0
  136. package/docs/form-components/cn/options-select.md +83 -0
  137. package/docs/form-components/cn/passwordeditor.md +538 -0
  138. package/docs/form-components/cn/prompts-text-editor.md +241 -0
  139. package/docs/form-components/cn/radiobutton.md +84 -0
  140. package/docs/form-components/cn/switch.md +178 -0
  141. package/docs/form-components/cn/text-editor.md +142 -0
  142. package/docs/form-components/cn/time-editor.md +159 -0
  143. package/docs/form-components/cn/unit-number-editor.md +164 -0
  144. package/docs/form-components/en/README.md +463 -0
  145. package/docs/form-components/en/attachmentfilesfield.md +757 -0
  146. package/docs/form-components/en/cascade-options-select.md +358 -0
  147. package/docs/form-components/en/checkbox.md +59 -0
  148. package/docs/form-components/en/date-picker.md +138 -0
  149. package/docs/form-components/en/datetime-picker.md +228 -0
  150. package/docs/form-components/en/group-checkbox.md +395 -0
  151. package/docs/form-components/en/group-radiobox.md +498 -0
  152. package/docs/form-components/en/imagefilesfield.md +651 -0
  153. package/docs/form-components/en/input-options-select.md +239 -0
  154. package/docs/form-components/en/lookup-editor.md +389 -0
  155. package/docs/form-components/en/memoeditor.md +409 -0
  156. package/docs/form-components/en/number-editor.md +249 -0
  157. package/docs/form-components/en/options-multi-select.md +177 -0
  158. package/docs/form-components/en/options-select.md +83 -0
  159. package/docs/form-components/en/passwordeditor.md +538 -0
  160. package/docs/form-components/en/prompts-text-editor.md +241 -0
  161. package/docs/form-components/en/radiobutton.md +84 -0
  162. package/docs/form-components/en/switch.md +180 -0
  163. package/docs/form-components/en/text-editor.md +142 -0
  164. package/docs/form-components/en/time-editor.md +159 -0
  165. package/docs/form-components/en/unit-number-editor.md +164 -0
  166. package/docs/form-layout/cn/criteria-field.md +652 -0
  167. package/docs/form-layout/cn/flex-form.md +454 -0
  168. package/docs/form-layout/cn/flex-row-form.md +542 -0
  169. package/docs/form-layout/cn/form-field.md +923 -0
  170. package/docs/form-layout/cn/grid-form.md +676 -0
  171. package/docs/form-layout/en/criteria-field.md +652 -0
  172. package/docs/form-layout/en/flex-form.md +454 -0
  173. package/docs/form-layout/en/flex-row-form.md +542 -0
  174. package/docs/form-layout/en/form-field.md +923 -0
  175. package/docs/form-layout/en/grid-form.md +676 -0
  176. package/docs/global/cn/README.md +534 -0
  177. package/docs/global/en/README.md +534 -0
  178. package/docs/layout/cn/classiclayout.md +460 -0
  179. package/docs/layout/cn/headerlayout.md +524 -0
  180. package/docs/layout/cn/sidebarlayout.md +263 -0
  181. package/docs/layout/en/classiclayout.md +951 -0
  182. package/docs/layout/en/headerlayout.md +524 -0
  183. package/docs/layout/en/sidebarlayout.md +262 -0
  184. package/docs/misc/cn/README.md +1217 -0
  185. package/docs/misc/en/README.md +1217 -0
  186. package/docs/navigation/cn/breadcrumb.md +291 -0
  187. package/docs/navigation/cn/navigator.md +322 -0
  188. package/docs/navigation/cn/navigatormenu.md +512 -0
  189. package/docs/navigation/cn/progressbar.md +199 -0
  190. package/docs/navigation/cn/progressstepbar.md +299 -0
  191. package/docs/navigation/en/breadcrumb.md +291 -0
  192. package/docs/navigation/en/navigator.md +322 -0
  193. package/docs/navigation/en/navigatormenu.md +512 -0
  194. package/docs/navigation/en/progressbar.md +199 -0
  195. package/docs/navigation/en/progressstepbar.md +299 -0
  196. package/docs/search-filters/cn/daterange.md +1156 -0
  197. package/docs/search-filters/cn/numberrange.md +688 -0
  198. package/docs/search-filters/cn/searchbox.md +1582 -0
  199. package/docs/search-filters/en/daterange.md +1156 -0
  200. package/docs/search-filters/en/numberrange.md +688 -0
  201. package/docs/search-filters/en/searchbox.md +1582 -0
  202. package/package.json +53 -13
  203. package/dist/common-editor/DateInput.svelte +0 -27
  204. package/dist/i18n_resources/index.d.ts +0 -3
  205. package/dist/i18n_resources/index.js +0 -3
  206. /package/dist/{i18n_resources → i18nRes}/uniface_cn_resource.d.ts +0 -0
  207. /package/dist/{i18n_resources → i18nRes}/uniface_cn_resource.js +0 -0
  208. /package/dist/{i18n_resources → i18nRes}/uniface_en_resource.d.ts +0 -0
  209. /package/dist/{i18n_resources → i18nRes}/uniface_en_resource.js +0 -0
@@ -0,0 +1,534 @@
1
+ # 全局组件
2
+
3
+ 全局组件直接挂载到 document.body 上,可以通过全局方法访问,无需在每个组件中单独导入。这些组件为整个应用程序提供用户反馈和模态交互功能。
4
+
5
+ ## 目录
6
+
7
+ - [设置](#设置)
8
+ - [ToastBoard 消息提示](#toastboard-消息提示)
9
+ - [DialogBoard 对话框](#dialogboard-对话框)
10
+ - [IndicatorBoard 加载指示器](#indicatorboard-加载指示器)
11
+ - [MessageBoxBoard 消息框](#messageboxboard-消息框)
12
+ - [TypeScript 类型声明](#typescript-类型声明)
13
+ - [最佳实践](#最佳实践)
14
+
15
+ ## 设置
16
+
17
+ 要使用全局组件,需要在主应用程序布局中包含它们,通常在根 `+layout.svelte` 或 `app.html` 中:
18
+
19
+ ```svelte
20
+ <script lang="ts">
21
+ import { ToastBoard } from "@ticatec/uniface-element/ToastBoard";
22
+ import { DialogBoard } from "@ticatec/uniface-element/DialogBoard";
23
+ import { IndicatorBoard } from "@ticatec/uniface-element/IndicatorBoard";
24
+ import { MessageBoxBoard } from "@ticatec/uniface-element/MessageBoxBoard";
25
+ </script>
26
+
27
+ <!-- 主应用程序内容 -->
28
+ <main>
29
+ <slot />
30
+ </main>
31
+
32
+ <!-- 全局组件 - 这些将被挂载到 document.body -->
33
+ <ToastBoard />
34
+ <DialogBoard />
35
+ <IndicatorBoard />
36
+ <MessageBoxBoard />
37
+ ```
38
+
39
+ 一旦挂载,这些组件会将自己注册到全局 `window` 对象,可以在应用程序的任何地方访问。
40
+
41
+ ## ToastBoard 消息提示
42
+
43
+ `ToastBoard` 组件提供非阻塞的用户反馈通知,如成功消息、错误或信息提示。
44
+
45
+ ### 特性
46
+
47
+ - **多种类型**:支持 `error`、`info` 和 `success` 消息类型
48
+ - **自动消失**:可配置的持续时间和自动消失
49
+ - **流畅动画**:滑入/滑出过渡效果,可自定义方向
50
+ - **队列管理**:优雅地处理多个消息提示
51
+
52
+ ### 用法
53
+
54
+ ```typescript
55
+ // 基础用法 - 显示错误消息 3 秒(默认)
56
+ window.Toast.show("操作失败");
57
+
58
+ // 指定消息类型和持续时间
59
+ window.Toast.show("用户创建成功", "success", 2);
60
+ window.Toast.show("正在处理您的请求...", "info", 5);
61
+ window.Toast.show("输入数据无效", "error", 4);
62
+ ```
63
+
64
+ ### API 参考
65
+
66
+ ```typescript
67
+ interface Toast {
68
+ show: (message: string, type?: "error" | "info" | "success", duration?: number) => void;
69
+ }
70
+ ```
71
+
72
+ #### 参数
73
+
74
+ - **message** (`string`): 在提示中显示的文本
75
+ - **type** (`"error" | "info" | "success"`, 可选): 提示的视觉样式
76
+ - `"error"` (默认): 红色样式,用于错误消息
77
+ - `"info"`: 蓝色样式,用于信息消息
78
+ - `"success"`: 绿色样式,用于成功消息
79
+ - **duration** (`number`, 可选): 显示持续时间,单位秒(默认: 3)
80
+
81
+ ### 属性
82
+
83
+ ```svelte
84
+ <ToastBoard fromBottom={false} />
85
+ ```
86
+
87
+ - **fromBottom** (`boolean`, 可选): 提示是否从底部滑入(默认: `false` - 从顶部滑入)
88
+
89
+ ### 示例
90
+
91
+ ```typescript
92
+ // 常见用例
93
+ try {
94
+ await api.createUser(userData);
95
+ window.Toast.show("用户创建成功!", "success");
96
+ } catch (error) {
97
+ window.Toast.show("创建用户失败:" + error.message, "error");
98
+ }
99
+
100
+ // 长时间运行的操作
101
+ window.Toast.show("正在上传文件... 请稍候", "info", 10);
102
+
103
+ // 表单验证反馈
104
+ if (!email.includes('@')) {
105
+ window.Toast.show("请输入有效的邮箱地址", "error");
106
+ }
107
+
108
+ // 成功确认
109
+ window.Toast.show("设置保存成功", "success", 2);
110
+ ```
111
+
112
+ ## DialogBoard 对话框
113
+
114
+ `DialogBoard` 组件全局管理模态对话框,允许您从应用程序的任何地方将任何 Svelte 组件作为模态对话框打开。
115
+
116
+ ### 特性
117
+
118
+ - **通用模态系统**:将任何 Svelte 组件作为模态打开
119
+ - **全局访问**:通过 `window.Dialog` API 可用
120
+ - **属性传递**:向模态组件传递属性
121
+ - **上下文集成**:通过上下文提供关闭函数
122
+
123
+ ### 用法
124
+
125
+ ```typescript
126
+ // 将组件作为模态打开
127
+ window.Dialog.showModal(MyDialogComponent, {
128
+ title: "编辑用户",
129
+ user: userData,
130
+ onSave: (result) => {
131
+ console.log("用户已保存:", result);
132
+ }
133
+ });
134
+ ```
135
+
136
+ ### API 参考
137
+
138
+ ```typescript
139
+ interface IDialog {
140
+ showModal<T>(component: any, props?: T): void;
141
+ }
142
+ ```
143
+
144
+ ### 示例
145
+
146
+ ```typescript
147
+ // 打开用户编辑对话框
148
+ window.Dialog.showModal(UserEditDialog, {
149
+ user: selectedUser,
150
+ onSave: async (updatedUser) => {
151
+ await updateUser(updatedUser);
152
+ window.Toast.show("用户更新成功", "success");
153
+ }
154
+ });
155
+
156
+ // 打开确认对话框
157
+ window.Dialog.showModal(ConfirmDialog, {
158
+ title: "删除项目",
159
+ message: "您确定要删除此项目吗?",
160
+ onConfirm: () => {
161
+ deleteItem(itemId);
162
+ }
163
+ });
164
+
165
+ // 打开复杂表单对话框
166
+ window.Dialog.showModal(ProductFormDialog, {
167
+ product: product,
168
+ categories: availableCategories,
169
+ onSubmit: async (productData) => {
170
+ try {
171
+ await saveProduct(productData);
172
+ window.Toast.show("产品保存成功!", "success");
173
+ } catch (error) {
174
+ window.Toast.show("保存失败:" + error.message, "error");
175
+ }
176
+ }
177
+ });
178
+ ```
179
+
180
+ ## IndicatorBoard 加载指示器
181
+
182
+ `IndicatorBoard` 组件提供全屏加载覆盖层,在异步操作期间阻止用户交互。
183
+
184
+ ### 特性
185
+
186
+ - **全屏覆盖**:阻止整个应用程序界面
187
+ - **自定义消息**:向用户显示操作状态
188
+ - **自动管理**:基于异步操作生命周期显示/隐藏
189
+ - **防止用户操作**:确保操作期间的数据完整性
190
+
191
+ ### 用法
192
+
193
+ ```typescript
194
+ // 基础加载指示器
195
+ try {
196
+ window.Indicator.show("正在加载数据...");
197
+ const data = await api.fetchData();
198
+ // 处理数据
199
+ } finally {
200
+ window.Indicator.hide();
201
+ }
202
+
203
+ // 多个操作带状态更新
204
+ window.Indicator.show("初始化中...");
205
+ await initializeApp();
206
+
207
+ window.Indicator.show("正在加载用户数据...");
208
+ await loadUserData();
209
+
210
+ window.Indicator.show("设置工作区...");
211
+ await setupWorkspace();
212
+
213
+ window.Indicator.hide();
214
+ ```
215
+
216
+ ### API 参考
217
+
218
+ ```typescript
219
+ interface Indicator {
220
+ show: (message: string) => void;
221
+ hide: () => void;
222
+ }
223
+ ```
224
+
225
+ ### 示例
226
+
227
+ ```typescript
228
+ // 文件上传带进度指示
229
+ const uploadFile = async (file) => {
230
+ try {
231
+ window.Indicator.show("正在上传文件...");
232
+ const result = await api.uploadFile(file);
233
+ window.Toast.show("文件上传成功", "success");
234
+ return result;
235
+ } catch (error) {
236
+ window.Toast.show("上传失败:" + error.message, "error");
237
+ throw error;
238
+ } finally {
239
+ window.Indicator.hide();
240
+ }
241
+ };
242
+
243
+ // 数据处理工作流
244
+ const processData = async (data) => {
245
+ try {
246
+ window.Indicator.show("验证数据中...");
247
+ await validateData(data);
248
+
249
+ window.Indicator.show("处理记录中...");
250
+ const processed = await processRecords(data);
251
+
252
+ window.Indicator.show("保存结果中...");
253
+ await saveResults(processed);
254
+
255
+ window.Toast.show("数据处理成功", "success");
256
+ } catch (error) {
257
+ window.Toast.show("处理失败:" + error.message, "error");
258
+ } finally {
259
+ window.Indicator.hide();
260
+ }
261
+ };
262
+
263
+ // 带自动清理的异步操作
264
+ const performAction = async () => {
265
+ const cleanup = () => window.Indicator.hide();
266
+
267
+ try {
268
+ window.Indicator.show("执行操作中...");
269
+ await someAsyncOperation();
270
+
271
+ // 确保即使操作抛出异常也隐藏指示器
272
+ cleanup();
273
+
274
+ window.Toast.show("操作完成", "success");
275
+ } catch (error) {
276
+ cleanup();
277
+ window.Toast.show("操作失败", "error");
278
+ throw error;
279
+ }
280
+ };
281
+ ```
282
+
283
+ ## MessageBoxBoard 消息框
284
+
285
+ `MessageBoxBoard` 组件提供模态确认对话框和消息框,用于需要明确确认的用户交互。
286
+
287
+ ### 特性
288
+
289
+ - **确认对话框**:是/否、确定/取消交互
290
+ - **信息消息**:显示重要信息
291
+ - **基于 Promise**:支持异步/等待的对话框结果
292
+ - **模态结果类型**:标准对话框结果枚举
293
+
294
+ ### 用法
295
+
296
+ ```typescript
297
+ // 确认对话框
298
+ const result = await window.MessageBox.showConfirm("删除此项目?");
299
+ if (result === ModalResult.MR_OK) {
300
+ deleteItem();
301
+ }
302
+
303
+ // 信息消息
304
+ await window.MessageBox.showInfo("操作成功完成", "成功");
305
+ ```
306
+
307
+ ### API 参考
308
+
309
+ ```typescript
310
+ interface MessageBox {
311
+ showConfirm: (message: string, title?: string) => Promise<ModalResult>;
312
+ showInfo: (message: string, title?: string) => Promise<ModalResult>;
313
+ }
314
+
315
+ enum ModalResult {
316
+ MR_OK = 1,
317
+ MR_CANCEL = 2
318
+ }
319
+ ```
320
+
321
+ ### 示例
322
+
323
+ ```typescript
324
+ // 删除确认
325
+ const confirmDelete = async (itemName) => {
326
+ const result = await window.MessageBox.showConfirm(
327
+ `您确定要删除"${itemName}"吗?此操作无法撤销。`,
328
+ "确认删除"
329
+ );
330
+
331
+ if (result === ModalResult.MR_OK) {
332
+ try {
333
+ await deleteItem(itemName);
334
+ window.Toast.show("项目删除成功", "success");
335
+ } catch (error) {
336
+ window.Toast.show("删除项目失败", "error");
337
+ }
338
+ }
339
+ };
340
+
341
+ // 保存更改确认
342
+ const handlePageLeave = async () => {
343
+ if (hasUnsavedChanges) {
344
+ const result = await window.MessageBox.showConfirm(
345
+ "您有未保存的更改。确定要离开吗?",
346
+ "未保存的更改"
347
+ );
348
+
349
+ return result === ModalResult.MR_OK;
350
+ }
351
+
352
+ return true;
353
+ };
354
+
355
+ // 信息显示
356
+ const showWelcomeMessage = async () => {
357
+ await window.MessageBox.showInfo(
358
+ "欢迎使用应用程序!请花点时间查看入门指南。",
359
+ "欢迎"
360
+ );
361
+ };
362
+
363
+ // 错误处理带确认
364
+ const handleCriticalError = async (error) => {
365
+ const result = await window.MessageBox.showConfirm(
366
+ `发生严重错误:${error.message}\n\n您要重新加载应用程序吗?`,
367
+ "严重错误"
368
+ );
369
+
370
+ if (result === ModalResult.MR_OK) {
371
+ window.location.reload();
372
+ }
373
+ };
374
+
375
+ // 批量操作确认
376
+ const processBatchOperation = async (items) => {
377
+ const result = await window.MessageBox.showConfirm(
378
+ `这将处理 ${items.length} 个项目,可能需要几分钟时间。继续吗?`,
379
+ "批量处理"
380
+ );
381
+
382
+ if (result === ModalResult.MR_OK) {
383
+ try {
384
+ window.Indicator.show("处理项目中...");
385
+ await processBatch(items);
386
+ window.Toast.show(`成功处理 ${items.length} 个项目`, "success");
387
+ } catch (error) {
388
+ window.Toast.show("批量处理失败", "error");
389
+ } finally {
390
+ window.Indicator.hide();
391
+ }
392
+ }
393
+ };
394
+ ```
395
+
396
+ ## TypeScript 类型声明
397
+
398
+ 将这些类型声明添加到您的 `src/app.d.ts` 或全局类型定义文件中:
399
+
400
+ ```typescript
401
+ import type {
402
+ IDialog,
403
+ Toast,
404
+ Indicator,
405
+ MessageBox,
406
+ ModalResult
407
+ } from '@ticatec/uniface-element';
408
+
409
+ declare global {
410
+ interface Window {
411
+ Dialog: IDialog;
412
+ Toast: Toast;
413
+ Indicator: Indicator;
414
+ MessageBox: MessageBox;
415
+ }
416
+ }
417
+
418
+ // 为方便使用而重新导出
419
+ export { ModalResult };
420
+ ```
421
+
422
+ ## 最佳实践
423
+
424
+ ### 1. 适当的错误处理
425
+
426
+ ```typescript
427
+ // 总是在 Indicator 中使用 try-finally
428
+ const performOperation = async () => {
429
+ try {
430
+ window.Indicator.show("处理中...");
431
+ await operation();
432
+ window.Toast.show("操作完成", "success");
433
+ } catch (error) {
434
+ window.Toast.show("操作失败", "error");
435
+ throw error;
436
+ } finally {
437
+ window.Indicator.hide(); // 即使出错也要隐藏
438
+ }
439
+ };
440
+ ```
441
+
442
+ ### 2. 用户友好的消息
443
+
444
+ ```typescript
445
+ // 提供清晰、可操作的消息
446
+ window.Toast.show("用户创建成功", "success");
447
+ window.Toast.show("请填写所有必填字段", "error");
448
+ window.Toast.show("正在保存更改... 请稍候", "info", 5);
449
+
450
+ // 避免技术术语
451
+ // ❌ 错误: "HTTP 404 错误发生"
452
+ // ✅ 正确: "找不到请求的项目"
453
+ ```
454
+
455
+ ### 3. 适当的持续时间
456
+
457
+ ```typescript
458
+ // 短消息(1-3 秒)
459
+ window.Toast.show("已复制到剪贴板", "success", 2);
460
+
461
+ // 重要消息(3-5 秒)
462
+ window.Toast.show("您的密码已更新", "success", 4);
463
+
464
+ // 长操作(5+ 秒)
465
+ window.Toast.show("大文件上传进行中...", "info", 10);
466
+ ```
467
+
468
+ ### 4. 确认模式
469
+
470
+ ```typescript
471
+ // 关键操作应该始终确认
472
+ const deleteUser = async (user) => {
473
+ const result = await window.MessageBox.showConfirm(
474
+ `删除用户"${user.name}"?此操作无法撤销。`
475
+ );
476
+
477
+ if (result === ModalResult.MR_OK) {
478
+ // 执行删除
479
+ }
480
+ };
481
+
482
+ // 非关键操作可以使用提示反馈
483
+ const toggleUserStatus = async (user) => {
484
+ try {
485
+ await updateUserStatus(user.id, !user.active);
486
+ window.Toast.show(
487
+ `用户已${user.active ? '停用' : '启用'}`,
488
+ "success"
489
+ );
490
+ } catch (error) {
491
+ window.Toast.show("更新用户状态失败", "error");
492
+ }
493
+ };
494
+ ```
495
+
496
+ ### 5. 加载状态管理
497
+
498
+ ```typescript
499
+ // 对阻止UI的操作使用 Indicator
500
+ const saveDocument = async () => {
501
+ window.Indicator.show("保存文档中...");
502
+ try {
503
+ await api.saveDocument();
504
+ window.Toast.show("文档已保存", "success");
505
+ } finally {
506
+ window.Indicator.hide();
507
+ }
508
+ };
509
+
510
+ // 对后台操作使用 Toast
511
+ const autoSave = async () => {
512
+ try {
513
+ await api.autoSaveDocument();
514
+ window.Toast.show("自动保存", "info", 1);
515
+ } catch (error) {
516
+ window.Toast.show("自动保存失败", "error", 2);
517
+ }
518
+ };
519
+ ```
520
+
521
+ ## 无障碍访问注意事项
522
+
523
+ - 提示消息应该被屏幕阅读器读出
524
+ - 模态对话框应该捕获焦点并处理 Escape 键
525
+ - 为所有消息类型提供足够的颜色对比度
526
+ - 适当使用语义化 HTML 和 ARIA 标签
527
+ - 确保所有交互元素的键盘导航正常工作
528
+
529
+ ## 浏览器支持
530
+
531
+ - 需要支持 ES2020+ 的现代浏览器
532
+ - 布局需要 CSS Grid 和 Flexbox 支持
533
+ - 动态挂载需要 DOM 操作 API
534
+ - 异步对话框交互需要 Promise 支持