@ticatec/uniface-element 0.2.3 → 0.3.0
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/accordion/README.md +169 -0
- package/dist/accordion/README_CN.md +176 -0
- package/dist/action-bar/README.md +275 -0
- package/dist/action-bar/README_CN.md +285 -0
- package/dist/app-layout/README.md +374 -0
- package/dist/app-layout/README_CN.md +381 -0
- package/dist/app-top-bar/README.md +357 -0
- package/dist/app-top-bar/README_CN.md +365 -0
- package/dist/attachment-files/AttachmentFilesField.svelte +67 -1
- package/dist/attachment-files/AttachmentFilesField.svelte.d.ts +8 -1
- package/dist/base-calendar/CalendarBase.svelte +0 -3
- package/dist/box/README.md +385 -0
- package/dist/box/README_CN.md +393 -0
- package/dist/breadcrumbs/README.md +442 -0
- package/dist/breadcrumbs/README_CN.md +442 -0
- package/dist/button/Button.svelte +27 -7
- package/dist/button/Button.svelte.d.ts +3 -1
- package/dist/button/IconButton.svelte +26 -6
- package/dist/button/IconButton.svelte.d.ts +3 -1
- package/dist/button/IconButton_README.md +513 -0
- package/dist/button/IconButton_README_CN.md +513 -0
- package/dist/button/README.md +428 -0
- package/dist/button/README_CN.md +428 -0
- package/dist/button/TextButton.svelte +26 -6
- package/dist/button/TextButton.svelte.d.ts +3 -1
- package/dist/button/TextButton_README.md +571 -0
- package/dist/button/TextButton_README_CN.md +571 -0
- package/dist/card/README.md +666 -0
- package/dist/card/README_CN.md +666 -0
- package/dist/cascade-options-select/CascadeOptionSelect.svelte +43 -7
- package/dist/cascade-options-select/CascadeOptionSelect.svelte.d.ts +3 -4
- package/dist/cascade-options-select/README.md +663 -2
- package/dist/cascade-options-select/README_CN.md +664 -0
- package/dist/checkbox/CheckBox.svelte +20 -6
- package/dist/checkbox/CheckBox.svelte.d.ts +4 -2
- package/dist/checkbox/README.md +562 -0
- package/dist/checkbox/README_CN.md +727 -0
- package/dist/common-editor/NumberInput.svelte +39 -26
- package/dist/common-editor/NumberInput.svelte.d.ts +5 -1
- package/dist/concise-data-table/ConciseListTable.svelte +133 -36
- package/dist/concise-data-table/ConciseListTable.svelte.d.ts +8 -1
- package/dist/concise-data-table/DataCell.svelte +5 -6
- package/dist/concise-data-table/DataRow.svelte +22 -2
- package/dist/concise-data-table/DataRow.svelte.d.ts +1 -0
- package/dist/concise-data-table/README.md +606 -0
- package/dist/concise-data-table/README_CN.md +611 -0
- package/dist/context-menu/ContextMenu.svelte +138 -21
- package/dist/context-menu/ContextMenu.svelte.d.ts +5 -0
- package/dist/context-menu/ContextMenuItem.d.ts +20 -4
- package/dist/context-menu/README.md +551 -0
- package/dist/context-menu/README_CN.md +551 -0
- package/dist/criteria-field/CriteriaField.svelte +3 -5
- package/dist/criteria-field/README.md +532 -0
- package/dist/criteria-field/README_CN.md +532 -0
- package/dist/data-table/README.md +712 -0
- package/dist/data-table/README_CN.md +712 -0
- package/dist/date-picker/DatePicker.svelte +44 -7
- package/dist/date-picker/DatePicker.svelte.d.ts +3 -4
- package/dist/date-picker/DateTimePicker.svelte +32 -8
- package/dist/date-picker/DateTimePicker.svelte.d.ts +3 -4
- package/dist/date-picker/README.md +326 -0
- package/dist/date-picker/README_CN.md +316 -0
- package/dist/date-picker/ScrollBar.svelte +18 -8
- package/dist/date-picker/ScrollBar.svelte.d.ts +1 -1
- package/dist/date-picker/TimePanel.svelte +5 -5
- package/dist/date-picker/TimePanel.svelte.d.ts +1 -1
- package/dist/date-range/README.md +374 -0
- package/dist/date-range/README_CN.md +374 -0
- package/dist/dialog/DialogBoard.svelte +1 -1
- package/dist/dialog/README.md +596 -0
- package/dist/dialog/README_CN.md +596 -0
- package/dist/drawer/README.md +679 -1
- package/dist/drawer/README_CN.md +679 -0
- package/dist/group-box/group-check-box/GroupCheckBox.svelte +62 -5
- package/dist/group-box/group-check-box/GroupCheckBox.svelte.d.ts +7 -2
- package/dist/group-box/group-check-box/README.md +749 -0
- package/dist/group-box/group-check-box/README_CN.md +750 -0
- package/dist/group-box/group-radio-box/GroupRadioBox.svelte +69 -4
- package/dist/group-box/group-radio-box/GroupRadioBox.svelte.d.ts +8 -2
- package/dist/group-box/group-radio-box/README.md +920 -0
- package/dist/group-box/group-radio-box/README_CN.md +920 -0
- package/dist/image-files/README.md +1346 -0
- package/dist/image-files/README_CN.md +1346 -0
- package/dist/input-options-select/InputOptionsSelect.svelte +161 -65
- package/dist/input-options-select/InputOptionsSelect.svelte.d.ts +4 -1
- package/dist/lib/forwardAllEvents.d.ts +3 -0
- package/dist/lib/forwardAllEvents.js +24 -0
- package/dist/list-box/README.md +579 -0
- package/dist/list-box/README_CN.md +682 -0
- package/dist/lookup-editor/LookupEditor.svelte +15 -3
- package/dist/lookup-editor/LookupEditor.svelte.d.ts +3 -4
- package/dist/lookup-editor/README.md +684 -0
- package/dist/lookup-editor/README_CN.md +684 -0
- package/dist/memo-editor/MemoEditor.svelte +77 -27
- package/dist/memo-editor/MemoEditor.svelte.d.ts +6 -3
- package/dist/memo-editor/README.md +819 -0
- package/dist/memo-editor/README_CN.md +819 -0
- package/dist/message-box/README.md +398 -0
- package/dist/message-box/README_CN.md +398 -0
- package/dist/number-editor/NumberEditor.svelte +2 -2
- package/dist/number-editor/NumberEditor.svelte.d.ts +1 -1
- package/dist/number-editor/README.md +353 -22
- package/dist/number-editor/README_CN.md +357 -0
- package/dist/number-range/README.md +443 -0
- package/dist/number-range/README_CN.md +443 -0
- package/dist/options-multi-select/OptionsMultiSelect.svelte +87 -12
- package/dist/options-multi-select/OptionsMultiSelect.svelte.d.ts +3 -1
- package/dist/options-multi-select/README.md +480 -0
- package/dist/options-multi-select/README_CN.md +480 -0
- package/dist/options-select/OptionsSelect.svelte +36 -5
- package/dist/options-select/OptionsSelect.svelte.d.ts +3 -4
- package/dist/options-select/README.md +632 -0
- package/dist/options-select/README_CN.md +632 -0
- package/dist/page/README.md +605 -0
- package/dist/page/README_CN.md +605 -0
- package/dist/pagination/README.md +946 -0
- package/dist/pagination/README_CN.md +946 -0
- package/dist/pagination-panel/README.md +1075 -0
- package/dist/pagination-panel/README_CN.md +1075 -0
- package/dist/popup-hint/README.md +841 -0
- package/dist/popup-hint/README_CN.md +840 -0
- package/dist/progress-bar/README.md +242 -0
- package/dist/progress-bar/README_CN.md +242 -0
- package/dist/progress-step-bar/README.md +316 -0
- package/dist/progress-step-bar/README_CN.md +316 -0
- package/dist/prompts-text-editor/PromptsTextEditor.svelte +6 -3
- package/dist/prompts-text-editor/PromptsTextEditor.svelte.d.ts +3 -1
- package/dist/prompts-text-editor/README.md +329 -0
- package/dist/prompts-text-editor/README_CN.md +329 -0
- package/dist/property-editor/README.md +969 -0
- package/dist/property-editor/README_CN.md +969 -0
- package/dist/radio-button/README.md +372 -0
- package/dist/radio-button/README_CN.md +372 -0
- package/dist/radio-button/RadioButton.svelte +32 -3
- package/dist/radio-button/RadioButton.svelte.d.ts +12 -1
- package/dist/search-box/README.md +425 -0
- package/dist/search-box/README_CN.md +424 -0
- package/dist/search-box/SearchBox.svelte +22 -6
- package/dist/search-box/SearchBox.svelte.d.ts +4 -1
- package/dist/tabs/README.md +919 -0
- package/dist/tabs/README_CN.md +920 -0
- package/dist/tag/README.md +922 -0
- package/dist/tag/README_CN.md +922 -0
- package/dist/text-editor/PasswordEditor.svelte +17 -2
- package/dist/text-editor/PasswordEditor.svelte.d.ts +3 -3
- package/dist/text-editor/PasswordEditor_README.md +551 -0
- package/dist/text-editor/PasswordEditor_README_CN.md +551 -0
- package/dist/text-editor/README.md +466 -0
- package/dist/text-editor/README_CN.md +466 -0
- package/dist/text-editor/TextEditor.svelte +51 -19
- package/dist/text-editor/TextEditor.svelte.d.ts +0 -1
- package/dist/ticatec-uniface-web.css +1 -0
- package/dist/time-editor/README.md +498 -24
- package/dist/time-editor/README_CN.md +498 -0
- package/dist/time-editor/TimeEditor.svelte +7 -3
- package/dist/time-editor/TimeEditor.svelte.d.ts +3 -1
- package/dist/toast/README.md +667 -0
- package/dist/toast/README_CN.md +667 -0
- package/dist/transfer/README.md +795 -0
- package/dist/transfer/Transfer.svelte +6 -4
- package/dist/transfer/Transfer.svelte.d.ts +3 -1
- package/dist/tree-view/README.md +761 -0
- package/dist/tree-view/README_CN.md +761 -0
- package/dist/tree-view/TreeView.svelte +5 -3
- package/dist/tree-view/TreeView.svelte.d.ts +3 -1
- package/dist/unit-number-editor/README.md +546 -20
- package/dist/unit-number-editor/README_CN.md +525 -0
- package/dist/unit-number-editor/UnitNumberEditor.svelte +62 -8
- package/dist/unit-number-editor/UnitNumberEditor.svelte.d.ts +5 -1
- package/docs/form-field/cn/README_CN.md +364 -0
- package/docs/form-field/en/README.md +364 -0
- package/docs/form-panel/flex-form/cn/README_CN.md +586 -0
- package/docs/form-panel/flex-form/en/README.md +586 -0
- package/docs/form-panel/flex-row-form/cn/README_CN.md +787 -0
- package/docs/form-panel/flex-row-form/en/README.md +787 -0
- package/docs/form-panel/grid-form/en/README.md +744 -0
- package/package.json +1 -1
- package/dist/drawer/README-CN.md +0 -1
|
@@ -0,0 +1,632 @@
|
|
|
1
|
+
# 选项单选组件
|
|
2
|
+
|
|
3
|
+
一个单选下拉组件,允许用户从预定义列表中选择一个选项,支持自定义样式和行为。
|
|
4
|
+
|
|
5
|
+
## 功能
|
|
6
|
+
|
|
7
|
+
- **单选**:从下拉列表中选择一个选项
|
|
8
|
+
- **自定义字段映射**:配置用于键和显示文本的对象属性
|
|
9
|
+
- **选项控制**:隐藏或禁用特定选项
|
|
10
|
+
- **自定义渲染**:使用自定义组件渲染下拉项
|
|
11
|
+
- **必填模式**:防止清除已选值
|
|
12
|
+
- **搜索集成**:与 CommonPicker 配合使用,提供一致的行为
|
|
13
|
+
- **焦点管理**:适当的焦点处理和键盘导航
|
|
14
|
+
- **显示模式**:支持编辑和查看模式
|
|
15
|
+
- **空状态处理**:可自定义的占位符和空文本
|
|
16
|
+
- **事件回调**:支持选择、聚焦和失焦等丰富的事件处理
|
|
17
|
+
|
|
18
|
+
## 安装
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install @ticatec/uniface-element
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 基本用法
|
|
25
|
+
|
|
26
|
+
```svelte
|
|
27
|
+
<script>
|
|
28
|
+
import OptionsSelect from '@ticatec/uniface-element/OptionsSelect';
|
|
29
|
+
|
|
30
|
+
let selectedValue = null;
|
|
31
|
+
let options = [
|
|
32
|
+
{ code: 'JS', text: 'JavaScript' },
|
|
33
|
+
{ code: 'TS', text: 'TypeScript' },
|
|
34
|
+
{ code: 'PY', text: 'Python' }
|
|
35
|
+
];
|
|
36
|
+
</script>
|
|
37
|
+
|
|
38
|
+
<OptionsSelect
|
|
39
|
+
{options}
|
|
40
|
+
bind:value={selectedValue}
|
|
41
|
+
/>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## API 参考
|
|
45
|
+
|
|
46
|
+
### 属性
|
|
47
|
+
|
|
48
|
+
| 属性 | 类型 | 默认值 | 描述 |
|
|
49
|
+
|------|------|---------|-------------|
|
|
50
|
+
| `value` | `any` | `null` | 选中的选项键/值 |
|
|
51
|
+
| `options` | `Array<any>` | `[]` | 选项对象数组 |
|
|
52
|
+
| `keyField` | `string` | `'code'` | 选项键的属性名 |
|
|
53
|
+
| `textField` | `string` | `'text'` | 选项显示文本的属性名 |
|
|
54
|
+
| `variant` | `'' \| 'plain' \| 'outlined' \| 'filled'` | `''` | 视觉样式变体 |
|
|
55
|
+
| `compact` | `boolean` | `false` | 启用紧凑显示模式 |
|
|
56
|
+
| `disabled` | `boolean` | `false` | 禁用组件 |
|
|
57
|
+
| `readonly` | `boolean` | `false` | 使组件只读 |
|
|
58
|
+
| `mandatory` | `boolean` | `false` | 禁止清除已选值 |
|
|
59
|
+
| `style` | `string` | `''` | 自定义 CSS 样式 |
|
|
60
|
+
| `placeholder` | `string` | `''` | 未选择选项时的占位符文本 |
|
|
61
|
+
| `emptyText` | `string` | `null` | 未选择选项时显示的文本(覆盖占位符) |
|
|
62
|
+
| `disableOptions` | `Array<string>` | `[]` | 要禁用的选项键 |
|
|
63
|
+
| `hideOptions` | `Array<string>` | `[]` | 要隐藏的选项键 |
|
|
64
|
+
| `displayMode` | `DisplayMode` | `DisplayMode.Edit` | 编辑或查看模式 |
|
|
65
|
+
| `menu$height` | `number` | `0` | 下拉菜单的最大高度 |
|
|
66
|
+
| `itemRender` | `any` | `null` | 用于渲染选项的自定义组件 |
|
|
67
|
+
| `onchange` | `OnChangeHandler<any>` | `null` | 更改事件处理程序 |
|
|
68
|
+
| `onfocus` | `(() => void) \| null` | `null` | 聚焦事件处理程序 |
|
|
69
|
+
| `onblur` | `(() => void) \| null` | `null` | 失焦事件处理程序 |
|
|
70
|
+
| `onSelected` | `OnSelectedHandler` | `null` | 选择事件处理程序,包含完整选项数据 |
|
|
71
|
+
|
|
72
|
+
### 方法
|
|
73
|
+
|
|
74
|
+
| 方法 | 描述 |
|
|
75
|
+
|--------|-------------|
|
|
76
|
+
| `setFocus()` | 以编程方式聚焦组件 |
|
|
77
|
+
|
|
78
|
+
## 示例
|
|
79
|
+
|
|
80
|
+
### 货币选择器
|
|
81
|
+
|
|
82
|
+
```svelte
|
|
83
|
+
<script>
|
|
84
|
+
import OptionsSelect from '@ticatec/uniface-element/OptionsSelect';
|
|
85
|
+
import FormField from '@ticatec/uniface-element/FormField';
|
|
86
|
+
|
|
87
|
+
let selectedCurrency = 'USD';
|
|
88
|
+
let currencies = [
|
|
89
|
+
{ code: 'USD', text: '美元' },
|
|
90
|
+
{ code: 'EUR', text: '欧元' },
|
|
91
|
+
{ code: 'GBP', text: '英镑' },
|
|
92
|
+
{ code: 'JPY', text: '日元' },
|
|
93
|
+
{ code: 'CNY', text: '人民币' }
|
|
94
|
+
];
|
|
95
|
+
|
|
96
|
+
function handleCurrencyChange(currency) {
|
|
97
|
+
console.log('货币更改为:', currency);
|
|
98
|
+
}
|
|
99
|
+
</script>
|
|
100
|
+
|
|
101
|
+
<FormField label="货币">
|
|
102
|
+
<OptionsSelect
|
|
103
|
+
options={currencies}
|
|
104
|
+
bind:value={selectedCurrency}
|
|
105
|
+
variant="outlined"
|
|
106
|
+
placeholder="选择货币"
|
|
107
|
+
onchange={handleCurrencyChange}
|
|
108
|
+
/>
|
|
109
|
+
</FormField>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### 国家选择器(自定义字段)
|
|
113
|
+
|
|
114
|
+
```svelte
|
|
115
|
+
<script>
|
|
116
|
+
import OptionsSelect from '@ticatec/uniface-element/OptionsSelect';
|
|
117
|
+
|
|
118
|
+
let selectedCountry = null;
|
|
119
|
+
let countries = [
|
|
120
|
+
{ id: 'US', name: '美国' },
|
|
121
|
+
{ id: 'CA', name: '加拿大' },
|
|
122
|
+
{ id: 'UK', name: '英国' },
|
|
123
|
+
{ id: 'DE', name: '德国' },
|
|
124
|
+
{ id: 'JP', name: '日本' }
|
|
125
|
+
];
|
|
126
|
+
|
|
127
|
+
function handleCountrySelection(countryItem) {
|
|
128
|
+
console.log('选择的国家对象:', countryItem);
|
|
129
|
+
}
|
|
130
|
+
</script>
|
|
131
|
+
|
|
132
|
+
<OptionsSelect
|
|
133
|
+
options={countries}
|
|
134
|
+
keyField="id"
|
|
135
|
+
textField="name"
|
|
136
|
+
bind:value={selectedCountry}
|
|
137
|
+
variant="filled"
|
|
138
|
+
placeholder="选择你的国家"
|
|
139
|
+
onSelected={handleCountrySelection}
|
|
140
|
+
/>
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 状态选择器(带禁用选项)
|
|
144
|
+
|
|
145
|
+
```svelte
|
|
146
|
+
<script>
|
|
147
|
+
import OptionsSelect from '@ticatec/uniface-element/OptionsSelect';
|
|
148
|
+
|
|
149
|
+
let taskStatus = 'PENDING';
|
|
150
|
+
let statusOptions = [
|
|
151
|
+
{ code: 'PENDING', text: '待处理' },
|
|
152
|
+
{ code: 'IN_PROGRESS', text: '进行中' },
|
|
153
|
+
{ code: 'REVIEW', text: '审核中' },
|
|
154
|
+
{ code: 'COMPLETED', text: '已完成' },
|
|
155
|
+
{ code: 'CANCELLED', text: '已取消' },
|
|
156
|
+
{ code: 'ARCHIVED', text: '已归档' }
|
|
157
|
+
];
|
|
158
|
+
|
|
159
|
+
let disabledStatuses = ['ARCHIVED']; // 归档状态不可用
|
|
160
|
+
let hiddenStatuses = ['CANCELLED']; // 隐藏取消选项
|
|
161
|
+
</script>
|
|
162
|
+
|
|
163
|
+
<div class="status-selector">
|
|
164
|
+
<label>任务状态</label>
|
|
165
|
+
<OptionsSelect
|
|
166
|
+
options={statusOptions}
|
|
167
|
+
bind:value={taskStatus}
|
|
168
|
+
variant="outlined"
|
|
169
|
+
disableOptions={disabledStatuses}
|
|
170
|
+
hideOptions={hiddenStatuses}
|
|
171
|
+
mandatory
|
|
172
|
+
emptyText="未设置状态"
|
|
173
|
+
/>
|
|
174
|
+
</div>
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### 语言偏好
|
|
178
|
+
|
|
179
|
+
```svelte
|
|
180
|
+
<script>
|
|
181
|
+
import OptionsSelect from '@ticatec/uniface-element/OptionsSelect';
|
|
182
|
+
|
|
183
|
+
let preferredLanguage = null;
|
|
184
|
+
let languages = [
|
|
185
|
+
{ locale: 'en', display: '英语' },
|
|
186
|
+
{ locale: 'es', display: '西班牙语' },
|
|
187
|
+
{ locale: 'fr', display: '法语' },
|
|
188
|
+
{ locale: 'de', display: '德语' },
|
|
189
|
+
{ locale: 'zh', display: '中文' },
|
|
190
|
+
{ locale: 'ja', display: '日语' }
|
|
191
|
+
];
|
|
192
|
+
|
|
193
|
+
function handleLanguageChange(locale) {
|
|
194
|
+
console.log('语言更改为:', locale);
|
|
195
|
+
// 更新应用语言
|
|
196
|
+
updateAppLanguage(locale);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function handleFocus() {
|
|
200
|
+
console.log('语言选择器聚焦');
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function handleBlur() {
|
|
204
|
+
console.log('语言选择器失焦');
|
|
205
|
+
}
|
|
206
|
+
</script>
|
|
207
|
+
|
|
208
|
+
<div class="language-settings">
|
|
209
|
+
<OptionsSelect
|
|
210
|
+
options={languages}
|
|
211
|
+
keyField="locale"
|
|
212
|
+
textField="display"
|
|
213
|
+
bind:value={preferredLanguage}
|
|
214
|
+
variant="filled"
|
|
215
|
+
placeholder="选择你的语言"
|
|
216
|
+
onchange={handleLanguageChange}
|
|
217
|
+
onfocus={handleFocus}
|
|
218
|
+
onblur={handleBlur}
|
|
219
|
+
/>
|
|
220
|
+
</div>
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### 优先级选择器(自定义样式)
|
|
224
|
+
|
|
225
|
+
```svelte
|
|
226
|
+
<script>
|
|
227
|
+
import OptionsSelect from '@ticatec/uniface-element/OptionsSelect';
|
|
228
|
+
import PriorityItem from './PriorityItem.svelte'; // 自定义组件
|
|
229
|
+
|
|
230
|
+
let priority = 'MEDIUM';
|
|
231
|
+
let priorities = [
|
|
232
|
+
{ level: 'LOW', label: '低优先级', color: '#4caf50' },
|
|
233
|
+
{ level: 'MEDIUM', label: '中优先级', color: '#ff9800' },
|
|
234
|
+
{ level: 'HIGH', label: '高优先级', color: '#f44336' },
|
|
235
|
+
{ level: 'URGENT', label: '紧急', color: '#9c27b0' }
|
|
236
|
+
];
|
|
237
|
+
|
|
238
|
+
const priorityRenderer = {
|
|
239
|
+
component: PriorityItem,
|
|
240
|
+
props: {
|
|
241
|
+
showIcon: true
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
</script>
|
|
245
|
+
|
|
246
|
+
<div class="priority-selector">
|
|
247
|
+
<label>任务优先级</label>
|
|
248
|
+
<OptionsSelect
|
|
249
|
+
options={priorities}
|
|
250
|
+
keyField="level"
|
|
251
|
+
textField="label"
|
|
252
|
+
bind:value={priority}
|
|
253
|
+
variant="outlined"
|
|
254
|
+
itemRender={priorityRenderer}
|
|
255
|
+
mandatory
|
|
256
|
+
/>
|
|
257
|
+
</div>
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### 主题选择器
|
|
261
|
+
|
|
262
|
+
```svelte
|
|
263
|
+
<script>
|
|
264
|
+
import OptionsSelect from '@ticatec/uniface-element/OptionsSelect';
|
|
265
|
+
|
|
266
|
+
let currentTheme = 'light';
|
|
267
|
+
let themes = [
|
|
268
|
+
{ code: 'light', text: '浅色主题' },
|
|
269
|
+
{ code: 'dark', text: '深色主题' },
|
|
270
|
+
{ code: 'auto', text: '系统默认' },
|
|
271
|
+
{ code: 'high-contrast', text: '高对比度' }
|
|
272
|
+
];
|
|
273
|
+
|
|
274
|
+
function applyTheme(themeCode) {
|
|
275
|
+
console.log('应用主题:', themeCode);
|
|
276
|
+
document.documentElement.setAttribute('data-theme', themeCode);
|
|
277
|
+
}
|
|
278
|
+
</script>
|
|
279
|
+
|
|
280
|
+
<div class="theme-settings">
|
|
281
|
+
<h3>外观</h3>
|
|
282
|
+
<OptionsSelect
|
|
283
|
+
options={themes}
|
|
284
|
+
bind:value={currentTheme}
|
|
285
|
+
variant="outlined"
|
|
286
|
+
mandatory
|
|
287
|
+
onchange={applyTheme}
|
|
288
|
+
style="width: 200px;"
|
|
289
|
+
/>
|
|
290
|
+
</div>
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### 带多个选择器的表单
|
|
294
|
+
|
|
295
|
+
```svelte
|
|
296
|
+
<script>
|
|
297
|
+
import OptionsSelect from '@ticatec/uniface-element/OptionsSelect';
|
|
298
|
+
import FormField from '@ticatec/uniface-element/FormField';
|
|
299
|
+
|
|
300
|
+
let userProfile = {
|
|
301
|
+
gender: null,
|
|
302
|
+
country: null,
|
|
303
|
+
timezone: null,
|
|
304
|
+
currency: 'USD'
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
let genders = [
|
|
308
|
+
{ code: 'M', text: '男性' },
|
|
309
|
+
{ code: 'F', text: '女性' },
|
|
310
|
+
{ code: 'O', text: '其他' },
|
|
311
|
+
{ code: 'N', text: '不愿透露' }
|
|
312
|
+
];
|
|
313
|
+
|
|
314
|
+
let countries = [
|
|
315
|
+
{ id: 'US', name: '美国' },
|
|
316
|
+
{ id: 'CA', name: '加拿大' },
|
|
317
|
+
{ id: 'UK', name: '英国' },
|
|
318
|
+
{ id: 'AU', name: '澳大利亚' }
|
|
319
|
+
];
|
|
320
|
+
|
|
321
|
+
let timezones = [
|
|
322
|
+
{ code: 'UTC', text: '协调世界时' },
|
|
323
|
+
{ code: 'EST', text: '东部时间' },
|
|
324
|
+
{ code: 'PST', text: '太平洋时间' },
|
|
325
|
+
{ code: 'GMT', text: '格林尼治标准时间' }
|
|
326
|
+
];
|
|
327
|
+
|
|
328
|
+
let currencies = [
|
|
329
|
+
{ code: 'USD', text: '美元' },
|
|
330
|
+
{ code: 'EUR', text: '欧元' },
|
|
331
|
+
{ code: 'GBP', text: '英镑' },
|
|
332
|
+
{ code: 'CAD', text: '加拿大元' }
|
|
333
|
+
];
|
|
334
|
+
|
|
335
|
+
function saveProfile() {
|
|
336
|
+
console.log('保存用户信息:', userProfile);
|
|
337
|
+
}
|
|
338
|
+
</script>
|
|
339
|
+
|
|
340
|
+
<div class="profile-form">
|
|
341
|
+
<h3>用户信息</h3>
|
|
342
|
+
|
|
343
|
+
<FormField label="性别">
|
|
344
|
+
<OptionsSelect
|
|
345
|
+
options={genders}
|
|
346
|
+
bind:value={userProfile.gender}
|
|
347
|
+
variant="outlined"
|
|
348
|
+
placeholder="选择性别"
|
|
349
|
+
/>
|
|
350
|
+
</FormField>
|
|
351
|
+
|
|
352
|
+
<FormField label="国家">
|
|
353
|
+
<OptionsSelect
|
|
354
|
+
options={countries}
|
|
355
|
+
keyField="id"
|
|
356
|
+
textField="name"
|
|
357
|
+
bind:value={userProfile.country}
|
|
358
|
+
variant="outlined"
|
|
359
|
+
placeholder="选择国家"
|
|
360
|
+
mandatory
|
|
361
|
+
/>
|
|
362
|
+
</FormField>
|
|
363
|
+
|
|
364
|
+
<FormField label="时区">
|
|
365
|
+
<OptionsSelect
|
|
366
|
+
options={timezones}
|
|
367
|
+
bind:value={userProfile.timezone}
|
|
368
|
+
variant="outlined"
|
|
369
|
+
placeholder="选择时区"
|
|
370
|
+
/>
|
|
371
|
+
</FormField>
|
|
372
|
+
|
|
373
|
+
<FormField label="货币">
|
|
374
|
+
<OptionsSelect
|
|
375
|
+
options={currencies}
|
|
376
|
+
bind:value={userProfile.currency}
|
|
377
|
+
variant="outlined"
|
|
378
|
+
mandatory
|
|
379
|
+
/>
|
|
380
|
+
</FormField>
|
|
381
|
+
|
|
382
|
+
<button on:click={saveProfile}>保存用户信息</button>
|
|
383
|
+
</div>
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
### 紧凑表格用法
|
|
387
|
+
|
|
388
|
+
```svelte
|
|
389
|
+
<script>
|
|
390
|
+
import OptionsSelect from '@ticatec/uniface-element/OptionsSelect';
|
|
391
|
+
|
|
392
|
+
let statusOptions = [
|
|
393
|
+
{ code: 'ACTIVE', text: '活跃' },
|
|
394
|
+
{ code: 'INACTIVE', text: '非活跃' },
|
|
395
|
+
{ code: 'PENDING', text: '待处理' }
|
|
396
|
+
];
|
|
397
|
+
|
|
398
|
+
let users = [
|
|
399
|
+
{ id: 1, name: 'John Doe', status: 'ACTIVE' },
|
|
400
|
+
{ id: 2, name: 'Jane Smith', status: 'INACTIVE' },
|
|
401
|
+
{ id: 3, name: 'Bob Wilson', status: 'PENDING' }
|
|
402
|
+
];
|
|
403
|
+
|
|
404
|
+
function updateUserStatus(userId, newStatus) {
|
|
405
|
+
const user = users.find(u => u.id === userId);
|
|
406
|
+
if (user) {
|
|
407
|
+
user.status = newStatus;
|
|
408
|
+
users = [...users];
|
|
409
|
+
console.log(`用户 ${user.name} 的状态更新为 ${newStatus}`);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
</script>
|
|
413
|
+
|
|
414
|
+
<table class="user-table">
|
|
415
|
+
<thead>
|
|
416
|
+
<tr>
|
|
417
|
+
<th>姓名</th>
|
|
418
|
+
<th>状态</th>
|
|
419
|
+
</tr>
|
|
420
|
+
</thead>
|
|
421
|
+
<tbody>
|
|
422
|
+
{#each users as user}
|
|
423
|
+
<tr>
|
|
424
|
+
<td>{user.name}</td>
|
|
425
|
+
<td>
|
|
426
|
+
<OptionsSelect
|
|
427
|
+
options={statusOptions}
|
|
428
|
+
value={user.status}
|
|
429
|
+
compact
|
|
430
|
+
variant="outlined"
|
|
431
|
+
onchange={(status) => updateUserStatus(user.id, status)}
|
|
432
|
+
/>
|
|
433
|
+
</td>
|
|
434
|
+
</tr>
|
|
435
|
+
{/each}
|
|
436
|
+
</tbody>
|
|
437
|
+
</table>
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
### 动态选项加载
|
|
441
|
+
|
|
442
|
+
```svelte
|
|
443
|
+
<script>
|
|
444
|
+
import OptionsSelect from '@ticatec/uniface-element/OptionsSelect';
|
|
445
|
+
|
|
446
|
+
let selectedCategory = null;
|
|
447
|
+
let selectedProduct = null;
|
|
448
|
+
let categories = [
|
|
449
|
+
{ id: 'electronics', name: '电子产品' },
|
|
450
|
+
{ id: 'clothing', name: '服装' },
|
|
451
|
+
{ id: 'books', name: '书籍' }
|
|
452
|
+
];
|
|
453
|
+
let products = [];
|
|
454
|
+
|
|
455
|
+
async function loadProducts(categoryId) {
|
|
456
|
+
if (!categoryId) {
|
|
457
|
+
products = [];
|
|
458
|
+
selectedProduct = null;
|
|
459
|
+
return;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
// 模拟 API 调用
|
|
463
|
+
const productData = {
|
|
464
|
+
'electronics': [
|
|
465
|
+
{ sku: 'E001', name: '笔记本电脑' },
|
|
466
|
+
{ sku: 'E002', name: '智能手机' }
|
|
467
|
+
],
|
|
468
|
+
'clothing': [
|
|
469
|
+
{ sku: 'C001', name: 'T恤' },
|
|
470
|
+
{ sku: 'C002', name: '牛仔裤' }
|
|
471
|
+
],
|
|
472
|
+
'books': [
|
|
473
|
+
{ sku: 'B001', name: '编程指南' },
|
|
474
|
+
{ sku: 'B002', name: '设计模式' }
|
|
475
|
+
]
|
|
476
|
+
};
|
|
477
|
+
|
|
478
|
+
products = productData[categoryId] || [];
|
|
479
|
+
selectedProduct = null;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
$: loadProducts(selectedCategory);
|
|
483
|
+
</script>
|
|
484
|
+
|
|
485
|
+
<div class="product-selector">
|
|
486
|
+
<div class="selector-row">
|
|
487
|
+
<label>类别</label>
|
|
488
|
+
<OptionsSelect
|
|
489
|
+
options={categories}
|
|
490
|
+
keyField="id"
|
|
491
|
+
textField="name"
|
|
492
|
+
bind:value={selectedCategory}
|
|
493
|
+
variant="outlined"
|
|
494
|
+
placeholder="选择类别"
|
|
495
|
+
/>
|
|
496
|
+
</div>
|
|
497
|
+
|
|
498
|
+
<div class="selector-row">
|
|
499
|
+
<label>产品</label>
|
|
500
|
+
<OptionsSelect
|
|
501
|
+
options={products}
|
|
502
|
+
keyField="sku"
|
|
503
|
+
textField="name"
|
|
504
|
+
bind:value={selectedProduct}
|
|
505
|
+
variant="outlined"
|
|
506
|
+
placeholder={selectedCategory ? '选择产品' : '请先选择类别'}
|
|
507
|
+
disabled={!selectedCategory}
|
|
508
|
+
/>
|
|
509
|
+
</div>
|
|
510
|
+
</div>
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
## 自定义选项渲染
|
|
514
|
+
|
|
515
|
+
你可以提供一个自定义组件来渲染下拉选项:
|
|
516
|
+
|
|
517
|
+
```svelte
|
|
518
|
+
<!-- CustomItemRenderer.svelte -->
|
|
519
|
+
<script>
|
|
520
|
+
export let item;
|
|
521
|
+
export let disabled = false;
|
|
522
|
+
|
|
523
|
+
import { createEventDispatcher } from 'svelte';
|
|
524
|
+
const dispatch = createEventDispatcher();
|
|
525
|
+
|
|
526
|
+
function handleClick() {
|
|
527
|
+
if (!disabled) {
|
|
528
|
+
dispatch('click');
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
</script>
|
|
532
|
+
|
|
533
|
+
<div class="custom-item" class:disabled on:click={handleClick}>
|
|
534
|
+
<div class="item-icon">📌</div>
|
|
535
|
+
<div class="item-content">
|
|
536
|
+
<div class="item-title">{item.title}</div>
|
|
537
|
+
<div class="item-description">{item.description}</div>
|
|
538
|
+
</div>
|
|
539
|
+
</div>
|
|
540
|
+
|
|
541
|
+
<style>
|
|
542
|
+
.custom-item {
|
|
543
|
+
display: flex;
|
|
544
|
+
align-items: center;
|
|
545
|
+
padding: 12px;
|
|
546
|
+
cursor: pointer;
|
|
547
|
+
border-bottom: 1px solid #eee;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
.custom-item:hover:not(.disabled) {
|
|
551
|
+
background-color: #f5f5f5;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
.custom-item.disabled {
|
|
555
|
+
opacity: 0.5;
|
|
556
|
+
cursor: not-allowed;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
.item-icon {
|
|
560
|
+
margin-right: 12px;
|
|
561
|
+
font-size: 18px;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
.item-title {
|
|
565
|
+
font-weight: 600;
|
|
566
|
+
margin-bottom: 4px;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
.item-description {
|
|
570
|
+
font-size: 12px;
|
|
571
|
+
color: #666;
|
|
572
|
+
}
|
|
573
|
+
</style>
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
## 最佳实践
|
|
577
|
+
|
|
578
|
+
1. **选项管理**:保持选项列表专注且相关
|
|
579
|
+
2. **性能**:对于超大选项列表,考虑虚拟化
|
|
580
|
+
3. **可访问性**:提供清晰的标签和有意义的选项文本
|
|
581
|
+
4. **用户体验**:选择适合你设计的变体和尺寸
|
|
582
|
+
5. **数据验证**:处理选项缺失等边缘情况
|
|
583
|
+
6. **加载状态**:为动态选项显示加载指示器
|
|
584
|
+
7. **错误处理**:优雅处理动态选项的 API 失败
|
|
585
|
+
|
|
586
|
+
## 样式
|
|
587
|
+
|
|
588
|
+
```css
|
|
589
|
+
.options-popover {
|
|
590
|
+
max-height: 300px;
|
|
591
|
+
overflow-y: auto;
|
|
592
|
+
border: 1px solid #e0e0e0;
|
|
593
|
+
border-radius: 4px;
|
|
594
|
+
background: white;
|
|
595
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
.option-item {
|
|
599
|
+
padding: 8px 12px;
|
|
600
|
+
cursor: pointer;
|
|
601
|
+
border-bottom: 1px solid #f0f0f0;
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
.option-item:hover:not(.disabled) {
|
|
605
|
+
background-color: #f5f5f5;
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
.option-item.disabled {
|
|
609
|
+
opacity: 0.5;
|
|
610
|
+
cursor: not-allowed;
|
|
611
|
+
background-color: #fafafa;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
.option-item:last-child {
|
|
615
|
+
border-bottom: none;
|
|
616
|
+
}
|
|
617
|
+
```
|
|
618
|
+
|
|
619
|
+
## 可访问性
|
|
620
|
+
|
|
621
|
+
- 全面支持键盘导航(箭头键、回车、Esc键)
|
|
622
|
+
- 为屏幕阅读器提供 ARIA 标签和角色
|
|
623
|
+
- 焦点管理和视觉指示器
|
|
624
|
+
- 高对比度模式兼容性
|
|
625
|
+
- 适当的表单关联标签
|
|
626
|
+
|
|
627
|
+
## 相关组件
|
|
628
|
+
|
|
629
|
+
- [选项多选](../options-multi-select/README.md) - 用于多选选项
|
|
630
|
+
- [表单字段](../form-field/README.md) - 用于表单布局和标签
|
|
631
|
+
- [通用选择器](../common/README.md) - 基础选择器功能
|
|
632
|
+
- [查找编辑器](../lookup-editor/README.md) - 用于动态数据查找
|