@ticatec/uniface-element 0.2.4 → 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/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/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,498 @@
|
|
|
1
|
+
# 时间编辑器组件
|
|
2
|
+
|
|
3
|
+
一个专为时间输入设计的组件,具备交互式时间选择功能。支持键盘导航、自动验证,以及分钟和秒精度。时间以表示总分钟数的数字值存储(支持秒的 fractional 表示)。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @ticatec/uniface-element
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 导入
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import TimeEditor from "@ticatec/uniface-element/TimeEditor";
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 基本用法
|
|
18
|
+
|
|
19
|
+
```svelte
|
|
20
|
+
<script>
|
|
21
|
+
import TimeEditor from "@ticatec/uniface-element/TimeEditor";
|
|
22
|
+
|
|
23
|
+
let timeValue = null; // null 或数字(分钟数)
|
|
24
|
+
</script>
|
|
25
|
+
|
|
26
|
+
<TimeEditor bind:value={timeValue} />
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 属性
|
|
30
|
+
|
|
31
|
+
| 属性 | 类型 | 默认值 | 描述 |
|
|
32
|
+
|------|------|---------|-------------|
|
|
33
|
+
| `value` | `number \| null` | `null` | 时间值(分钟数,例如 90.5 = 1:30:30) |
|
|
34
|
+
| `precision` | `"M" \| "S"` | `"M"` | 时间精度 - 分钟或秒 |
|
|
35
|
+
| `mandatory` | `boolean` | `false` | 是否为必填字段(空字段显示零而不是下划线) |
|
|
36
|
+
| `disabled` | `boolean` | `false` | 输入框是否禁用 |
|
|
37
|
+
| `readonly` | `boolean` | `false` | 输入框是否只读 |
|
|
38
|
+
| `variant` | `"" \| "plain" \| "outlined" \| "filled"` | `""` | 输入框的视觉变体 |
|
|
39
|
+
| `compact` | `boolean` | `false` | 是否使用紧凑间距 |
|
|
40
|
+
| `style` | `string` | `""` | 附加 CSS 样式 |
|
|
41
|
+
| `prefix` | `string` | `""` | 显示的文本前缀 |
|
|
42
|
+
| `suffix` | `string` | `""` | 显示的文本后缀 |
|
|
43
|
+
| `displayMode` | `DisplayMode` | `DisplayMode.Edit` | 显示模式(编辑/查看) |
|
|
44
|
+
| `class` | `string` | `""` | CSS 类名 |
|
|
45
|
+
| `onchange` | `OnChangeHandler<number>` | `null` | 时间值更改时的回调函数 |
|
|
46
|
+
| `onfocus` | `((event: FocusEvent) => void) \| null` | `null` | 输入框获得焦点时的回调函数 |
|
|
47
|
+
| `onblur` | `((event: FocusEvent) => void) \| null` | `null` | 输入框失去焦点时的回调函数 |
|
|
48
|
+
|
|
49
|
+
## 功能
|
|
50
|
+
|
|
51
|
+
- **交互式选择**:点击或使用箭头键在时间段之间导航
|
|
52
|
+
- **自动验证**:防止无效时间输入(例如 25:70)
|
|
53
|
+
- **灵活精度**:支持分钟(HH:MM)和秒(HH:MM:SS)精度
|
|
54
|
+
- **清除功能**:内置清除按钮以重置时间
|
|
55
|
+
- **视觉反馈**:高亮显示当前光标所在的时间段
|
|
56
|
+
- **必填模式**:可选模式显示零而不是下划线用于必填字段
|
|
57
|
+
|
|
58
|
+
## 值格式
|
|
59
|
+
|
|
60
|
+
时间编辑器以表示总分钟数的数字存储时间:
|
|
61
|
+
- `90` = 1小时30分钟(01:30)
|
|
62
|
+
- `90.5` = 1小时30分钟30秒(01:30:30)
|
|
63
|
+
- `null` = 空/未设置时间
|
|
64
|
+
|
|
65
|
+
## 示例
|
|
66
|
+
|
|
67
|
+
### 基本时间输入(分钟)
|
|
68
|
+
|
|
69
|
+
```svelte
|
|
70
|
+
<script>
|
|
71
|
+
import TimeEditor from "@ticatec/uniface-element/TimeEditor";
|
|
72
|
+
|
|
73
|
+
let meetingTime = 570; // 9:30 AM (9*60 + 30 = 570 分钟)
|
|
74
|
+
</script>
|
|
75
|
+
|
|
76
|
+
<div class="form-group">
|
|
77
|
+
<label>会议时间:</label>
|
|
78
|
+
<TimeEditor bind:value={meetingTime} precision="M" />
|
|
79
|
+
</div>
|
|
80
|
+
|
|
81
|
+
<p>选择的时间:{meetingTime ? Math.floor(meetingTime / 60) + ':' + (meetingTime % 60).toString().padStart(2, '0') : '未设置'}</p>
|
|
82
|
+
|
|
83
|
+
<style>
|
|
84
|
+
.form-group {
|
|
85
|
+
margin-bottom: 16px;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
label {
|
|
89
|
+
display: block;
|
|
90
|
+
margin-bottom: 4px;
|
|
91
|
+
font-weight: 500;
|
|
92
|
+
}
|
|
93
|
+
</style>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### 带秒的时间输入
|
|
97
|
+
|
|
98
|
+
```svelte
|
|
99
|
+
<script>
|
|
100
|
+
import TimeEditor from "@ticatec/uniface-element/TimeEditor";
|
|
101
|
+
|
|
102
|
+
let duration = 125.75; // 2:05:45 (125 分钟 + 45 秒)
|
|
103
|
+
</script>
|
|
104
|
+
|
|
105
|
+
<div class="form-group">
|
|
106
|
+
<label>视频时长:</label>
|
|
107
|
+
<TimeEditor bind:value={duration} precision="S" />
|
|
108
|
+
</div>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 带事件处理程序
|
|
112
|
+
|
|
113
|
+
```svelte
|
|
114
|
+
<script>
|
|
115
|
+
import TimeEditor from "@ticatec/uniface-element/TimeEditor";
|
|
116
|
+
|
|
117
|
+
let scheduleTime = null;
|
|
118
|
+
let isFocused = false;
|
|
119
|
+
|
|
120
|
+
function handleTimeChange(newTime) {
|
|
121
|
+
console.log('时间更改:', newTime);
|
|
122
|
+
if (newTime !== null) {
|
|
123
|
+
const hours = Math.floor(newTime / 60);
|
|
124
|
+
const minutes = Math.floor(newTime % 60);
|
|
125
|
+
const seconds = Math.floor((newTime % 1) * 60);
|
|
126
|
+
console.log(`时间:${hours}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function handleFocus(event) {
|
|
131
|
+
console.log('时间编辑器已聚焦');
|
|
132
|
+
isFocused = true;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function handleBlur(event) {
|
|
136
|
+
console.log('时间编辑器已失焦');
|
|
137
|
+
isFocused = false;
|
|
138
|
+
}
|
|
139
|
+
</script>
|
|
140
|
+
|
|
141
|
+
<TimeEditor
|
|
142
|
+
bind:value={scheduleTime}
|
|
143
|
+
precision="S"
|
|
144
|
+
onchange={handleTimeChange}
|
|
145
|
+
onfocus={handleFocus}
|
|
146
|
+
onblur={handleBlur}
|
|
147
|
+
/>
|
|
148
|
+
|
|
149
|
+
{#if isFocused}
|
|
150
|
+
<p>时间编辑器处于活动状态 - 使用箭头键导航,数字键输入</p>
|
|
151
|
+
{/if}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### 必填模式
|
|
155
|
+
|
|
156
|
+
```svelte
|
|
157
|
+
<script>
|
|
158
|
+
import TimeEditor from "@ticatec/uniface-element/TimeEditor";
|
|
159
|
+
|
|
160
|
+
let time1 = null;
|
|
161
|
+
let time2 = null;
|
|
162
|
+
</script>
|
|
163
|
+
|
|
164
|
+
<!-- 可选模式(显示下划线) -->
|
|
165
|
+
<div class="form-group">
|
|
166
|
+
<label>可选时间:</label>
|
|
167
|
+
<TimeEditor bind:value={time1} mandatory={false} />
|
|
168
|
+
</div>
|
|
169
|
+
|
|
170
|
+
<!-- 必填模式(显示零) -->
|
|
171
|
+
<div class="form-group">
|
|
172
|
+
<label>必填时间:</label>
|
|
173
|
+
<TimeEditor bind:value={time2} mandatory={true} />
|
|
174
|
+
</div>
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### 不同变体
|
|
178
|
+
|
|
179
|
+
```svelte
|
|
180
|
+
<script>
|
|
181
|
+
import TimeEditor from "@ticatec/uniface-element/TimeEditor";
|
|
182
|
+
|
|
183
|
+
let time1 = 480; // 8:00
|
|
184
|
+
let time2 = 540; // 9:00
|
|
185
|
+
let time3 = 600; // 10:00
|
|
186
|
+
</script>
|
|
187
|
+
|
|
188
|
+
<!-- 默认变体 -->
|
|
189
|
+
<TimeEditor bind:value={time1} />
|
|
190
|
+
|
|
191
|
+
<!-- 轮廓变体 -->
|
|
192
|
+
<TimeEditor bind:value={time2} variant="outlined" />
|
|
193
|
+
|
|
194
|
+
<!-- 填充变体 -->
|
|
195
|
+
<TimeEditor bind:value={time3} variant="filled" />
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### 带前缀和后缀
|
|
199
|
+
|
|
200
|
+
```svelte
|
|
201
|
+
<script>
|
|
202
|
+
import TimeEditor from "@ticatec/uniface-element/TimeEditor";
|
|
203
|
+
|
|
204
|
+
let startTime = 480; // 8:00 AM
|
|
205
|
+
let duration = 120; // 2:00 小时
|
|
206
|
+
</script>
|
|
207
|
+
|
|
208
|
+
<div class="form-group">
|
|
209
|
+
<label>开始时间:</label>
|
|
210
|
+
<TimeEditor bind:value={startTime} suffix=" 上午" />
|
|
211
|
+
</div>
|
|
212
|
+
|
|
213
|
+
<div class="form-group">
|
|
214
|
+
<label>持续时间:</label>
|
|
215
|
+
<TimeEditor bind:value={duration} prefix="持续时间:" suffix=" 小时" />
|
|
216
|
+
</div>
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### 日程表单示例
|
|
220
|
+
|
|
221
|
+
```svelte
|
|
222
|
+
<script>
|
|
223
|
+
import TimeEditor from "@ticatec/uniface-element/TimeEditor";
|
|
224
|
+
import Button from "@ticatec/uniface-element/Button";
|
|
225
|
+
import TextEditor from "@ticatec/uniface-element/TextEditor";
|
|
226
|
+
|
|
227
|
+
let schedule = {
|
|
228
|
+
title: '',
|
|
229
|
+
startTime: null,
|
|
230
|
+
endTime: null,
|
|
231
|
+
breakDuration: 15 // 15 分钟
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
$: totalDuration = schedule.startTime !== null && schedule.endTime !== null
|
|
235
|
+
? schedule.endTime - schedule.startTime - schedule.breakDuration
|
|
236
|
+
: 0;
|
|
237
|
+
|
|
238
|
+
function formatTime(minutes) {
|
|
239
|
+
if (minutes === null) return '未设置';
|
|
240
|
+
const hours = Math.floor(minutes / 60);
|
|
241
|
+
const mins = Math.floor(minutes % 60);
|
|
242
|
+
return `${hours}:${mins.toString().padStart(2, '0')}`;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
function handleSubmit() {
|
|
246
|
+
console.log('日程:', schedule);
|
|
247
|
+
}
|
|
248
|
+
</script>
|
|
249
|
+
|
|
250
|
+
<div class="schedule-form">
|
|
251
|
+
<h3>创建日程</h3>
|
|
252
|
+
|
|
253
|
+
<div class="form-field">
|
|
254
|
+
<label>事件标题</label>
|
|
255
|
+
<TextEditor bind:value={schedule.title} placeholder="输入事件标题" />
|
|
256
|
+
</div>
|
|
257
|
+
|
|
258
|
+
<div class="form-row">
|
|
259
|
+
<div class="form-field">
|
|
260
|
+
<label>开始时间</label>
|
|
261
|
+
<TimeEditor bind:value={schedule.startTime} precision="M" />
|
|
262
|
+
</div>
|
|
263
|
+
|
|
264
|
+
<div class="form-field">
|
|
265
|
+
<label>结束时间</label>
|
|
266
|
+
<TimeEditor bind:value={schedule.endTime} precision="M" />
|
|
267
|
+
</div>
|
|
268
|
+
</div>
|
|
269
|
+
|
|
270
|
+
<div class="form-field">
|
|
271
|
+
<label>休息时间(分钟)</label>
|
|
272
|
+
<TimeEditor bind:value={schedule.breakDuration} precision="M" />
|
|
273
|
+
</div>
|
|
274
|
+
|
|
275
|
+
{#if totalDuration > 0}
|
|
276
|
+
<div class="summary">
|
|
277
|
+
<p><strong>概要:</strong></p>
|
|
278
|
+
<p>持续时间:{formatTime(totalDuration)}(不包括休息时间)</p>
|
|
279
|
+
<p>开始:{formatTime(schedule.startTime)} - 结束:{formatTime(schedule.endTime)}</p>
|
|
280
|
+
</div>
|
|
281
|
+
{/if}
|
|
282
|
+
|
|
283
|
+
<Button
|
|
284
|
+
type="primary"
|
|
285
|
+
label="创建日程"
|
|
286
|
+
onClick={handleSubmit}
|
|
287
|
+
disabled={!schedule.title || schedule.startTime === null || schedule.endTime === null}
|
|
288
|
+
/>
|
|
289
|
+
</div>
|
|
290
|
+
|
|
291
|
+
<style>
|
|
292
|
+
.schedule-form {
|
|
293
|
+
max-width: 500px;
|
|
294
|
+
padding: 24px;
|
|
295
|
+
border: 1px solid #ddd;
|
|
296
|
+
border-radius: 8px;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
h3 {
|
|
300
|
+
margin-bottom: 24px;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
.form-row {
|
|
304
|
+
display: grid;
|
|
305
|
+
grid-template-columns: 1fr 1fr;
|
|
306
|
+
gap: 16px;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
.form-field {
|
|
310
|
+
margin-bottom: 16px;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
label {
|
|
314
|
+
display: block;
|
|
315
|
+
margin-bottom: 4px;
|
|
316
|
+
font-weight: 500;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
.summary {
|
|
320
|
+
background: #f8f9fa;
|
|
321
|
+
padding: 16px;
|
|
322
|
+
border-radius: 4px;
|
|
323
|
+
margin-bottom: 16px;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
.summary p {
|
|
327
|
+
margin: 0 0 4px 0;
|
|
328
|
+
}
|
|
329
|
+
</style>
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### 禁用和只读状态
|
|
333
|
+
|
|
334
|
+
```svelte
|
|
335
|
+
<script>
|
|
336
|
+
import TimeEditor from "@ticatec/uniface-element/TimeEditor";
|
|
337
|
+
|
|
338
|
+
let normalTime = 540; // 9:00
|
|
339
|
+
let readonlyTime = 600; // 10:00
|
|
340
|
+
let disabledTime = null;
|
|
341
|
+
</script>
|
|
342
|
+
|
|
343
|
+
<!-- 正常时间输入 -->
|
|
344
|
+
<TimeEditor bind:value={normalTime} />
|
|
345
|
+
|
|
346
|
+
<!-- 只读时间输入 -->
|
|
347
|
+
<TimeEditor bind:value={readonlyTime} readonly />
|
|
348
|
+
|
|
349
|
+
<!-- 禁用时间输入 -->
|
|
350
|
+
<TimeEditor bind:value={disabledTime} disabled />
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### 计时器/秒表示例
|
|
354
|
+
|
|
355
|
+
```svelte
|
|
356
|
+
<script>
|
|
357
|
+
import TimeEditor from "@ticatec/uniface-element/TimeEditor";
|
|
358
|
+
import Button from "@ticatec/uniface-element/Button";
|
|
359
|
+
|
|
360
|
+
let timerDuration = 5; // 5 分钟
|
|
361
|
+
let currentTime = 0;
|
|
362
|
+
let isRunning = false;
|
|
363
|
+
let interval;
|
|
364
|
+
|
|
365
|
+
function startTimer() {
|
|
366
|
+
if (timerDuration > 0) {
|
|
367
|
+
currentTime = timerDuration;
|
|
368
|
+
isRunning = true;
|
|
369
|
+
|
|
370
|
+
interval = setInterval(() => {
|
|
371
|
+
currentTime -= 1/60; // 减去 1 秒(1/60 分钟)
|
|
372
|
+
|
|
373
|
+
if (currentTime <= 0) {
|
|
374
|
+
currentTime = 0;
|
|
375
|
+
stopTimer();
|
|
376
|
+
alert('计时器结束!');
|
|
377
|
+
}
|
|
378
|
+
}, 1000);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
function stopTimer() {
|
|
383
|
+
isRunning = false;
|
|
384
|
+
if (interval) {
|
|
385
|
+
clearInterval(interval);
|
|
386
|
+
interval = null;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
function resetTimer() {
|
|
391
|
+
stopTimer();
|
|
392
|
+
currentTime = 0;
|
|
393
|
+
}
|
|
394
|
+
</script>
|
|
395
|
+
|
|
396
|
+
<div class="timer-container">
|
|
397
|
+
<h3>计时器</h3>
|
|
398
|
+
|
|
399
|
+
<div class="form-field">
|
|
400
|
+
<label>设置持续时间:</label>
|
|
401
|
+
<TimeEditor bind:value={timerDuration} precision="S" disabled={isRunning} />
|
|
402
|
+
</div>
|
|
403
|
+
|
|
404
|
+
<div class="form-field">
|
|
405
|
+
<label>剩余时间:</label>
|
|
406
|
+
<TimeEditor bind:value={currentTime} precision="S" readonly />
|
|
407
|
+
</div>
|
|
408
|
+
|
|
409
|
+
<div class="timer-controls">
|
|
410
|
+
{#if !isRunning}
|
|
411
|
+
<Button label="开始" onClick={startTimer} disabled={timerDuration <= 0} />
|
|
412
|
+
{:else}
|
|
413
|
+
<Button label="停止" onClick={stopTimer} />
|
|
414
|
+
{/if}
|
|
415
|
+
<Button label="重置" onClick={resetTimer} />
|
|
416
|
+
</div>
|
|
417
|
+
</div>
|
|
418
|
+
|
|
419
|
+
<style>
|
|
420
|
+
.timer-container {
|
|
421
|
+
max-width: 300px;
|
|
422
|
+
padding: 20px;
|
|
423
|
+
border: 1px solid #ddd;
|
|
424
|
+
border-radius: 8px;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
.form-field {
|
|
428
|
+
margin-bottom: 16px;
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
label {
|
|
432
|
+
display: block;
|
|
433
|
+
margin-bottom: 4px;
|
|
434
|
+
font-weight: 500;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
.timer-controls {
|
|
438
|
+
display: flex;
|
|
439
|
+
gap: 8px;
|
|
440
|
+
}
|
|
441
|
+
</style>
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
## 键盘导航
|
|
445
|
+
|
|
446
|
+
| 按键 | 操作 |
|
|
447
|
+
|-----|--------|
|
|
448
|
+
| `左箭头/上箭头` | 将光标移动到上一个时间段 |
|
|
449
|
+
| `右箭头/下箭头` | 将光标移动到下一个时间段 |
|
|
450
|
+
| `0-9` | 在当前光标位置输入数字 |
|
|
451
|
+
| `删除` | 清除当前时间段 |
|
|
452
|
+
| `退格` | 清除当前时间段并将光标后移 |
|
|
453
|
+
| `Tab` | 将焦点移动到下一个元素 |
|
|
454
|
+
|
|
455
|
+
## 时间格式
|
|
456
|
+
|
|
457
|
+
- **显示格式**:根据精度显示为 HH:MM 或 HH:MM:SS
|
|
458
|
+
- **存储格式**:表示总分钟数的数字值
|
|
459
|
+
- **范围**:00:00 至 23:59(0 至 1439 分钟)
|
|
460
|
+
- **秒**:以分钟的小数形式存储(30 秒 = 0.5 分钟)
|
|
461
|
+
|
|
462
|
+
## 行为
|
|
463
|
+
|
|
464
|
+
1. **焦点**:点击输入框聚焦并选中第一个时间段
|
|
465
|
+
2. **导航**:箭头键在小时、分钟和秒段之间移动
|
|
466
|
+
3. **输入**:数字键替换当前时间段的值
|
|
467
|
+
4. **验证**:自动拒绝无效时间
|
|
468
|
+
5. **清除**:清除按钮重置为空状态
|
|
469
|
+
6. **失焦**:验证并提交最终时间值
|
|
470
|
+
|
|
471
|
+
## 可访问性
|
|
472
|
+
|
|
473
|
+
- 在时间段之间提供适当的键盘导航
|
|
474
|
+
- 语义化 HTML 结构,兼容屏幕阅读器
|
|
475
|
+
- 当前时间段的焦点指示器
|
|
476
|
+
- 交互状态的清晰视觉反馈
|
|
477
|
+
|
|
478
|
+
## 最佳实践
|
|
479
|
+
|
|
480
|
+
1. **精度**:对大多数日程应用使用分钟精度
|
|
481
|
+
2. **验证**:如有需要,在更改处理程序中实现额外验证
|
|
482
|
+
3. **标签**:提供清晰的标签,描述预期的时间格式
|
|
483
|
+
4. **默认值**:考虑提供合理的默认时间
|
|
484
|
+
5. **范围验证**:在应用逻辑中验证时间范围
|
|
485
|
+
|
|
486
|
+
## 浏览器支持
|
|
487
|
+
|
|
488
|
+
- 支持完整输入事件的现代浏览器
|
|
489
|
+
- 兼容 Svelte 5+
|
|
490
|
+
- 支持键盘导航
|
|
491
|
+
- 触控友好界面
|
|
492
|
+
|
|
493
|
+
## 相关组件
|
|
494
|
+
|
|
495
|
+
- `DatePicker` - 日期选择组件
|
|
496
|
+
- `DateTimePicker` - 日期和时间组合选择
|
|
497
|
+
- `NumberEditor` - 数字输入验证
|
|
498
|
+
- `TextEditor` - 基本文本输入组件
|
|
@@ -19,7 +19,9 @@
|
|
|
19
19
|
export let suffix: string = '';
|
|
20
20
|
export let prefix: string = '';
|
|
21
21
|
export let displayMode: DisplayMode = DisplayMode.Edit;
|
|
22
|
-
export let
|
|
22
|
+
export let onchange: OnChangeHandler<number> = null as unknown as OnChangeHandler<number>;
|
|
23
|
+
export let onfocus: ((event: FocusEvent) => void) | null = null;
|
|
24
|
+
export let onblur: ((event: FocusEvent) => void) | null = null;
|
|
23
25
|
|
|
24
26
|
let className: string = '';
|
|
25
27
|
let editor: any;
|
|
@@ -38,6 +40,7 @@
|
|
|
38
40
|
if (!readonly) {
|
|
39
41
|
editor.setSelectionRange(cursorIndex, cursorIndex + 1);
|
|
40
42
|
}
|
|
43
|
+
onfocus?.(e);
|
|
41
44
|
}
|
|
42
45
|
|
|
43
46
|
const toTimeText = (v: number): string => {
|
|
@@ -66,10 +69,11 @@
|
|
|
66
69
|
value = toTimeValue();
|
|
67
70
|
}
|
|
68
71
|
if (oldValue != value) {
|
|
69
|
-
|
|
72
|
+
onchange?.(value);
|
|
73
|
+
oldValue = value;
|
|
70
74
|
}
|
|
71
|
-
|
|
72
75
|
}
|
|
76
|
+
onblur?.(e);
|
|
73
77
|
}
|
|
74
78
|
|
|
75
79
|
const moveCursor = (direction: number) => {
|
|
@@ -26,7 +26,9 @@ declare const TimeEditor: $$__sveltets_2_IsomorphicComponent<{
|
|
|
26
26
|
suffix?: string;
|
|
27
27
|
prefix?: string;
|
|
28
28
|
displayMode?: DisplayMode;
|
|
29
|
-
|
|
29
|
+
onchange?: OnChangeHandler<number>;
|
|
30
|
+
onfocus?: ((event: FocusEvent) => void) | null;
|
|
31
|
+
onblur?: ((event: FocusEvent) => void) | null;
|
|
30
32
|
}, {
|
|
31
33
|
[evt: string]: CustomEvent<any>;
|
|
32
34
|
}, {
|