@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,463 @@
|
|
|
1
|
+
# Uniface Form Components Documentation
|
|
2
|
+
|
|
3
|
+
This is the English documentation for Uniface form components, covering all available form input and selection components.
|
|
4
|
+
|
|
5
|
+
## Component Overview
|
|
6
|
+
|
|
7
|
+
### Basic Input Components
|
|
8
|
+
- [TextEditor](text-editor.md) - Text input field
|
|
9
|
+
- [NumberEditor](number-editor.md) - Number input field
|
|
10
|
+
- [TimeEditor](time-editor.md) - Time input field
|
|
11
|
+
- [UnitNumberEditor](unit-number-editor.md) - Number input with units
|
|
12
|
+
- [PromptsTextEditor](prompts-text-editor.md) - Text input with prompts
|
|
13
|
+
|
|
14
|
+
### Selection Components
|
|
15
|
+
- [CheckBox](checkbox.md) - Checkbox
|
|
16
|
+
- [RadioButton](radiobutton.md) - Radio button
|
|
17
|
+
- [GroupCheckBox](group-checkbox.md) - Checkbox group
|
|
18
|
+
- [GroupRadioBox](group-radiobox.md) - Radio button group
|
|
19
|
+
- [Switch](switch.md) - Toggle switch
|
|
20
|
+
- [OptionsSelect](options-select.md) - Options selector
|
|
21
|
+
- [OptionsMultiSelect](options-multi-select.md) - Multi-select selector
|
|
22
|
+
- [InputOptionsSelect](input-options-select.md) - Input options selector
|
|
23
|
+
- [LookupEditor](lookup-editor.md) - Lookup editor
|
|
24
|
+
- [CascadeOptionsSelect](cascade-options-select.md) - Cascade selector
|
|
25
|
+
|
|
26
|
+
### Date/Time Components
|
|
27
|
+
- [DatePicker](date-picker.md) - Date picker
|
|
28
|
+
- [DateTimePicker](datetime-picker.md) - Date/time picker
|
|
29
|
+
|
|
30
|
+
## Architecture Overview
|
|
31
|
+
|
|
32
|
+
### Core Wrapper Components
|
|
33
|
+
All form components are based on two core wrapper components:
|
|
34
|
+
- **CommonEditor** - Provides unified styling and behavior for input components
|
|
35
|
+
- **CommonPicker** - Provides dropdown panel functionality for selection components
|
|
36
|
+
|
|
37
|
+
### Display Modes
|
|
38
|
+
All components support the `DisplayMode` enum:
|
|
39
|
+
```typescript
|
|
40
|
+
enum DisplayMode {
|
|
41
|
+
Edit = 0, // Edit mode (default)
|
|
42
|
+
View = 1, // View mode
|
|
43
|
+
Display = 2 // Display mode
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Common Properties
|
|
48
|
+
Most components share these properties:
|
|
49
|
+
- `variant: '' | 'plain' | 'outlined' | 'filled'` - Appearance variant
|
|
50
|
+
- `disabled: boolean` - Whether disabled
|
|
51
|
+
- `readonly: boolean` - Whether read-only
|
|
52
|
+
- `compact: boolean` - Whether compact mode
|
|
53
|
+
- `style: string` - Custom CSS styles
|
|
54
|
+
- `displayMode: DisplayMode` - Display mode
|
|
55
|
+
|
|
56
|
+
## Styling and Theming
|
|
57
|
+
|
|
58
|
+
### CSS Custom Properties
|
|
59
|
+
|
|
60
|
+
All components support theme customization through CSS custom properties:
|
|
61
|
+
|
|
62
|
+
```css
|
|
63
|
+
:root {
|
|
64
|
+
/* Colors */
|
|
65
|
+
--uniface-primary-color: #007bff;
|
|
66
|
+
--uniface-secondary-color: #6c757d;
|
|
67
|
+
--uniface-success-color: #28a745;
|
|
68
|
+
--uniface-danger-color: #dc3545;
|
|
69
|
+
--uniface-warning-color: #ffc107;
|
|
70
|
+
--uniface-info-color: #17a2b8;
|
|
71
|
+
--uniface-light-color: #f8f9fa;
|
|
72
|
+
--uniface-dark-color: #343a40;
|
|
73
|
+
|
|
74
|
+
/* Borders */
|
|
75
|
+
--uniface-border-color: #dee2e6;
|
|
76
|
+
--uniface-border-radius: 4px;
|
|
77
|
+
--uniface-border-width: 1px;
|
|
78
|
+
|
|
79
|
+
/* Spacing */
|
|
80
|
+
--uniface-padding-sm: 4px 8px;
|
|
81
|
+
--uniface-padding-md: 8px 12px;
|
|
82
|
+
--uniface-padding-lg: 12px 16px;
|
|
83
|
+
|
|
84
|
+
/* Typography */
|
|
85
|
+
--uniface-font-size-sm: 12px;
|
|
86
|
+
--uniface-font-size-md: 14px;
|
|
87
|
+
--uniface-font-size-lg: 16px;
|
|
88
|
+
|
|
89
|
+
/* Shadows */
|
|
90
|
+
--uniface-box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
|
91
|
+
--uniface-box-shadow-hover: 0 4px 8px rgba(0,0,0,0.15);
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Variant Styles
|
|
96
|
+
|
|
97
|
+
#### Plain Variant
|
|
98
|
+
```css
|
|
99
|
+
.uniface-editor.plain {
|
|
100
|
+
border: none;
|
|
101
|
+
background: transparent;
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
#### Outlined Variant
|
|
106
|
+
```css
|
|
107
|
+
.uniface-editor.outlined {
|
|
108
|
+
border: 1px solid var(--uniface-border-color);
|
|
109
|
+
background: white;
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
#### Filled Variant
|
|
114
|
+
```css
|
|
115
|
+
.uniface-editor.filled {
|
|
116
|
+
border: none;
|
|
117
|
+
background: var(--uniface-light-color);
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Compact Mode
|
|
122
|
+
```css
|
|
123
|
+
.uniface-editor.compact {
|
|
124
|
+
padding: var(--uniface-padding-sm);
|
|
125
|
+
font-size: var(--uniface-font-size-sm);
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Icon Usage
|
|
130
|
+
|
|
131
|
+
All components use the `@ticatec/uniface-google-material-icons` icon library, which is a wrapper for Google Material Icons.
|
|
132
|
+
|
|
133
|
+
### Common Icons
|
|
134
|
+
|
|
135
|
+
| Icon Class | Description | Usage |
|
|
136
|
+
|------------|-------------|-------|
|
|
137
|
+
| `icon_google_add` | Add | Add buttons, create operations |
|
|
138
|
+
| `icon_google_edit` | Edit | Edit buttons, modify operations |
|
|
139
|
+
| `icon_google_delete` | Delete | Delete buttons, remove operations |
|
|
140
|
+
| `icon_google_search` | Search | Search boxes, find functionality |
|
|
141
|
+
| `icon_google_clear` | Clear | Clear inputs, reset operations |
|
|
142
|
+
| `icon_google_arrow_drop_down` | Dropdown arrow | Dropdown select components |
|
|
143
|
+
| `icon_google_arrow_drop_up` | Collapse arrow | Collapse dropdown panels |
|
|
144
|
+
| `icon_google_check` | Check | Checkboxes, confirm operations |
|
|
145
|
+
| `icon_google_close` | Close | Close buttons, cancel operations |
|
|
146
|
+
| `icon_google_calendar_today` | Calendar | Date pickers |
|
|
147
|
+
| `icon_google_access_time` | Time | Time pickers |
|
|
148
|
+
| `icon_google_keyboard_arrow_down` | Keyboard arrow down | Cascade select components |
|
|
149
|
+
| `icon_google_keyboard_control` | Control key | Lookup editors |
|
|
150
|
+
|
|
151
|
+
### Icon Usage Examples
|
|
152
|
+
|
|
153
|
+
```svelte
|
|
154
|
+
<!-- Direct usage in HTML -->
|
|
155
|
+
<i class="icon_google_search"></i>
|
|
156
|
+
|
|
157
|
+
<!-- Usage in component properties -->
|
|
158
|
+
<Button icon="icon_google_add" label="Add User" />
|
|
159
|
+
|
|
160
|
+
<!-- Usage in CSS -->
|
|
161
|
+
<style>
|
|
162
|
+
.custom-icon::before {
|
|
163
|
+
content: '';
|
|
164
|
+
@extend .icon_google_settings;
|
|
165
|
+
}
|
|
166
|
+
</style>
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## Internationalization Support
|
|
170
|
+
|
|
171
|
+
### Using @ticatec/i18n
|
|
172
|
+
|
|
173
|
+
```svelte
|
|
174
|
+
<script lang="ts">
|
|
175
|
+
import i18n from '@ticatec/i18n';
|
|
176
|
+
|
|
177
|
+
// Get localized text
|
|
178
|
+
const getText = (key: string, defaultText: string) => {
|
|
179
|
+
return i18n.getText(key, defaultText);
|
|
180
|
+
};
|
|
181
|
+
</script>
|
|
182
|
+
|
|
183
|
+
<TextEditor
|
|
184
|
+
placeholder={getText('uniface.editor.placeholder', 'Please enter content')}
|
|
185
|
+
/>
|
|
186
|
+
|
|
187
|
+
<Button
|
|
188
|
+
label={getText('uniface.button.save', 'Save')}
|
|
189
|
+
/>
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Common Internationalization Keys
|
|
193
|
+
|
|
194
|
+
| Key | English | Chinese |
|
|
195
|
+
|-----|---------|---------|
|
|
196
|
+
| `uniface.button.save` | Save | 保存 |
|
|
197
|
+
| `uniface.button.cancel` | Cancel | 取消 |
|
|
198
|
+
| `uniface.button.delete` | Delete | 删除 |
|
|
199
|
+
| `uniface.button.edit` | Edit | 编辑 |
|
|
200
|
+
| `uniface.loadMore` | Load more | 加载更多 |
|
|
201
|
+
| `uniface.noData` | No data | 暂无数据 |
|
|
202
|
+
| `uniface.loading` | Loading... | 加载中... |
|
|
203
|
+
| `uniface.error.required` | This field is required | 此字段为必填项 |
|
|
204
|
+
| `uniface.error.invalid` | Invalid input format | 输入格式无效 |
|
|
205
|
+
|
|
206
|
+
## Best Practices
|
|
207
|
+
|
|
208
|
+
### 1. Responsive Design
|
|
209
|
+
```svelte
|
|
210
|
+
<style>
|
|
211
|
+
.form-container {
|
|
212
|
+
display: grid;
|
|
213
|
+
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
|
214
|
+
gap: 16px;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
@media (max-width: 768px) {
|
|
218
|
+
.form-container {
|
|
219
|
+
grid-template-columns: 1fr;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
</style>
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### 2. Accessibility
|
|
226
|
+
```svelte
|
|
227
|
+
<!-- Add labels for each form field -->
|
|
228
|
+
<label for="username">Username:</label>
|
|
229
|
+
<TextEditor id="username" placeholder="Enter username" />
|
|
230
|
+
|
|
231
|
+
<!-- Add descriptions for select components -->
|
|
232
|
+
<OptionsSelect
|
|
233
|
+
aria-describedby="country-description"
|
|
234
|
+
placeholder="Select country"
|
|
235
|
+
options={countries}
|
|
236
|
+
/>
|
|
237
|
+
<div id="country-description" class="form-help">
|
|
238
|
+
Please select your country or region
|
|
239
|
+
</div>
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### 3. Performance Optimization
|
|
243
|
+
```svelte
|
|
244
|
+
<script lang="ts">
|
|
245
|
+
import { onMount } from 'svelte';
|
|
246
|
+
|
|
247
|
+
// Lazy load large option datasets
|
|
248
|
+
onMount(async () => {
|
|
249
|
+
const response = await fetch('/api/options');
|
|
250
|
+
options = await response.json();
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
// Use debouncing for search
|
|
254
|
+
let searchTimeout: number;
|
|
255
|
+
const handleSearch = (keyword: string) => {
|
|
256
|
+
clearTimeout(searchTimeout);
|
|
257
|
+
searchTimeout = setTimeout(() => {
|
|
258
|
+
performSearch(keyword);
|
|
259
|
+
}, 300);
|
|
260
|
+
};
|
|
261
|
+
</script>
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### 4. Error Handling
|
|
265
|
+
```svelte
|
|
266
|
+
<script lang="ts">
|
|
267
|
+
let loading = false;
|
|
268
|
+
let error: string | null = null;
|
|
269
|
+
|
|
270
|
+
const handleAsyncOperation = async () => {
|
|
271
|
+
loading = true;
|
|
272
|
+
error = null;
|
|
273
|
+
|
|
274
|
+
try {
|
|
275
|
+
await performOperation();
|
|
276
|
+
} catch (err) {
|
|
277
|
+
error = err.message;
|
|
278
|
+
console.error('Operation failed:', err);
|
|
279
|
+
} finally {
|
|
280
|
+
loading = false;
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
</script>
|
|
284
|
+
|
|
285
|
+
{#if error}
|
|
286
|
+
<div class="error-alert">
|
|
287
|
+
<i class="icon_google_error"></i>
|
|
288
|
+
{error}
|
|
289
|
+
</div>
|
|
290
|
+
{/if}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
## Form Validation Example
|
|
294
|
+
|
|
295
|
+
```svelte
|
|
296
|
+
<script lang="ts">
|
|
297
|
+
import TextEditor from '@ticatec/uniface-element/TextEditor';
|
|
298
|
+
import NumberEditor from '@ticatec/uniface-element/NumberEditor';
|
|
299
|
+
import CheckBox from '@ticatec/uniface-element/Checkbox';
|
|
300
|
+
|
|
301
|
+
let formData = {
|
|
302
|
+
name: '',
|
|
303
|
+
email: '',
|
|
304
|
+
age: null as number | null,
|
|
305
|
+
agreed: false
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
let errors: Record<string, string> = {};
|
|
309
|
+
|
|
310
|
+
// Validation rules
|
|
311
|
+
const validators = {
|
|
312
|
+
name: (value: string) => {
|
|
313
|
+
if (!value || value.trim().length === 0) {
|
|
314
|
+
return 'Name cannot be empty';
|
|
315
|
+
}
|
|
316
|
+
if (value.length < 2) {
|
|
317
|
+
return 'Name must be at least 2 characters';
|
|
318
|
+
}
|
|
319
|
+
return null;
|
|
320
|
+
},
|
|
321
|
+
email: (value: string) => {
|
|
322
|
+
if (!value) return 'Email cannot be empty';
|
|
323
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
324
|
+
if (!emailRegex.test(value)) {
|
|
325
|
+
return 'Please enter a valid email address';
|
|
326
|
+
}
|
|
327
|
+
return null;
|
|
328
|
+
},
|
|
329
|
+
age: (value: number | null) => {
|
|
330
|
+
if (value === null) return 'Age cannot be empty';
|
|
331
|
+
if (value < 18) return 'Age must be at least 18';
|
|
332
|
+
if (value > 120) return 'Please enter a valid age';
|
|
333
|
+
return null;
|
|
334
|
+
},
|
|
335
|
+
agreed: (value: boolean) => {
|
|
336
|
+
if (!value) return 'Please agree to the terms';
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
|
|
341
|
+
// Validate single field
|
|
342
|
+
const validateField = (field: string, value: any) => {
|
|
343
|
+
const error = validators[field]?.(value);
|
|
344
|
+
if (error) {
|
|
345
|
+
errors[field] = error;
|
|
346
|
+
} else {
|
|
347
|
+
delete errors[field];
|
|
348
|
+
}
|
|
349
|
+
errors = { ...errors };
|
|
350
|
+
};
|
|
351
|
+
|
|
352
|
+
// Validate entire form
|
|
353
|
+
const validateForm = () => {
|
|
354
|
+
const newErrors: Record<string, string> = {};
|
|
355
|
+
Object.keys(validators).forEach(field => {
|
|
356
|
+
const error = validators[field](formData[field]);
|
|
357
|
+
if (error) {
|
|
358
|
+
newErrors[field] = error;
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
errors = newErrors;
|
|
362
|
+
return Object.keys(errors).length === 0;
|
|
363
|
+
};
|
|
364
|
+
|
|
365
|
+
const handleSubmit = () => {
|
|
366
|
+
if (validateForm()) {
|
|
367
|
+
console.log('Form submitted successfully', formData);
|
|
368
|
+
} else {
|
|
369
|
+
console.log('Form validation failed', errors);
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
</script>
|
|
373
|
+
|
|
374
|
+
<form on:submit|preventDefault={handleSubmit}>
|
|
375
|
+
<!-- Name input -->
|
|
376
|
+
<div class="form-field">
|
|
377
|
+
<TextEditor
|
|
378
|
+
placeholder="Enter your name"
|
|
379
|
+
bind:value={formData.name}
|
|
380
|
+
onChange={(value) => validateField('name', value)}
|
|
381
|
+
/>
|
|
382
|
+
{#if errors.name}
|
|
383
|
+
<div class="error-message">{errors.name}</div>
|
|
384
|
+
{/if}
|
|
385
|
+
</div>
|
|
386
|
+
|
|
387
|
+
<!-- Email input -->
|
|
388
|
+
<div class="form-field">
|
|
389
|
+
<TextEditor
|
|
390
|
+
placeholder="Enter your email"
|
|
391
|
+
bind:value={formData.email}
|
|
392
|
+
onChange={(value) => validateField('email', value)}
|
|
393
|
+
/>
|
|
394
|
+
{#if errors.email}
|
|
395
|
+
<div class="error-message">{errors.email}</div>
|
|
396
|
+
{/if}
|
|
397
|
+
</div>
|
|
398
|
+
|
|
399
|
+
<!-- Age input -->
|
|
400
|
+
<div class="form-field">
|
|
401
|
+
<NumberEditor
|
|
402
|
+
placeholder="Enter your age"
|
|
403
|
+
min={1}
|
|
404
|
+
max={120}
|
|
405
|
+
bind:value={formData.age}
|
|
406
|
+
onChange={(value) => validateField('age', value)}
|
|
407
|
+
/>
|
|
408
|
+
{#if errors.age}
|
|
409
|
+
<div class="error-message">{errors.age}</div>
|
|
410
|
+
{/if}
|
|
411
|
+
</div>
|
|
412
|
+
|
|
413
|
+
<!-- Agreement checkbox -->
|
|
414
|
+
<div class="form-field">
|
|
415
|
+
<CheckBox
|
|
416
|
+
label="I agree to the Terms of Service and Privacy Policy"
|
|
417
|
+
bind:value={formData.agreed}
|
|
418
|
+
onChange={(value) => validateField('agreed', value)}
|
|
419
|
+
/>
|
|
420
|
+
{#if errors.agreed}
|
|
421
|
+
<div class="error-message">{errors.agreed}</div>
|
|
422
|
+
{/if}
|
|
423
|
+
</div>
|
|
424
|
+
|
|
425
|
+
<button type="submit" disabled={Object.keys(errors).length > 0}>
|
|
426
|
+
Submit Form
|
|
427
|
+
</button>
|
|
428
|
+
</form>
|
|
429
|
+
|
|
430
|
+
<style>
|
|
431
|
+
.form-field {
|
|
432
|
+
margin-bottom: 16px;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
.error-message {
|
|
436
|
+
color: var(--uniface-danger-color);
|
|
437
|
+
font-size: 12px;
|
|
438
|
+
margin-top: 4px;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
button:disabled {
|
|
442
|
+
opacity: 0.5;
|
|
443
|
+
cursor: not-allowed;
|
|
444
|
+
}
|
|
445
|
+
</style>
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
---
|
|
449
|
+
|
|
450
|
+
## Summary
|
|
451
|
+
|
|
452
|
+
This documentation covers the complete API and usage of the Uniface form component library. Each component follows unified design principles and interaction patterns, ensuring excellent user and developer experience.
|
|
453
|
+
|
|
454
|
+
Key features:
|
|
455
|
+
- 🎨 Unified visual design and user experience
|
|
456
|
+
- 🔧 TypeScript support with complete type definitions
|
|
457
|
+
- 🌍 Internationalization support
|
|
458
|
+
- ♿ Accessibility considerations
|
|
459
|
+
- 📱 Responsive design
|
|
460
|
+
- 🎯 High-performance implementation
|
|
461
|
+
- 🔌 Flexible extension mechanisms
|
|
462
|
+
|
|
463
|
+
For more information or if you encounter issues, please refer to the relevant component source code or contact the development team.
|