@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
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
|
|
3
|
-
import {onMount, tick} from "svelte";
|
|
4
3
|
import {DisplayMode} from "../common/DisplayMode";
|
|
5
4
|
import dayjs from "dayjs";
|
|
6
5
|
import Calendar from "../base-calendar";
|
|
@@ -19,7 +18,9 @@
|
|
|
19
18
|
export let displayMode: DisplayMode = DisplayMode.Edit;
|
|
20
19
|
export let min: UniDate = null;
|
|
21
20
|
export let max: UniDate = null;
|
|
22
|
-
export let
|
|
21
|
+
export let onchange: OnChangeHandler<Date> = null as unknown as OnChangeHandler<Date>;
|
|
22
|
+
export let onfocus: (() => void) | null = null;
|
|
23
|
+
export let onblur: (() => void) | null = null;
|
|
23
24
|
export const setFocus = () => {
|
|
24
25
|
setTimeout(()=> {
|
|
25
26
|
editor && editor.focus();
|
|
@@ -30,34 +31,45 @@
|
|
|
30
31
|
let textValue: string;
|
|
31
32
|
let editor: any;
|
|
32
33
|
let oldValue = value;
|
|
34
|
+
let hasFocus: boolean = false;
|
|
35
|
+
let isUserChange: boolean = false;
|
|
33
36
|
|
|
34
|
-
onMount(() => {
|
|
35
|
-
})
|
|
36
37
|
|
|
37
38
|
const generateText = (v: string) => {
|
|
38
39
|
textValue = value == null ? '' : dayjs(value).format('YYYY-MM-DD');
|
|
39
40
|
}
|
|
40
41
|
|
|
41
42
|
const openPopup = () => {
|
|
42
|
-
editor.focus();
|
|
43
43
|
showPopup = true;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
$: generateText(value);
|
|
47
47
|
|
|
48
48
|
$: if (oldValue != value) {
|
|
49
|
+
if (isUserChange) {
|
|
50
|
+
if (value != null) {
|
|
51
|
+
// 确保传递的是Date对象
|
|
52
|
+
const dateValue = value instanceof Date ? value : (dayjs.isDayjs(value) ? value.toDate() : new Date(value));
|
|
53
|
+
onchange?.(dateValue);
|
|
54
|
+
} else {
|
|
55
|
+
onchange?.(null);
|
|
56
|
+
}
|
|
57
|
+
isUserChange = false;
|
|
58
|
+
}
|
|
49
59
|
oldValue = value;
|
|
50
|
-
onChange?.(value);
|
|
51
60
|
}
|
|
52
61
|
|
|
53
62
|
const handleCalendarSelect = (d: dayjs.Dayjs) => {
|
|
63
|
+
isUserChange = true;
|
|
54
64
|
value = d.toDate();
|
|
55
65
|
showPopup = false;
|
|
66
|
+
editor.focus();
|
|
56
67
|
}
|
|
57
68
|
|
|
58
69
|
const handleKeyDown = (e: KeyboardEvent) => {
|
|
59
70
|
if (!disabled) {
|
|
60
71
|
if (e.key == 'Backspace' || e.key == 'Delete') {
|
|
72
|
+
isUserChange = true;
|
|
61
73
|
value = null;
|
|
62
74
|
textValue = '';
|
|
63
75
|
showPopup = false;
|
|
@@ -78,16 +90,41 @@
|
|
|
78
90
|
let showPopup: boolean = false;
|
|
79
91
|
|
|
80
92
|
const cleanData = () => {
|
|
93
|
+
isUserChange = true;
|
|
81
94
|
value = null;
|
|
82
95
|
}
|
|
83
96
|
|
|
97
|
+
const handleFocus = () => {
|
|
98
|
+
if (!hasFocus) {
|
|
99
|
+
hasFocus = true;
|
|
100
|
+
onfocus?.();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const handleBlur = (event: FocusEvent) => {
|
|
105
|
+
if (!showPopup) {
|
|
106
|
+
hasFocus = false;
|
|
107
|
+
onblur?.();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// 监听popup关闭,如果是点击外部关闭且之前有焦点,触发blur
|
|
112
|
+
$: if (!showPopup && hasFocus) {
|
|
113
|
+
setTimeout(() => {
|
|
114
|
+
if (document.activeElement !== editor) {
|
|
115
|
+
hasFocus = false;
|
|
116
|
+
onblur?.();
|
|
117
|
+
}
|
|
118
|
+
}, 50);
|
|
119
|
+
}
|
|
120
|
+
|
|
84
121
|
</script>
|
|
85
122
|
|
|
86
123
|
<CommonPicker {displayMode} {variant} {style} className="uniface-date-time-editor" {compact} dropDownIcon="icon_google_event_available"
|
|
87
124
|
bind:showPopup canClean={!mandatory && value!=null} autoFit={false} clean={cleanData} {textValue} {readonly} {disabled}>
|
|
88
125
|
|
|
89
126
|
<input style="width: 100%" bind:this={editor} on:click={openPopup} {placeholder} on:keydown={handleKeyDown}
|
|
90
|
-
class="text-editor" bind:value={textValue} on:blur on:focus/>
|
|
127
|
+
class="text-editor" bind:value={textValue} on:blur={handleBlur} on:focus={handleFocus}/>
|
|
91
128
|
|
|
92
129
|
<div class="date-popover" slot="popup-panel">
|
|
93
130
|
<Calendar {value} {min} {max} onSelect={handleCalendarSelect}/>
|
|
@@ -26,12 +26,11 @@ declare const DatePicker: $$__sveltets_2_IsomorphicComponent<{
|
|
|
26
26
|
displayMode?: DisplayMode;
|
|
27
27
|
min?: UniDate;
|
|
28
28
|
max?: UniDate;
|
|
29
|
-
|
|
29
|
+
onchange?: OnChangeHandler<Date>;
|
|
30
|
+
onfocus?: (() => void) | null;
|
|
31
|
+
onblur?: (() => void) | null;
|
|
30
32
|
setFocus?: () => void;
|
|
31
33
|
}, {
|
|
32
|
-
blur: FocusEvent;
|
|
33
|
-
focus: FocusEvent;
|
|
34
|
-
} & {
|
|
35
34
|
[evt: string]: CustomEvent<any>;
|
|
36
35
|
}, {}, {
|
|
37
36
|
setFocus: () => void;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
|
|
3
|
-
import {onMount, tick} from "svelte";
|
|
4
3
|
import dayjs from "dayjs";
|
|
5
4
|
import {DisplayMode} from "../common/DisplayMode";
|
|
6
5
|
import dateUtils, {type UniDate} from "../base-calendar/dateUtils";
|
|
@@ -23,7 +22,9 @@
|
|
|
23
22
|
export let compact: boolean = false;
|
|
24
23
|
export let variant: '' | 'plain' | 'outlined' | 'filled' = '';
|
|
25
24
|
export let mandatory: boolean = false;
|
|
26
|
-
export let
|
|
25
|
+
export let onchange: OnChangeHandler<Date> = null as unknown as OnChangeHandler<Date>;
|
|
26
|
+
export let onfocus: (() => void) | null = null;
|
|
27
|
+
export let onblur: (() => void) | null = null;
|
|
27
28
|
export const setFocus = () => {
|
|
28
29
|
setTimeout(()=> {
|
|
29
30
|
editor && editor.focus();
|
|
@@ -34,6 +35,7 @@
|
|
|
34
35
|
let confirmText = i18nRes.calendar.confirmText;
|
|
35
36
|
let textValue: string;
|
|
36
37
|
let editor: any;
|
|
38
|
+
let hasFocus: boolean = false;
|
|
37
39
|
|
|
38
40
|
let currentValue: dayjs.Dayjs;
|
|
39
41
|
|
|
@@ -47,9 +49,6 @@
|
|
|
47
49
|
|
|
48
50
|
let btnDisabled;
|
|
49
51
|
|
|
50
|
-
onMount(async () => {
|
|
51
|
-
|
|
52
|
-
})
|
|
53
52
|
|
|
54
53
|
const openPopup = () => {
|
|
55
54
|
displayTime = dateUtils.formatDate(currentValue, format);
|
|
@@ -79,9 +78,10 @@
|
|
|
79
78
|
const confirm = async () => {
|
|
80
79
|
if (dateUtils.toDayjs(value)?.toDate() != currentValue.toDate()) {
|
|
81
80
|
value = currentValue;
|
|
82
|
-
|
|
81
|
+
onchange?.(currentValue.toDate());
|
|
83
82
|
}
|
|
84
83
|
showPopup = false;
|
|
84
|
+
editor.focus();
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
let displayTime: string = '';
|
|
@@ -119,19 +119,43 @@
|
|
|
119
119
|
value = null;
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
+
const handleFocus = () => {
|
|
123
|
+
if (!hasFocus) {
|
|
124
|
+
hasFocus = true;
|
|
125
|
+
onfocus?.();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const handleBlur = (event: FocusEvent) => {
|
|
130
|
+
if (!showPopup) {
|
|
131
|
+
hasFocus = false;
|
|
132
|
+
onblur?.();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// 监听popup关闭,如果是点击外部关闭且之前有焦点,触发blur
|
|
137
|
+
$: if (!showPopup && hasFocus) {
|
|
138
|
+
setTimeout(() => {
|
|
139
|
+
if (document.activeElement !== editor) {
|
|
140
|
+
hasFocus = false;
|
|
141
|
+
onblur?.();
|
|
142
|
+
}
|
|
143
|
+
}, 50);
|
|
144
|
+
}
|
|
145
|
+
|
|
122
146
|
</script>
|
|
123
147
|
|
|
124
148
|
<CommonPicker {displayMode} {variant} {style} className="uniface-date-time-editor" {compact} dropDownIcon="icon_google_access_time"
|
|
125
149
|
bind:showPopup canClean={!mandatory && value!=null} autoFit={false} clean={cleanData} {textValue} {readonly} {disabled}>
|
|
126
150
|
|
|
127
151
|
<input style="width: 100%" bind:this={editor} on:click={openPopup} {placeholder} on:keydown={handleKeyDown}
|
|
128
|
-
class="text-editor" bind:value={textValue} on:blur on:focus/>
|
|
152
|
+
class="text-editor" bind:value={textValue} on:blur={handleBlur} on:focus={handleFocus}/>
|
|
129
153
|
|
|
130
154
|
<div class="date-popover" slot="popup-panel">
|
|
131
155
|
<div style="display: flex; flex-direction: row">
|
|
132
156
|
<Calendar style="border-right: 1px solid var(--uniface-inside-border-color, #f0f0f0)" value={currentValue}
|
|
133
157
|
onSelect={handleCalendarSelect} {min} {max}/>
|
|
134
|
-
<TimePanel style="width: 120px" value={currentValue} {precision}
|
|
158
|
+
<TimePanel style="width: 120px" value={currentValue} {precision} onchange={handleTimeChange}/>
|
|
135
159
|
</div>
|
|
136
160
|
<div style="border-top: 1px solid var(--uniface-inside-border-color, #f0f0f0); display: flex; flex-direction: row; box-sizing: border-box; padding: 4px 8px; text-align: left; align-items: center">
|
|
137
161
|
<div style="flex: 1 1 auto">
|
|
@@ -27,12 +27,11 @@ declare const DateTimePicker: $$__sveltets_2_IsomorphicComponent<{
|
|
|
27
27
|
compact?: boolean;
|
|
28
28
|
variant?: "" | "plain" | "outlined" | "filled";
|
|
29
29
|
mandatory?: boolean;
|
|
30
|
-
|
|
30
|
+
onchange?: OnChangeHandler<Date>;
|
|
31
|
+
onfocus?: (() => void) | null;
|
|
32
|
+
onblur?: (() => void) | null;
|
|
31
33
|
setFocus?: () => void;
|
|
32
34
|
}, {
|
|
33
|
-
blur: FocusEvent;
|
|
34
|
-
focus: FocusEvent;
|
|
35
|
-
} & {
|
|
36
35
|
[evt: string]: CustomEvent<any>;
|
|
37
36
|
}, {}, {
|
|
38
37
|
setFocus: () => void;
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
# DatePicker & DateTimePicker Components
|
|
2
|
+
|
|
3
|
+
A comprehensive date and time selection component library built with Svelte, providing flexible date and datetime picking functionality with various display modes and configurations.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **DatePicker**: Simple date selection with calendar popup
|
|
8
|
+
- **DateTimePicker**: Date and time selection with calendar and time panel
|
|
9
|
+
- Multiple visual variants (plain, outlined, filled)
|
|
10
|
+
- Keyboard navigation support
|
|
11
|
+
- Min/max date restrictions
|
|
12
|
+
- Mandatory field support
|
|
13
|
+
- Readonly and disabled states
|
|
14
|
+
- Display-only mode for read-only presentation
|
|
15
|
+
- International date formatting
|
|
16
|
+
- Accessible design with ARIA support
|
|
17
|
+
|
|
18
|
+
## Installation
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install @ticatec/uniface-element
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import DatePicker from '@ticatec/uniface-element/DatePicker';
|
|
26
|
+
import DateTimePicker from '@ticatec/uniface-element/DateTimePicker';
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Or if using within the same project:
|
|
30
|
+
```typescript
|
|
31
|
+
import DatePicker from '$lib/date-picker';
|
|
32
|
+
import { DateTimePicker } from '$lib/date-picker';
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## DatePicker
|
|
36
|
+
|
|
37
|
+
### Basic Usage
|
|
38
|
+
|
|
39
|
+
```svelte
|
|
40
|
+
<script>
|
|
41
|
+
import DatePicker from '$lib/date-picker';
|
|
42
|
+
|
|
43
|
+
let selectedDate = null;
|
|
44
|
+
</script>
|
|
45
|
+
|
|
46
|
+
<DatePicker bind:value={selectedDate} placeholder="Select date" />
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Props
|
|
50
|
+
|
|
51
|
+
| Prop | Type | Default | Description |
|
|
52
|
+
|------|------|---------|-------------|
|
|
53
|
+
| `value` | `Date \| null` | `null` | Selected date value |
|
|
54
|
+
| `variant` | `'' \| 'plain' \| 'outlined' \| 'filled'` | `''` | Visual style variant |
|
|
55
|
+
| `disabled` | `boolean` | `false` | Disables the picker |
|
|
56
|
+
| `readonly` | `boolean` | `false` | Makes the picker read-only |
|
|
57
|
+
| `compact` | `boolean` | `false` | Compact display mode |
|
|
58
|
+
| `mandatory` | `boolean` | `false` | Required field (hides clear button) |
|
|
59
|
+
| `style` | `string` | `''` | Custom CSS styles |
|
|
60
|
+
| `placeholder` | `string` | `""` | Input placeholder text |
|
|
61
|
+
| `displayMode` | `DisplayMode` | `DisplayMode.Edit` | Display mode (Edit/View) |
|
|
62
|
+
| `min` | `UniDate` | `null` | Minimum selectable date |
|
|
63
|
+
| `max` | `UniDate` | `null` | Maximum selectable date |
|
|
64
|
+
| `onchange` | `OnChangeHandler<Date>` | `null` | Change event handler |
|
|
65
|
+
| `onfocus` | `() => void` | `null` | Focus event handler |
|
|
66
|
+
| `onblur` | `() => void` | `null` | Blur event handler |
|
|
67
|
+
|
|
68
|
+
### Methods
|
|
69
|
+
|
|
70
|
+
| Method | Description |
|
|
71
|
+
|--------|-------------|
|
|
72
|
+
| `setFocus()` | Programmatically focus the picker |
|
|
73
|
+
|
|
74
|
+
### Examples
|
|
75
|
+
|
|
76
|
+
#### Basic Date Picker
|
|
77
|
+
```svelte
|
|
78
|
+
<DatePicker bind:value={enrolmentDate} placeholder="Select enrolment date" />
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
#### Outlined Mandatory Date Picker
|
|
82
|
+
```svelte
|
|
83
|
+
<DatePicker
|
|
84
|
+
variant="outlined"
|
|
85
|
+
mandatory
|
|
86
|
+
bind:value={birthday}
|
|
87
|
+
placeholder="Date of birth (required)"
|
|
88
|
+
/>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
#### Filled Date Picker
|
|
92
|
+
```svelte
|
|
93
|
+
<DatePicker
|
|
94
|
+
variant="filled"
|
|
95
|
+
bind:value={admissionDate}
|
|
96
|
+
placeholder="Admission date"
|
|
97
|
+
/>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
#### Date Picker with Min/Max Restrictions
|
|
101
|
+
```svelte
|
|
102
|
+
<!-- Only allow dates up to today -->
|
|
103
|
+
<DatePicker
|
|
104
|
+
variant="filled"
|
|
105
|
+
max={new Date()}
|
|
106
|
+
bind:value={completedDate}
|
|
107
|
+
placeholder="Completion date"
|
|
108
|
+
/>
|
|
109
|
+
|
|
110
|
+
<!-- Only allow dates from tomorrow onwards -->
|
|
111
|
+
<DatePicker
|
|
112
|
+
variant="filled"
|
|
113
|
+
min={new Date()}
|
|
114
|
+
bind:value={bookFrom}
|
|
115
|
+
placeholder="Booking start date"
|
|
116
|
+
/>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
#### Disabled and Readonly States
|
|
120
|
+
```svelte
|
|
121
|
+
<!-- Disabled -->
|
|
122
|
+
<DatePicker variant="filled" disabled bind:value={admissionDate} />
|
|
123
|
+
|
|
124
|
+
<!-- Readonly -->
|
|
125
|
+
<DatePicker variant="filled" readonly bind:value={admissionDate} />
|
|
126
|
+
|
|
127
|
+
<!-- Display only mode -->
|
|
128
|
+
<DatePicker
|
|
129
|
+
displayMode={DisplayMode.View}
|
|
130
|
+
variant="filled"
|
|
131
|
+
readonly
|
|
132
|
+
bind:value={admissionDate}
|
|
133
|
+
/>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## DateTimePicker
|
|
137
|
+
|
|
138
|
+
### Basic Usage
|
|
139
|
+
|
|
140
|
+
```svelte
|
|
141
|
+
<script>
|
|
142
|
+
import { DateTimePicker } from '$lib/date-picker';
|
|
143
|
+
|
|
144
|
+
let selectedDateTime = null;
|
|
145
|
+
</script>
|
|
146
|
+
|
|
147
|
+
<DateTimePicker bind:value={selectedDateTime} placeholder="Select date and time" />
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Props
|
|
151
|
+
|
|
152
|
+
| Prop | Type | Default | Description |
|
|
153
|
+
|------|------|---------|-------------|
|
|
154
|
+
| `value` | `UniDate` | `null` | Selected datetime value |
|
|
155
|
+
| `variant` | `'' \| 'plain' \| 'outlined' \| 'filled'` | `''` | Visual style variant |
|
|
156
|
+
| `disabled` | `boolean` | `false` | Disables the picker |
|
|
157
|
+
| `readonly` | `boolean` | `false` | Makes the picker read-only |
|
|
158
|
+
| `compact` | `boolean` | `false` | Compact display mode |
|
|
159
|
+
| `mandatory` | `boolean` | `false` | Required field (hides clear button) |
|
|
160
|
+
| `style` | `string` | `''` | Custom CSS styles |
|
|
161
|
+
| `placeholder` | `string` | `""` | Input placeholder text |
|
|
162
|
+
| `displayMode` | `DisplayMode` | `DisplayMode.Edit` | Display mode (Edit/View) |
|
|
163
|
+
| `min` | `UniDate` | `null` | Minimum selectable date |
|
|
164
|
+
| `max` | `UniDate` | `null` | Maximum selectable date |
|
|
165
|
+
| `precision` | `"H" \| "M" \| "S"` | `"M"` | Time precision (Hour/Minute/Second) |
|
|
166
|
+
| `onchange` | `OnChangeHandler<Date>` | `null` | Change event handler |
|
|
167
|
+
| `onfocus` | `() => void` | `null` | Focus event handler |
|
|
168
|
+
| `onblur` | `() => void` | `null` | Blur event handler |
|
|
169
|
+
|
|
170
|
+
### Methods
|
|
171
|
+
|
|
172
|
+
| Method | Description |
|
|
173
|
+
|--------|-------------|
|
|
174
|
+
| `setFocus()` | Programmatically focus the picker |
|
|
175
|
+
|
|
176
|
+
### Examples
|
|
177
|
+
|
|
178
|
+
#### Basic DateTime Picker
|
|
179
|
+
```svelte
|
|
180
|
+
<DateTimePicker bind:value={cutoffTime} placeholder="Select cutoff time" />
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
#### DateTime Picker with Second Precision
|
|
184
|
+
```svelte
|
|
185
|
+
<DateTimePicker
|
|
186
|
+
variant="outlined"
|
|
187
|
+
precision="S"
|
|
188
|
+
mandatory
|
|
189
|
+
bind:value={releaseDate}
|
|
190
|
+
placeholder="Release datetime (to seconds)"
|
|
191
|
+
/>
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
#### DateTime Picker with Hour Precision
|
|
195
|
+
```svelte
|
|
196
|
+
<DateTimePicker
|
|
197
|
+
variant="filled"
|
|
198
|
+
precision="H"
|
|
199
|
+
bind:value={appointmentTime}
|
|
200
|
+
placeholder="Appointment time (hour precision)"
|
|
201
|
+
/>
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Time Precision
|
|
205
|
+
|
|
206
|
+
The `precision` prop in DateTimePicker controls the time granularity:
|
|
207
|
+
|
|
208
|
+
- **"H"**: Hour precision (YYYY-MM-DD HH:00)
|
|
209
|
+
- **"M"**: Minute precision (YYYY-MM-DD HH:mm) - Default
|
|
210
|
+
- **"S"**: Second precision (YYYY-MM-DD HH:mm:ss)
|
|
211
|
+
|
|
212
|
+
## Display Modes
|
|
213
|
+
|
|
214
|
+
Both components support different display modes via the `displayMode` prop:
|
|
215
|
+
|
|
216
|
+
- **`DisplayMode.Edit`**: Full editing capabilities (default)
|
|
217
|
+
- **`DisplayMode.View`**: Read-only display mode
|
|
218
|
+
|
|
219
|
+
## Variants
|
|
220
|
+
|
|
221
|
+
Both components support multiple visual styles:
|
|
222
|
+
|
|
223
|
+
- **Default** (`''`): Basic styling
|
|
224
|
+
- **`'plain'`**: Minimal styling
|
|
225
|
+
- **`'outlined'`**: Outlined border style
|
|
226
|
+
- **`'filled'`**: Filled background style
|
|
227
|
+
|
|
228
|
+
## Keyboard Navigation
|
|
229
|
+
|
|
230
|
+
Both components support keyboard navigation:
|
|
231
|
+
|
|
232
|
+
- **Backspace/Delete**: Clear the selected date/time
|
|
233
|
+
- **Escape**: Close the popup
|
|
234
|
+
- **Tab**: Navigate through the interface
|
|
235
|
+
- **Enter**: Confirm selection (in DateTimePicker)
|
|
236
|
+
|
|
237
|
+
## Accessibility
|
|
238
|
+
|
|
239
|
+
- Full ARIA support for screen readers
|
|
240
|
+
- Keyboard navigation
|
|
241
|
+
- Focus management
|
|
242
|
+
- Proper labeling and descriptions
|
|
243
|
+
|
|
244
|
+
## Date Formats
|
|
245
|
+
|
|
246
|
+
- **DatePicker**: YYYY-MM-DD
|
|
247
|
+
- **DateTimePicker**:
|
|
248
|
+
- Hour precision: YYYY-MM-DD HH:mm
|
|
249
|
+
- Minute precision: YYYY-MM-DD HH:mm
|
|
250
|
+
- Second precision: YYYY-MM-DD HH:mm:ss
|
|
251
|
+
|
|
252
|
+
## Event Handling
|
|
253
|
+
|
|
254
|
+
```svelte
|
|
255
|
+
<script>
|
|
256
|
+
function handleDateChange(date) {
|
|
257
|
+
console.log('Date selected:', date);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function handleFocus() {
|
|
261
|
+
console.log('Picker focused');
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function handleBlur() {
|
|
265
|
+
console.log('Picker blurred');
|
|
266
|
+
}
|
|
267
|
+
</script>
|
|
268
|
+
|
|
269
|
+
<DatePicker
|
|
270
|
+
bind:value={selectedDate}
|
|
271
|
+
onchange={handleDateChange}
|
|
272
|
+
onfocus={handleFocus}
|
|
273
|
+
onblur={handleBlur}
|
|
274
|
+
/>
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
## Styling
|
|
278
|
+
|
|
279
|
+
Both components inherit styling from the Uniface design system and can be customized with CSS variables:
|
|
280
|
+
|
|
281
|
+
```css
|
|
282
|
+
.uniface-date-time-editor {
|
|
283
|
+
--uniface-inside-border-color: #f0f0f0;
|
|
284
|
+
/* Add custom styling */
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
## Integration with Forms
|
|
289
|
+
|
|
290
|
+
Both components work seamlessly with FormField:
|
|
291
|
+
|
|
292
|
+
```svelte
|
|
293
|
+
<script>
|
|
294
|
+
import FormField from '$lib/form-field';
|
|
295
|
+
import DatePicker, { DateTimePicker } from '$lib/date-picker';
|
|
296
|
+
</script>
|
|
297
|
+
|
|
298
|
+
<FormField label="Date of Birth">
|
|
299
|
+
<DatePicker variant="outlined" mandatory bind:value={dateOfBirth} />
|
|
300
|
+
</FormField>
|
|
301
|
+
|
|
302
|
+
<FormField label="Appointment Time">
|
|
303
|
+
<DateTimePicker variant="filled" precision="M" bind:value={appointmentTime} />
|
|
304
|
+
</FormField>
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
## Type Definitions
|
|
308
|
+
|
|
309
|
+
```typescript
|
|
310
|
+
type UniDate = Date | dayjs.Dayjs | string | null;
|
|
311
|
+
type OnChangeHandler<T> = (value: T | null) => void;
|
|
312
|
+
|
|
313
|
+
enum DisplayMode {
|
|
314
|
+
Edit = 'edit',
|
|
315
|
+
View = 'view'
|
|
316
|
+
}
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
## Notes
|
|
320
|
+
|
|
321
|
+
- The components use Day.js internally for date manipulation
|
|
322
|
+
- Values are always returned as native JavaScript Date objects
|
|
323
|
+
- The calendar popup automatically closes when a date is selected
|
|
324
|
+
- The DateTime picker requires confirmation before applying the selection
|
|
325
|
+
- Min/max date restrictions are enforced in the calendar view
|
|
326
|
+
- The clear button is hidden when `mandatory` is true
|