@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.
- package/README.md +320 -1
- package/README_CN.md +392 -0
- package/dist/accordion/Accordion.svelte +1 -1
- package/dist/action-bar/ActionBar.svelte +7 -1
- package/dist/attachment-files/FileRender.svelte +1 -1
- package/dist/attachment-files/FileUploadBar.svelte +7 -6
- package/dist/attachment-files/FileUploadPanel.svelte +2 -2
- package/dist/base-calendar/DateContext.js +5 -4
- package/dist/base-calendar/YearPickupPanel.svelte +4 -4
- package/dist/card/Card.svelte +1 -1
- package/dist/card/Card.svelte.d.ts +1 -1
- package/dist/cascade-options-select/CascadeOptionSelect.svelte +2 -3
- package/dist/cascade-options-select/CascadeOptionSelect.svelte.d.ts +46 -1
- package/dist/cascade-options-select/CascadePanel.svelte +1 -1
- package/dist/checkbox/CheckBox.svelte +1 -1
- package/dist/color-picker/ColorPicker.svelte +9 -9
- package/dist/color-picker/ColorPicker.svelte.d.ts +0 -2
- package/dist/color-picker/ColorPickerPanel.svelte +11 -15
- package/dist/color-picker/ColorPickerPanel.svelte.d.ts +1 -1
- package/dist/common/CommonPicker.svelte +2 -2
- package/dist/common/CommonPicker.svelte.d.ts +1 -1
- package/dist/common/MouseClickHandler.d.ts +1 -1
- package/dist/common/Popover.svelte +28 -6
- package/dist/common/Popover.svelte.d.ts +9 -3
- package/dist/common/uniface-utils.js +6 -4
- package/dist/common-editor/CommonEditor.svelte +1 -1
- package/dist/common-editor/CommonEditor.svelte.d.ts +1 -1
- package/dist/common-editor/NumberInput.svelte +1 -1
- package/dist/common-editor/NumberInput.svelte.d.ts +1 -1
- package/dist/concise-data-table/ConciseListTable.svelte +7 -2
- package/dist/concise-data-table/ConciseListTable.svelte.d.ts +1 -0
- package/dist/concise-data-table/DataRow.svelte +1 -1
- package/dist/concise-data-table/TableOptions.d.ts +1 -1
- package/dist/data-table/DataTable.svelte +1 -1
- package/dist/data-table/parts/ActionsPanel.svelte +4 -3
- package/dist/data-table/parts/ActionsRow.svelte +3 -3
- package/dist/data-table/parts/ContentPanel.svelte +3 -2
- package/dist/data-table/parts/FixedColumnsPanel.svelte +0 -1
- package/dist/data-table/parts/FixedColumnsPanel.svelte.d.ts +1 -2
- package/dist/data-table/parts/FixedHeaderPanel.svelte +2 -2
- package/dist/data-table/parts/FixedRow.svelte +2 -1
- package/dist/data-table/parts/FixedRow.svelte.d.ts +1 -1
- package/dist/data-table/parts/HrefCell.svelte +23 -2
- package/dist/data-table/parts/PopupMenu.svelte +25 -2
- package/dist/data-table/parts/PopupMenu.svelte.d.ts +8 -1
- package/dist/date-picker/DatePicker.svelte +0 -1
- package/dist/date-picker/DateTimePicker.svelte +3 -3
- package/dist/date-picker/ScrollBar.svelte +4 -7
- package/dist/date-range/DateRangeEditor.svelte +1 -1
- package/dist/dialog/CommonDialog.svelte +8 -5
- package/dist/dialog/CommonDialog.svelte.d.ts +2 -1
- package/dist/dialog/Dialog.svelte +37 -12
- package/dist/dialog/Dialog.svelte.d.ts +4 -3
- package/dist/dialog/DialogBoard.svelte +11 -8
- package/dist/dialog/DialogWrapper.svelte +10 -0
- package/dist/{common-editor/DateInput.svelte.d.ts → dialog/DialogWrapper.svelte.d.ts} +6 -13
- package/dist/dialog/Dialogs.js +1 -1
- package/dist/dialog/ModalResult.d.ts +5 -0
- package/dist/dialog/ModalResult.js +5 -0
- package/dist/drawer/Drawer.svelte +1 -1
- package/dist/form-field/FormField.svelte +2 -1
- package/dist/form-field/FormField.svelte.d.ts +1 -0
- package/dist/form-panel/flex-row-form/FormContainer.svelte +1 -1
- package/dist/form-panel/grid-form/EmptyCell.svelte +8 -7
- package/dist/form-panel/grid-form/EmptyCell.svelte.d.ts +2 -2
- package/dist/form-panel/grid-form/GridField.svelte +1 -1
- package/dist/i18nRes/i18nRes.d.ts +2 -0
- package/dist/i18nRes/i18nRes.js +44 -0
- package/dist/i18nRes/index.d.ts +2 -0
- package/dist/i18nRes/index.js +2 -0
- package/dist/image-files/ImageFilesField.svelte +1 -1
- package/dist/indicator/IndicatorBoard.svelte +1 -1
- package/dist/inline-cell-editor/InvalidEditor.svelte +1 -0
- package/dist/input-options-select/InputOptionsSelect.svelte +6 -6
- package/dist/input-options-select/InputOptionsSelect.svelte.d.ts +1 -1
- package/dist/layout/flex/FlexBlock.svelte +1 -1
- package/dist/lookup-editor/LookupEditor.svelte +1 -1
- package/dist/memo-editor/MemoEditor.svelte +2 -2
- package/dist/message-box/IMessageBox.d.ts +2 -4
- package/dist/message-box/IMessageBox.js +4 -6
- package/dist/message-box/MessageBoxBoard.svelte +1 -3
- package/dist/options-multi-select/OptionsMultiSelect.svelte +1 -1
- package/dist/prompts-text-editor/PromptsTextEditor.svelte +2 -2
- package/dist/prompts-text-editor/PromptsTextEditor.svelte.d.ts +1 -1
- package/dist/property-editor/PropertyEditor.svelte +3 -3
- package/dist/text-editor/PasswordEditor.svelte +1 -1
- package/dist/transfer/Transfer.svelte +17 -12
- package/dist/transfer/Transfer.svelte.d.ts +0 -1
- package/dist/unit-number-editor/UnitNumberEditor.svelte +2 -2
- package/docs/buttons/cn/ActionBar.md +459 -0
- package/docs/buttons/cn/Button.md +228 -0
- package/docs/buttons/cn/IconButton.md +294 -0
- package/docs/buttons/cn/README.md +600 -0
- package/docs/buttons/cn/TextButton.md +163 -0
- package/docs/buttons/en/ActionBar.md +459 -0
- package/docs/buttons/en/Button.md +228 -0
- package/docs/buttons/en/IconButton.md +294 -0
- package/docs/buttons/en/README.md +600 -0
- package/docs/buttons/en/TextButton.md +163 -0
- package/docs/containers/cn/accordion.md +622 -0
- package/docs/containers/cn/box.md +445 -0
- package/docs/containers/cn/card.md +404 -0
- package/docs/containers/cn/page.md +576 -0
- package/docs/containers/cn/tabs.md +686 -0
- package/docs/containers/en/accordion.md +622 -0
- package/docs/containers/en/box.md +445 -0
- package/docs/containers/en/card.md +404 -0
- package/docs/containers/en/page.md +576 -0
- package/docs/containers/en/tabs.md +686 -0
- package/docs/data-display/cn/concise-data-table.md +731 -0
- package/docs/data-display/cn/listbox.md +786 -0
- package/docs/data-display/cn/treeview.md +863 -0
- package/docs/data-display/en/concise-data-table.md +732 -0
- package/docs/data-display/en/listbox.md +786 -0
- package/docs/data-display/en/treeview.md +863 -0
- package/docs/data-table/cn/README.md +596 -0
- package/docs/data-table/en/README.md +596 -0
- package/docs/dialog/cn/README.md +767 -0
- package/docs/dialog/en/README.md +767 -0
- package/docs/form/cn/README.md +847 -0
- package/docs/form/en/README.md +847 -0
- package/docs/form-components/cn/README.md +495 -0
- package/docs/form-components/cn/attachmentfilesfield.md +757 -0
- package/docs/form-components/cn/cascade-options-select.md +374 -0
- package/docs/form-components/cn/checkbox.md +58 -0
- package/docs/form-components/cn/date-picker.md +138 -0
- package/docs/form-components/cn/datetime-picker.md +228 -0
- package/docs/form-components/cn/group-checkbox.md +405 -0
- package/docs/form-components/cn/group-radiobox.md +525 -0
- package/docs/form-components/cn/imagefilesfield.md +651 -0
- package/docs/form-components/cn/input-options-select.md +250 -0
- package/docs/form-components/cn/lookup-editor.md +406 -0
- package/docs/form-components/cn/memoeditor.md +409 -0
- package/docs/form-components/cn/number-editor.md +261 -0
- package/docs/form-components/cn/options-multi-select.md +177 -0
- package/docs/form-components/cn/options-select.md +83 -0
- package/docs/form-components/cn/passwordeditor.md +538 -0
- package/docs/form-components/cn/prompts-text-editor.md +241 -0
- package/docs/form-components/cn/radiobutton.md +84 -0
- package/docs/form-components/cn/switch.md +178 -0
- package/docs/form-components/cn/text-editor.md +142 -0
- package/docs/form-components/cn/time-editor.md +159 -0
- package/docs/form-components/cn/unit-number-editor.md +164 -0
- package/docs/form-components/en/README.md +463 -0
- package/docs/form-components/en/attachmentfilesfield.md +757 -0
- package/docs/form-components/en/cascade-options-select.md +358 -0
- package/docs/form-components/en/checkbox.md +59 -0
- package/docs/form-components/en/date-picker.md +138 -0
- package/docs/form-components/en/datetime-picker.md +228 -0
- package/docs/form-components/en/group-checkbox.md +395 -0
- package/docs/form-components/en/group-radiobox.md +498 -0
- package/docs/form-components/en/imagefilesfield.md +651 -0
- package/docs/form-components/en/input-options-select.md +239 -0
- package/docs/form-components/en/lookup-editor.md +389 -0
- package/docs/form-components/en/memoeditor.md +409 -0
- package/docs/form-components/en/number-editor.md +249 -0
- package/docs/form-components/en/options-multi-select.md +177 -0
- package/docs/form-components/en/options-select.md +83 -0
- package/docs/form-components/en/passwordeditor.md +538 -0
- package/docs/form-components/en/prompts-text-editor.md +241 -0
- package/docs/form-components/en/radiobutton.md +84 -0
- package/docs/form-components/en/switch.md +180 -0
- package/docs/form-components/en/text-editor.md +142 -0
- package/docs/form-components/en/time-editor.md +159 -0
- package/docs/form-components/en/unit-number-editor.md +164 -0
- package/docs/form-layout/cn/criteria-field.md +652 -0
- package/docs/form-layout/cn/flex-form.md +454 -0
- package/docs/form-layout/cn/flex-row-form.md +542 -0
- package/docs/form-layout/cn/form-field.md +923 -0
- package/docs/form-layout/cn/grid-form.md +676 -0
- package/docs/form-layout/en/criteria-field.md +652 -0
- package/docs/form-layout/en/flex-form.md +454 -0
- package/docs/form-layout/en/flex-row-form.md +542 -0
- package/docs/form-layout/en/form-field.md +923 -0
- package/docs/form-layout/en/grid-form.md +676 -0
- package/docs/global/cn/README.md +534 -0
- package/docs/global/en/README.md +534 -0
- package/docs/layout/cn/classiclayout.md +460 -0
- package/docs/layout/cn/headerlayout.md +524 -0
- package/docs/layout/cn/sidebarlayout.md +263 -0
- package/docs/layout/en/classiclayout.md +951 -0
- package/docs/layout/en/headerlayout.md +524 -0
- package/docs/layout/en/sidebarlayout.md +262 -0
- package/docs/misc/cn/README.md +1217 -0
- package/docs/misc/en/README.md +1217 -0
- package/docs/navigation/cn/breadcrumb.md +291 -0
- package/docs/navigation/cn/navigator.md +322 -0
- package/docs/navigation/cn/navigatormenu.md +512 -0
- package/docs/navigation/cn/progressbar.md +199 -0
- package/docs/navigation/cn/progressstepbar.md +299 -0
- package/docs/navigation/en/breadcrumb.md +291 -0
- package/docs/navigation/en/navigator.md +322 -0
- package/docs/navigation/en/navigatormenu.md +512 -0
- package/docs/navigation/en/progressbar.md +199 -0
- package/docs/navigation/en/progressstepbar.md +299 -0
- package/docs/search-filters/cn/daterange.md +1156 -0
- package/docs/search-filters/cn/numberrange.md +688 -0
- package/docs/search-filters/cn/searchbox.md +1582 -0
- package/docs/search-filters/en/daterange.md +1156 -0
- package/docs/search-filters/en/numberrange.md +688 -0
- package/docs/search-filters/en/searchbox.md +1582 -0
- package/package.json +53 -13
- package/dist/common-editor/DateInput.svelte +0 -27
- package/dist/i18n_resources/index.d.ts +0 -3
- package/dist/i18n_resources/index.js +0 -3
- /package/dist/{i18n_resources → i18nRes}/uniface_cn_resource.d.ts +0 -0
- /package/dist/{i18n_resources → i18nRes}/uniface_cn_resource.js +0 -0
- /package/dist/{i18n_resources → i18nRes}/uniface_en_resource.d.ts +0 -0
- /package/dist/{i18n_resources → i18nRes}/uniface_en_resource.js +0 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
# Breadcrumb 面包屑组件
|
|
2
|
+
|
|
3
|
+
Breadcrumb 组件提供分层导航,显示用户在应用程序结构中的当前位置,并允许导航回到父级层次。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- **分层导航**:显示从根目录到当前位置的路径
|
|
8
|
+
- **可定制分隔符**:可配置项目之间的分隔符字符
|
|
9
|
+
- **点击导航**:用于导航到父级层次的点击处理器
|
|
10
|
+
- **灵活的数据结构**:支持自定义数据对象
|
|
11
|
+
- **样式支持**:自定义样式和CSS集成
|
|
12
|
+
|
|
13
|
+
## 导入
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { Breadcrumbs, Breadcrumb } from '@ticatec/uniface-element/Breadcrumbs';
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## 基本用法
|
|
20
|
+
|
|
21
|
+
### 简单面包屑
|
|
22
|
+
|
|
23
|
+
```svelte
|
|
24
|
+
<script>
|
|
25
|
+
import Breadcrumbs from '@ticatec/uniface-element/Breadcrumbs';
|
|
26
|
+
|
|
27
|
+
const breadcrumbItems = [
|
|
28
|
+
{ label: "首页", data: { route: "/" } },
|
|
29
|
+
{ label: "产品", data: { route: "/products" } },
|
|
30
|
+
{ label: "电子产品", data: { route: "/products/electronics" } },
|
|
31
|
+
{ label: "笔记本电脑", data: { route: "/products/electronics/laptops" } }
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
const handleItemClick = (data) => (event) => {
|
|
35
|
+
console.log('导航到:', data.route);
|
|
36
|
+
// 在这里处理导航逻辑
|
|
37
|
+
};
|
|
38
|
+
</script>
|
|
39
|
+
|
|
40
|
+
<Breadcrumbs
|
|
41
|
+
items={breadcrumbItems}
|
|
42
|
+
onItemClick={handleItemClick}
|
|
43
|
+
/>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 自定义分隔符
|
|
47
|
+
|
|
48
|
+
```svelte
|
|
49
|
+
<script>
|
|
50
|
+
import Breadcrumbs from '@ticatec/uniface-element/Breadcrumbs';
|
|
51
|
+
|
|
52
|
+
const pathItems = [
|
|
53
|
+
{ label: "仪表板", data: { id: 1 } },
|
|
54
|
+
{ label: "用户管理", data: { id: 2 } },
|
|
55
|
+
{ label: "编辑资料", data: { id: 3 } }
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
const navigate = (data) => (event) => {
|
|
59
|
+
console.log('导航到项目:', data.id);
|
|
60
|
+
};
|
|
61
|
+
</script>
|
|
62
|
+
|
|
63
|
+
<Breadcrumbs
|
|
64
|
+
items={pathItems}
|
|
65
|
+
separator=">"
|
|
66
|
+
onItemClick={navigate}
|
|
67
|
+
style="padding: 10px; background: #f5f5f5;"
|
|
68
|
+
/>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## API 参考
|
|
72
|
+
|
|
73
|
+
### 属性
|
|
74
|
+
|
|
75
|
+
| 属性 | 类型 | 默认值 | 描述 |
|
|
76
|
+
|------|------|--------|------|
|
|
77
|
+
| `items` | `Array<Breadcrumb>` | `[]` | 面包屑项目数组 |
|
|
78
|
+
| `separator` | `string` | `"/"` | 项目之间的分隔符字符 |
|
|
79
|
+
| `onItemClick` | `(item: any) => (event: MouseEvent) => void` | 必需 | 点击处理函数 |
|
|
80
|
+
| `style` | `string` | `''` | 附加CSS样式 |
|
|
81
|
+
|
|
82
|
+
### Breadcrumb 接口
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
interface Breadcrumb {
|
|
86
|
+
label: string; // 显示文本
|
|
87
|
+
data: any; // 关联数据对象
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## 高级示例
|
|
92
|
+
|
|
93
|
+
### 文件系统导航
|
|
94
|
+
|
|
95
|
+
```svelte
|
|
96
|
+
<script>
|
|
97
|
+
import Breadcrumbs from '@ticatec/uniface-element/Breadcrumbs';
|
|
98
|
+
|
|
99
|
+
let currentPath = [
|
|
100
|
+
{ label: "文档", data: { path: "/documents", type: "folder" } },
|
|
101
|
+
{ label: "项目", data: { path: "/documents/projects", type: "folder" } },
|
|
102
|
+
{ label: "WebApp", data: { path: "/documents/projects/webapp", type: "folder" } },
|
|
103
|
+
{ label: "src", data: { path: "/documents/projects/webapp/src", type: "folder" } }
|
|
104
|
+
];
|
|
105
|
+
|
|
106
|
+
const navigateToPath = (data) => (event) => {
|
|
107
|
+
// 找到点击项目的索引
|
|
108
|
+
const clickedIndex = currentPath.findIndex(item => item.data.path === data.path);
|
|
109
|
+
|
|
110
|
+
if (clickedIndex >= 0) {
|
|
111
|
+
// 截取路径到点击的项目
|
|
112
|
+
currentPath = currentPath.slice(0, clickedIndex + 1);
|
|
113
|
+
console.log('导航到:', data.path);
|
|
114
|
+
|
|
115
|
+
// 在真实应用中,您会在这里更新文件浏览器状态
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
const addFolder = () => {
|
|
120
|
+
currentPath = [...currentPath, {
|
|
121
|
+
label: "组件",
|
|
122
|
+
data: { path: currentPath[currentPath.length - 1].data.path + "/components", type: "folder" }
|
|
123
|
+
}];
|
|
124
|
+
};
|
|
125
|
+
</script>
|
|
126
|
+
|
|
127
|
+
<div class="file-navigator">
|
|
128
|
+
<Breadcrumbs
|
|
129
|
+
items={currentPath}
|
|
130
|
+
separator="/"
|
|
131
|
+
onItemClick={navigateToPath}
|
|
132
|
+
style="font-family: monospace; background: #f8f8f8; padding: 8px; border-radius: 4px;"
|
|
133
|
+
/>
|
|
134
|
+
|
|
135
|
+
<button on:click={addFolder}>添加组件文件夹</button>
|
|
136
|
+
</div>
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 电商分类导航
|
|
140
|
+
|
|
141
|
+
```svelte
|
|
142
|
+
<script>
|
|
143
|
+
import Breadcrumbs from '@ticatec/uniface-element/Breadcrumbs';
|
|
144
|
+
|
|
145
|
+
let categoryPath = [
|
|
146
|
+
{ label: "所有分类", data: { categoryId: null, slug: "" } }
|
|
147
|
+
];
|
|
148
|
+
|
|
149
|
+
const categories = [
|
|
150
|
+
{ id: 1, name: "电子产品", parent: null, slug: "electronics" },
|
|
151
|
+
{ id: 2, name: "电脑", parent: 1, slug: "computers" },
|
|
152
|
+
{ id: 3, name: "笔记本电脑", parent: 2, slug: "laptops" },
|
|
153
|
+
{ id: 4, name: "游戏笔记本", parent: 3, slug: "gaming-laptops" }
|
|
154
|
+
];
|
|
155
|
+
|
|
156
|
+
const navigateToCategory = (data) => (event) => {
|
|
157
|
+
if (data.categoryId === null) {
|
|
158
|
+
// 导航到根目录
|
|
159
|
+
categoryPath = [categoryPath[0]];
|
|
160
|
+
} else {
|
|
161
|
+
// 找到点击的分类并重建路径
|
|
162
|
+
const clickedIndex = categoryPath.findIndex(
|
|
163
|
+
item => item.data.categoryId === data.categoryId
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
if (clickedIndex >= 0) {
|
|
167
|
+
categoryPath = categoryPath.slice(0, clickedIndex + 1);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
console.log('分类路径已更新:', categoryPath);
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
const drillDownCategory = (categoryId) => {
|
|
175
|
+
const category = categories.find(c => c.id === categoryId);
|
|
176
|
+
if (category) {
|
|
177
|
+
categoryPath = [...categoryPath, {
|
|
178
|
+
label: category.name,
|
|
179
|
+
data: { categoryId: category.id, slug: category.slug }
|
|
180
|
+
}];
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
</script>
|
|
184
|
+
|
|
185
|
+
<div class="category-navigation">
|
|
186
|
+
<Breadcrumbs
|
|
187
|
+
items={categoryPath}
|
|
188
|
+
separator="›"
|
|
189
|
+
onItemClick={navigateToCategory}
|
|
190
|
+
style="margin-bottom: 15px;"
|
|
191
|
+
/>
|
|
192
|
+
|
|
193
|
+
<div class="category-actions">
|
|
194
|
+
<button on:click={() => drillDownCategory(1)}>进入电子产品</button>
|
|
195
|
+
<button on:click={() => drillDownCategory(2)}>进入电脑</button>
|
|
196
|
+
<button on:click={() => drillDownCategory(3)}>进入笔记本</button>
|
|
197
|
+
<button on:click={() => drillDownCategory(4)}>进入游戏本</button>
|
|
198
|
+
</div>
|
|
199
|
+
</div>
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### 多步骤表单导航
|
|
203
|
+
|
|
204
|
+
```svelte
|
|
205
|
+
<script>
|
|
206
|
+
import Breadcrumbs from '@ticatec/uniface-element/Breadcrumbs';
|
|
207
|
+
|
|
208
|
+
const formSteps = [
|
|
209
|
+
{ id: 1, name: "账户信息", completed: true },
|
|
210
|
+
{ id: 2, name: "个人详情", completed: true },
|
|
211
|
+
{ id: 3, name: "偏好设置", completed: false },
|
|
212
|
+
{ id: 4, name: "确认", completed: false }
|
|
213
|
+
];
|
|
214
|
+
|
|
215
|
+
let currentStepId = 3;
|
|
216
|
+
|
|
217
|
+
// 从已完成步骤 + 当前步骤构建面包屑
|
|
218
|
+
$: breadcrumbItems = formSteps
|
|
219
|
+
.filter((step, index) => step.completed || step.id === currentStepId)
|
|
220
|
+
.map(step => ({
|
|
221
|
+
label: step.name,
|
|
222
|
+
data: { stepId: step.id, completed: step.completed }
|
|
223
|
+
}));
|
|
224
|
+
|
|
225
|
+
const navigateToStep = (data) => (event) => {
|
|
226
|
+
// 只允许导航到已完成的步骤
|
|
227
|
+
if (data.completed) {
|
|
228
|
+
currentStepId = data.stepId;
|
|
229
|
+
console.log('导航到步骤:', data.stepId);
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
const completeCurrentStep = () => {
|
|
234
|
+
const step = formSteps.find(s => s.id === currentStepId);
|
|
235
|
+
if (step) {
|
|
236
|
+
step.completed = true;
|
|
237
|
+
|
|
238
|
+
// 移动到下一个未完成步骤
|
|
239
|
+
const nextStep = formSteps.find(s => !s.completed);
|
|
240
|
+
if (nextStep) {
|
|
241
|
+
currentStepId = nextStep.id;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
</script>
|
|
246
|
+
|
|
247
|
+
<div class="form-breadcrumb">
|
|
248
|
+
<Breadcrumbs
|
|
249
|
+
items={breadcrumbItems}
|
|
250
|
+
separator="→"
|
|
251
|
+
onItemClick={navigateToStep}
|
|
252
|
+
style="background: linear-gradient(90deg, #e3f2fd, #bbdefb); padding: 10px; border-radius: 8px;"
|
|
253
|
+
/>
|
|
254
|
+
|
|
255
|
+
<div class="form-controls">
|
|
256
|
+
<p>当前步骤: {formSteps.find(s => s.id === currentStepId)?.name}</p>
|
|
257
|
+
<button on:click={completeCurrentStep}>完成步骤</button>
|
|
258
|
+
</div>
|
|
259
|
+
</div>
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
## 最佳实践
|
|
263
|
+
|
|
264
|
+
1. **清晰的标签**:使用描述性、简洁的标签,清楚地表示位置
|
|
265
|
+
2. **逻辑层次结构**:确保面包屑反映实际的应用程序结构
|
|
266
|
+
3. **可点击的父级**:使父级层次可点击以便轻松导航
|
|
267
|
+
4. **当前项目行为**:最后一项通常不应该是可点击的(表示当前位置)
|
|
268
|
+
5. **响应式设计**:考虑面包屑在移动设备上的显示
|
|
269
|
+
6. **一致的分隔符**:为您的设计系统使用适当的分隔符
|
|
270
|
+
7. **性能优化**:避免不必要地重建面包屑
|
|
271
|
+
|
|
272
|
+
## 样式说明
|
|
273
|
+
|
|
274
|
+
- 组件为每个项目渲染带有分隔符前缀
|
|
275
|
+
- 最后一项(当前位置)的点击处理器设置为null
|
|
276
|
+
- 自定义样式可以通过`style`属性应用
|
|
277
|
+
- 考虑使用CSS为可点击项目添加悬停效果
|
|
278
|
+
|
|
279
|
+
## 无障碍访问注意事项
|
|
280
|
+
|
|
281
|
+
- 面包屑提供关于页面位置的上下文
|
|
282
|
+
- 点击处理器应该提供键盘支持
|
|
283
|
+
- 考虑为屏幕阅读器添加ARIA标签
|
|
284
|
+
- 确保文本和分隔符有足够的颜色对比度
|
|
285
|
+
|
|
286
|
+
## 集成提示
|
|
287
|
+
|
|
288
|
+
- 与路由库结合使用以同步URL结构
|
|
289
|
+
- 与页面标题结合使用以更好地定位用户
|
|
290
|
+
- 考虑从路由配置自动生成
|
|
291
|
+
- 测试很长路径的截断行为
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
# Navigator 导航器组件
|
|
2
|
+
|
|
3
|
+
Navigator 组件提供灵活的导航界面,用于显示带有状态指示器、高亮和点击处理的交互式项目列表。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- **交互式导航**:带有自定义处理器的可点击项目
|
|
8
|
+
- **状态指示器**:每个项目的可视化状态表示
|
|
9
|
+
- **高亮显示**:支持高亮特定项目
|
|
10
|
+
- **激活状态管理**:跟踪和显示激活/选中的项目
|
|
11
|
+
- **灵活的项目结构**:支持任何项目数据结构
|
|
12
|
+
- **可定制样式**:自定义样式和CSS集成
|
|
13
|
+
|
|
14
|
+
## 导入
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import { Navigator, NavItemStatus } from '@ticatec/uniface-element/Navigator';
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## 基本用法
|
|
21
|
+
|
|
22
|
+
### 简单导航列表
|
|
23
|
+
|
|
24
|
+
```svelte
|
|
25
|
+
<script>
|
|
26
|
+
import { Navigator, NavItemStatus } from '@ticatec/uniface-element/Navigator';
|
|
27
|
+
|
|
28
|
+
const navItems = [
|
|
29
|
+
{ id: 1, text: "仪表板", completed: true },
|
|
30
|
+
{ id: 2, text: "项目", completed: true },
|
|
31
|
+
{ id: 3, text: "设置", completed: false },
|
|
32
|
+
{ id: 4, text: "个人资料", completed: false }
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
let activeItem = navItems[0];
|
|
36
|
+
|
|
37
|
+
const handleItemClick = (item) => {
|
|
38
|
+
console.log('点击:', item.text);
|
|
39
|
+
activeItem = item;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const getItemStatus = (item) => {
|
|
43
|
+
return item.completed ? NavItemStatus.Completed : NavItemStatus.NotStart;
|
|
44
|
+
};
|
|
45
|
+
</script>
|
|
46
|
+
|
|
47
|
+
<Navigator
|
|
48
|
+
items={navItems}
|
|
49
|
+
{activeItem}
|
|
50
|
+
itemClickHandler={handleItemClick}
|
|
51
|
+
retrieveStatus={getItemStatus}
|
|
52
|
+
/>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 带高亮的导航
|
|
56
|
+
|
|
57
|
+
```svelte
|
|
58
|
+
<script>
|
|
59
|
+
import { Navigator, NavItemStatus } from '@ticatec/uniface-element/Navigator';
|
|
60
|
+
|
|
61
|
+
const menuItems = [
|
|
62
|
+
{ id: 1, text: "首页", status: "completed" },
|
|
63
|
+
{ id: 2, text: "关于", status: "warning" },
|
|
64
|
+
{ id: 3, text: "服务", status: "not-start" },
|
|
65
|
+
{ id: 4, text: "联系", status: "completed" }
|
|
66
|
+
];
|
|
67
|
+
|
|
68
|
+
let activeItem = menuItems[0];
|
|
69
|
+
let highlightedItems = [menuItems[1], menuItems[3]]; // 高亮关于和联系
|
|
70
|
+
|
|
71
|
+
const handleClick = (item) => {
|
|
72
|
+
activeItem = item;
|
|
73
|
+
// 在这里处理导航逻辑
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const getStatus = (item) => {
|
|
77
|
+
switch (item.status) {
|
|
78
|
+
case 'completed': return NavItemStatus.Completed;
|
|
79
|
+
case 'warning': return NavItemStatus.Warning;
|
|
80
|
+
default: return NavItemStatus.NotStart;
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
</script>
|
|
84
|
+
|
|
85
|
+
<Navigator
|
|
86
|
+
items={menuItems}
|
|
87
|
+
{activeItem}
|
|
88
|
+
highlights={highlightedItems}
|
|
89
|
+
itemClickHandler={handleClick}
|
|
90
|
+
retrieveStatus={getStatus}
|
|
91
|
+
style="width: 250px; border: 1px solid #e0e0e0;"
|
|
92
|
+
/>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## API 参考
|
|
96
|
+
|
|
97
|
+
### 属性
|
|
98
|
+
|
|
99
|
+
| 属性 | 类型 | 默认值 | 描述 |
|
|
100
|
+
|------|------|--------|------|
|
|
101
|
+
| `items` | `Array<any>` | 必需 | 导航项目数组 |
|
|
102
|
+
| `activeItem` | `any` | `null` | 当前激活/选中的项目 |
|
|
103
|
+
| `style` | `string` | `""` | 附加CSS样式 |
|
|
104
|
+
| `highlights` | `Array<any>` | `[]` | 要高亮的项目 |
|
|
105
|
+
| `itemClickHandler` | `ItemClickHandler` | 必需 | 点击事件处理器 |
|
|
106
|
+
| `retrieveStatus` | `RetrieveItemStatus` | 必需 | 获取项目状态的函数 |
|
|
107
|
+
|
|
108
|
+
### 类型定义
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
type ItemClickHandler = (item: any) => void;
|
|
112
|
+
type RetrieveItemStatus = (item: any) => NavItemStatus;
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### NavItemStatus 枚举
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
enum NavItemStatus {
|
|
119
|
+
Completed = "nav-completed", // 已完成
|
|
120
|
+
Warning = "nav-warning", // 警告
|
|
121
|
+
NotStart = "nav-not-start" // 未开始
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## 高级示例
|
|
126
|
+
|
|
127
|
+
### 任务管理导航器
|
|
128
|
+
|
|
129
|
+
```svelte
|
|
130
|
+
<script>
|
|
131
|
+
import { Navigator, NavItemStatus } from '@ticatec/uniface-element/Navigator';
|
|
132
|
+
|
|
133
|
+
let tasks = [
|
|
134
|
+
{
|
|
135
|
+
id: 1,
|
|
136
|
+
text: "项目设置",
|
|
137
|
+
completed: true,
|
|
138
|
+
hasIssues: false
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
id: 2,
|
|
142
|
+
text: "数据库设计",
|
|
143
|
+
completed: true,
|
|
144
|
+
hasIssues: true
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
id: 3,
|
|
148
|
+
text: "API实现",
|
|
149
|
+
completed: false,
|
|
150
|
+
hasIssues: false
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
id: 4,
|
|
154
|
+
text: "前端开发",
|
|
155
|
+
completed: false,
|
|
156
|
+
hasIssues: false
|
|
157
|
+
}
|
|
158
|
+
];
|
|
159
|
+
|
|
160
|
+
let activeTask = tasks[2]; // 当前正在进行API开发
|
|
161
|
+
let importantTasks = tasks.filter(task => task.hasIssues);
|
|
162
|
+
|
|
163
|
+
const handleTaskClick = (task) => {
|
|
164
|
+
activeTask = task;
|
|
165
|
+
console.log(`切换到任务: ${task.text}`);
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
const getTaskStatus = (task) => {
|
|
169
|
+
if (task.hasIssues) return NavItemStatus.Warning;
|
|
170
|
+
if (task.completed) return NavItemStatus.Completed;
|
|
171
|
+
return NavItemStatus.NotStart;
|
|
172
|
+
};
|
|
173
|
+
</script>
|
|
174
|
+
|
|
175
|
+
<div class="task-navigator">
|
|
176
|
+
<h3>项目任务</h3>
|
|
177
|
+
<Navigator
|
|
178
|
+
items={tasks}
|
|
179
|
+
activeItem={activeTask}
|
|
180
|
+
highlights={importantTasks}
|
|
181
|
+
itemClickHandler={handleTaskClick}
|
|
182
|
+
retrieveStatus={getTaskStatus}
|
|
183
|
+
style="border: 1px solid #ddd; border-radius: 4px; padding: 8px;"
|
|
184
|
+
/>
|
|
185
|
+
</div>
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### 多步骤表单导航器
|
|
189
|
+
|
|
190
|
+
```svelte
|
|
191
|
+
<script>
|
|
192
|
+
import { Navigator, NavItemStatus } from '@ticatec/uniface-element/Navigator';
|
|
193
|
+
|
|
194
|
+
let formSteps = [
|
|
195
|
+
{ id: 'personal', text: "个人信息", completed: true },
|
|
196
|
+
{ id: 'address', text: "地址", completed: true },
|
|
197
|
+
{ id: 'payment', text: "支付", completed: false, current: true },
|
|
198
|
+
{ id: 'review', text: "审核", completed: false }
|
|
199
|
+
];
|
|
200
|
+
|
|
201
|
+
let currentStep = formSteps.find(step => step.current);
|
|
202
|
+
|
|
203
|
+
const handleStepClick = (step) => {
|
|
204
|
+
// 只允许点击已完成的步骤或当前步骤
|
|
205
|
+
if (step.completed || step.current) {
|
|
206
|
+
currentStep = step;
|
|
207
|
+
|
|
208
|
+
// 更新当前步骤标志
|
|
209
|
+
formSteps = formSteps.map(s => ({
|
|
210
|
+
...s,
|
|
211
|
+
current: s.id === step.id
|
|
212
|
+
}));
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
const getStepStatus = (step) => {
|
|
217
|
+
if (step.completed) return NavItemStatus.Completed;
|
|
218
|
+
if (step.current) return NavItemStatus.Warning; // 当前步骤
|
|
219
|
+
return NavItemStatus.NotStart;
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
const completeCurrentStep = () => {
|
|
223
|
+
const stepIndex = formSteps.findIndex(s => s.current);
|
|
224
|
+
if (stepIndex >= 0) {
|
|
225
|
+
formSteps[stepIndex].completed = true;
|
|
226
|
+
formSteps[stepIndex].current = false;
|
|
227
|
+
|
|
228
|
+
if (stepIndex < formSteps.length - 1) {
|
|
229
|
+
formSteps[stepIndex + 1].current = true;
|
|
230
|
+
currentStep = formSteps[stepIndex + 1];
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
formSteps = [...formSteps]; // 触发响应式更新
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
</script>
|
|
237
|
+
|
|
238
|
+
<div class="form-navigation">
|
|
239
|
+
<Navigator
|
|
240
|
+
items={formSteps}
|
|
241
|
+
activeItem={currentStep}
|
|
242
|
+
itemClickHandler={handleStepClick}
|
|
243
|
+
retrieveStatus={getStepStatus}
|
|
244
|
+
style="margin-bottom: 20px;"
|
|
245
|
+
/>
|
|
246
|
+
|
|
247
|
+
<div class="form-content">
|
|
248
|
+
<h4>步骤: {currentStep?.text}</h4>
|
|
249
|
+
<button on:click={completeCurrentStep}>
|
|
250
|
+
完成步骤
|
|
251
|
+
</button>
|
|
252
|
+
</div>
|
|
253
|
+
</div>
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### 文件浏览器导航器
|
|
257
|
+
|
|
258
|
+
```svelte
|
|
259
|
+
<script>
|
|
260
|
+
import { Navigator, NavItemStatus } from '@ticatec/uniface-element/Navigator';
|
|
261
|
+
|
|
262
|
+
let files = [
|
|
263
|
+
{ name: "文档", type: "folder", accessible: true },
|
|
264
|
+
{ name: "图片", type: "folder", accessible: true },
|
|
265
|
+
{ name: "配置.json", type: "file", accessible: true },
|
|
266
|
+
{ name: "备份.zip", type: "file", accessible: false },
|
|
267
|
+
{ name: "临时", type: "folder", accessible: false }
|
|
268
|
+
];
|
|
269
|
+
|
|
270
|
+
let selectedFile = files[0];
|
|
271
|
+
let recentFiles = [files[2]]; // 最近访问的文件
|
|
272
|
+
|
|
273
|
+
const handleFileClick = (file) => {
|
|
274
|
+
if (file.accessible) {
|
|
275
|
+
selectedFile = file;
|
|
276
|
+
console.log(`打开: ${file.name}`);
|
|
277
|
+
} else {
|
|
278
|
+
console.log(`无法访问: ${file.name}`);
|
|
279
|
+
}
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
const getFileStatus = (file) => {
|
|
283
|
+
if (!file.accessible) return NavItemStatus.Warning;
|
|
284
|
+
return file.type === 'folder' ? NavItemStatus.Completed : NavItemStatus.NotStart;
|
|
285
|
+
};
|
|
286
|
+
</script>
|
|
287
|
+
|
|
288
|
+
<div class="file-browser">
|
|
289
|
+
<Navigator
|
|
290
|
+
items={files}
|
|
291
|
+
activeItem={selectedFile}
|
|
292
|
+
highlights={recentFiles}
|
|
293
|
+
itemClickHandler={handleFileClick}
|
|
294
|
+
retrieveStatus={getFileStatus}
|
|
295
|
+
style="font-family: monospace; background: #f5f5f5;"
|
|
296
|
+
/>
|
|
297
|
+
</div>
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
## 最佳实践
|
|
301
|
+
|
|
302
|
+
1. **清晰的项目文本**:为导航项目使用描述性、简洁的文本
|
|
303
|
+
2. **一致的状态逻辑**:确保状态确定是可预测的
|
|
304
|
+
3. **适当的高亮**:谨慎使用高亮来标识重要项目
|
|
305
|
+
4. **无障碍访问**:确保状态指示器有足够的颜色对比度
|
|
306
|
+
5. **点击处理**:为用户交互提供有意义的反馈
|
|
307
|
+
6. **状态管理**:保持激活项目与应用程序状态同步
|
|
308
|
+
7. **性能优化**:对于非常大的项目列表考虑虚拟化
|
|
309
|
+
|
|
310
|
+
## 样式说明
|
|
311
|
+
|
|
312
|
+
- 状态类(`nav-completed`、`nav-warning`、`nav-not-start`)提供视觉区分
|
|
313
|
+
- 激活项目接收特殊样式以显示选择
|
|
314
|
+
- 高亮项目有额外的视觉强调
|
|
315
|
+
- 自定义CSS可以通过`style`属性应用
|
|
316
|
+
|
|
317
|
+
## 集成提示
|
|
318
|
+
|
|
319
|
+
- 与路由库结合用于单页应用导航
|
|
320
|
+
- 与状态管理结合处理复杂应用流程
|
|
321
|
+
- 考虑键盘导航支持以提高无障碍访问性
|
|
322
|
+
- 使用各种项目数据结构进行测试以确保灵活性
|