@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,443 @@
|
|
|
1
|
+
# NumberRange
|
|
2
|
+
|
|
3
|
+
A dual number input component for specifying numeric ranges, with automatic validation to ensure the "from" value doesn't exceed the "to" value.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Range Input**: Two connected number inputs for "from" and "to" values
|
|
8
|
+
- **Automatic Validation**: Ensures logical range order (from ≤ to)
|
|
9
|
+
- **Negative Numbers**: Optional support for negative values
|
|
10
|
+
- **Boundary Constraints**: Set min/max limits for the entire range
|
|
11
|
+
- **Multiple Variants**: Support for outlined, filled, plain, and default styles
|
|
12
|
+
- **Compact Mode**: Space-efficient layout for dense forms
|
|
13
|
+
- **Clear Functionality**: Built-in clear button to reset both values
|
|
14
|
+
- **Real-time Validation**: Immediate feedback during input
|
|
15
|
+
- **Focus Management**: Automatic focus handling between inputs
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install @ticatec/uniface-element
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Basic Usage
|
|
24
|
+
|
|
25
|
+
```svelte
|
|
26
|
+
<script>
|
|
27
|
+
import NumberRange from '@ticatec/uniface-element/NumberRange';
|
|
28
|
+
|
|
29
|
+
let fromValue = 10;
|
|
30
|
+
let toValue = 50;
|
|
31
|
+
</script>
|
|
32
|
+
|
|
33
|
+
<NumberRange bind:fromValue bind:toValue />
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## API Reference
|
|
37
|
+
|
|
38
|
+
### Props
|
|
39
|
+
|
|
40
|
+
| Prop | Type | Default | Description |
|
|
41
|
+
|------|------|---------|-------------|
|
|
42
|
+
| `fromValue` | `number \| null` | `null` | The "from" (minimum) value of the range |
|
|
43
|
+
| `toValue` | `number \| null` | `null` | The "to" (maximum) value of the range |
|
|
44
|
+
| `variant` | `'' \| 'plain' \| 'outlined' \| 'filled'` | `''` | Visual style variant |
|
|
45
|
+
| `compact` | `boolean` | `false` | Enables compact display mode |
|
|
46
|
+
| `style` | `string` | `''` | Custom CSS styles |
|
|
47
|
+
| `min` | `number \| null` | `null` | Minimum allowed value for both inputs |
|
|
48
|
+
| `max` | `number \| null` | `null` | Maximum allowed value for both inputs |
|
|
49
|
+
| `allowNegative` | `boolean` | `false` | Allow negative numbers in both inputs |
|
|
50
|
+
| `class` | `string` | `''` | CSS class name |
|
|
51
|
+
|
|
52
|
+
## Examples
|
|
53
|
+
|
|
54
|
+
### Basic Range Selection
|
|
55
|
+
|
|
56
|
+
```svelte
|
|
57
|
+
<script>
|
|
58
|
+
import NumberRange from '@ticatec/uniface-element/NumberRange';
|
|
59
|
+
import FormField from '@ticatec/uniface-element/FormField';
|
|
60
|
+
|
|
61
|
+
let ageFrom = 18;
|
|
62
|
+
let ageTo = 65;
|
|
63
|
+
</script>
|
|
64
|
+
|
|
65
|
+
<FormField label="Age Range">
|
|
66
|
+
<NumberRange
|
|
67
|
+
bind:fromValue={ageFrom}
|
|
68
|
+
bind:toValue={ageTo}
|
|
69
|
+
variant="outlined"
|
|
70
|
+
min={0}
|
|
71
|
+
max={120}
|
|
72
|
+
/>
|
|
73
|
+
</FormField>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Price Range Filter
|
|
77
|
+
|
|
78
|
+
```svelte
|
|
79
|
+
<script>
|
|
80
|
+
import NumberRange from '@ticatec/uniface-element/NumberRange';
|
|
81
|
+
|
|
82
|
+
let priceMin = 100;
|
|
83
|
+
let priceMax = 1000;
|
|
84
|
+
|
|
85
|
+
$: console.log(`Price range: $${priceMin} - $${priceMax}`);
|
|
86
|
+
</script>
|
|
87
|
+
|
|
88
|
+
<div class="price-filter">
|
|
89
|
+
<label>Price Range ($)</label>
|
|
90
|
+
<NumberRange
|
|
91
|
+
bind:fromValue={priceMin}
|
|
92
|
+
bind:toValue={priceMax}
|
|
93
|
+
variant="filled"
|
|
94
|
+
min={0}
|
|
95
|
+
max={10000}
|
|
96
|
+
/>
|
|
97
|
+
<div class="range-display">
|
|
98
|
+
${priceMin || 0} - ${priceMax || 0}
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Temperature Range (with negative values)
|
|
104
|
+
|
|
105
|
+
```svelte
|
|
106
|
+
<script>
|
|
107
|
+
import NumberRange from '@ticatec/uniface-element/NumberRange';
|
|
108
|
+
|
|
109
|
+
let tempMin = -10;
|
|
110
|
+
let tempMax = 25;
|
|
111
|
+
</script>
|
|
112
|
+
|
|
113
|
+
<div class="temperature-range">
|
|
114
|
+
<label>Temperature Range (°C)</label>
|
|
115
|
+
<NumberRange
|
|
116
|
+
bind:fromValue={tempMin}
|
|
117
|
+
bind:toValue={tempMax}
|
|
118
|
+
variant="outlined"
|
|
119
|
+
allowNegative={true}
|
|
120
|
+
min={-50}
|
|
121
|
+
max={50}
|
|
122
|
+
/>
|
|
123
|
+
</div>
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Search Criteria Form
|
|
127
|
+
|
|
128
|
+
```svelte
|
|
129
|
+
<script>
|
|
130
|
+
import NumberRange from '@ticatec/uniface-element/NumberRange';
|
|
131
|
+
import CriteriaField from '@ticatec/uniface-element/CriteriaField';
|
|
132
|
+
|
|
133
|
+
let criteria = {
|
|
134
|
+
salaryFrom: null,
|
|
135
|
+
salaryTo: null,
|
|
136
|
+
experienceFrom: 0,
|
|
137
|
+
experienceTo: 10,
|
|
138
|
+
ageFrom: 22,
|
|
139
|
+
ageTo: 60
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
function handleSearch() {
|
|
143
|
+
console.log('Search criteria:', criteria);
|
|
144
|
+
}
|
|
145
|
+
</script>
|
|
146
|
+
|
|
147
|
+
<div class="search-form">
|
|
148
|
+
<CriteriaField label="Salary Range" size="x30">
|
|
149
|
+
<NumberRange
|
|
150
|
+
bind:fromValue={criteria.salaryFrom}
|
|
151
|
+
bind:toValue={criteria.salaryTo}
|
|
152
|
+
variant="outlined"
|
|
153
|
+
min={0}
|
|
154
|
+
max={500000}
|
|
155
|
+
/>
|
|
156
|
+
</CriteriaField>
|
|
157
|
+
|
|
158
|
+
<CriteriaField label="Years of Experience" size="x30">
|
|
159
|
+
<NumberRange
|
|
160
|
+
bind:fromValue={criteria.experienceFrom}
|
|
161
|
+
bind:toValue={criteria.experienceTo}
|
|
162
|
+
variant="outlined"
|
|
163
|
+
min={0}
|
|
164
|
+
max={50}
|
|
165
|
+
/>
|
|
166
|
+
</CriteriaField>
|
|
167
|
+
|
|
168
|
+
<CriteriaField label="Age Range" size="x30">
|
|
169
|
+
<NumberRange
|
|
170
|
+
bind:fromValue={criteria.ageFrom}
|
|
171
|
+
bind:toValue={criteria.ageTo}
|
|
172
|
+
variant="outlined"
|
|
173
|
+
min={16}
|
|
174
|
+
max={80}
|
|
175
|
+
/>
|
|
176
|
+
</CriteriaField>
|
|
177
|
+
|
|
178
|
+
<button on:click={handleSearch}>Search</button>
|
|
179
|
+
</div>
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Compact Layout for Tables
|
|
183
|
+
|
|
184
|
+
```svelte
|
|
185
|
+
<script>
|
|
186
|
+
import NumberRange from '@ticatec/uniface-element/NumberRange';
|
|
187
|
+
|
|
188
|
+
let filters = [
|
|
189
|
+
{ label: 'Score', from: 80, to: 100 },
|
|
190
|
+
{ label: 'Quantity', from: 1, to: 999 },
|
|
191
|
+
{ label: 'Rating', from: 3, to: 5 }
|
|
192
|
+
];
|
|
193
|
+
</script>
|
|
194
|
+
|
|
195
|
+
<table class="filter-table">
|
|
196
|
+
<thead>
|
|
197
|
+
<tr>
|
|
198
|
+
<th>Filter</th>
|
|
199
|
+
<th>Range</th>
|
|
200
|
+
</tr>
|
|
201
|
+
</thead>
|
|
202
|
+
<tbody>
|
|
203
|
+
{#each filters as filter}
|
|
204
|
+
<tr>
|
|
205
|
+
<td>{filter.label}</td>
|
|
206
|
+
<td>
|
|
207
|
+
<NumberRange
|
|
208
|
+
bind:fromValue={filter.from}
|
|
209
|
+
bind:toValue={filter.to}
|
|
210
|
+
compact
|
|
211
|
+
variant="outlined"
|
|
212
|
+
min={0}
|
|
213
|
+
/>
|
|
214
|
+
</td>
|
|
215
|
+
</tr>
|
|
216
|
+
{/each}
|
|
217
|
+
</tbody>
|
|
218
|
+
</table>
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Dynamic Range with Validation
|
|
222
|
+
|
|
223
|
+
```svelte
|
|
224
|
+
<script>
|
|
225
|
+
import NumberRange from '@ticatec/uniface-element/NumberRange';
|
|
226
|
+
|
|
227
|
+
let budgetMin = 1000;
|
|
228
|
+
let budgetMax = 5000;
|
|
229
|
+
let isValidRange = true;
|
|
230
|
+
|
|
231
|
+
$: isValidRange = budgetMin <= budgetMax;
|
|
232
|
+
$: rangeSize = budgetMax - budgetMin;
|
|
233
|
+
|
|
234
|
+
function resetRange() {
|
|
235
|
+
budgetMin = 1000;
|
|
236
|
+
budgetMax = 5000;
|
|
237
|
+
}
|
|
238
|
+
</script>
|
|
239
|
+
|
|
240
|
+
<div class="budget-selector">
|
|
241
|
+
<label>Budget Range</label>
|
|
242
|
+
<NumberRange
|
|
243
|
+
bind:fromValue={budgetMin}
|
|
244
|
+
bind:toValue={budgetMax}
|
|
245
|
+
variant="outlined"
|
|
246
|
+
min={0}
|
|
247
|
+
max={100000}
|
|
248
|
+
/>
|
|
249
|
+
|
|
250
|
+
<div class="range-info" class:error={!isValidRange}>
|
|
251
|
+
{#if isValidRange}
|
|
252
|
+
<span>Range size: ${rangeSize}</span>
|
|
253
|
+
{:else}
|
|
254
|
+
<span>Invalid range: minimum cannot exceed maximum</span>
|
|
255
|
+
{/if}
|
|
256
|
+
</div>
|
|
257
|
+
|
|
258
|
+
<button on:click={resetRange}>Reset</button>
|
|
259
|
+
</div>
|
|
260
|
+
|
|
261
|
+
<style>
|
|
262
|
+
.range-info.error {
|
|
263
|
+
color: #d32f2f;
|
|
264
|
+
}
|
|
265
|
+
</style>
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Statistical Analysis Range
|
|
269
|
+
|
|
270
|
+
```svelte
|
|
271
|
+
<script>
|
|
272
|
+
import NumberRange from '@ticatec/uniface-element/NumberRange';
|
|
273
|
+
|
|
274
|
+
let dataRange = { min: -100, max: 100 };
|
|
275
|
+
let outlierThreshold = { from: -50, to: 50 };
|
|
276
|
+
|
|
277
|
+
$: normalDataPercentage = calculateNormalData(dataRange, outlierThreshold);
|
|
278
|
+
|
|
279
|
+
function calculateNormalData(range, threshold) {
|
|
280
|
+
const totalRange = range.max - range.min;
|
|
281
|
+
const normalRange = threshold.to - threshold.from;
|
|
282
|
+
return ((normalRange / totalRange) * 100).toFixed(1);
|
|
283
|
+
}
|
|
284
|
+
</script>
|
|
285
|
+
|
|
286
|
+
<div class="analysis-panel">
|
|
287
|
+
<h3>Data Analysis</h3>
|
|
288
|
+
|
|
289
|
+
<div class="range-control">
|
|
290
|
+
<label>Data Range</label>
|
|
291
|
+
<NumberRange
|
|
292
|
+
bind:fromValue={dataRange.min}
|
|
293
|
+
bind:toValue={dataRange.max}
|
|
294
|
+
variant="filled"
|
|
295
|
+
allowNegative={true}
|
|
296
|
+
min={-1000}
|
|
297
|
+
max={1000}
|
|
298
|
+
/>
|
|
299
|
+
</div>
|
|
300
|
+
|
|
301
|
+
<div class="range-control">
|
|
302
|
+
<label>Normal Range (exclude outliers)</label>
|
|
303
|
+
<NumberRange
|
|
304
|
+
bind:fromValue={outlierThreshold.from}
|
|
305
|
+
bind:toValue={outlierThreshold.to}
|
|
306
|
+
variant="outlined"
|
|
307
|
+
allowNegative={true}
|
|
308
|
+
min={dataRange.min}
|
|
309
|
+
max={dataRange.max}
|
|
310
|
+
/>
|
|
311
|
+
</div>
|
|
312
|
+
|
|
313
|
+
<div class="statistics">
|
|
314
|
+
<p>Normal data coverage: {normalDataPercentage}%</p>
|
|
315
|
+
</div>
|
|
316
|
+
</div>
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### Inventory Management
|
|
320
|
+
|
|
321
|
+
```svelte
|
|
322
|
+
<script>
|
|
323
|
+
import NumberRange from '@ticatec/uniface-element/NumberRange';
|
|
324
|
+
|
|
325
|
+
let stockLevels = {
|
|
326
|
+
lowStock: 0,
|
|
327
|
+
highStock: 100,
|
|
328
|
+
reorderFrom: 10,
|
|
329
|
+
reorderTo: 90
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
$: isValidReorderRange = (
|
|
333
|
+
stockLevels.reorderFrom >= stockLevels.lowStock &&
|
|
334
|
+
stockLevels.reorderTo <= stockLevels.highStock &&
|
|
335
|
+
stockLevels.reorderFrom <= stockLevels.reorderTo
|
|
336
|
+
);
|
|
337
|
+
</script>
|
|
338
|
+
|
|
339
|
+
<div class="inventory-config">
|
|
340
|
+
<h3>Inventory Configuration</h3>
|
|
341
|
+
|
|
342
|
+
<div class="config-row">
|
|
343
|
+
<label>Stock Level Range</label>
|
|
344
|
+
<NumberRange
|
|
345
|
+
bind:fromValue={stockLevels.lowStock}
|
|
346
|
+
bind:toValue={stockLevels.highStock}
|
|
347
|
+
variant="outlined"
|
|
348
|
+
min={0}
|
|
349
|
+
max={10000}
|
|
350
|
+
/>
|
|
351
|
+
</div>
|
|
352
|
+
|
|
353
|
+
<div class="config-row">
|
|
354
|
+
<label>Reorder Range</label>
|
|
355
|
+
<NumberRange
|
|
356
|
+
bind:fromValue={stockLevels.reorderFrom}
|
|
357
|
+
bind:toValue={stockLevels.reorderTo}
|
|
358
|
+
variant="filled"
|
|
359
|
+
min={stockLevels.lowStock}
|
|
360
|
+
max={stockLevels.highStock}
|
|
361
|
+
/>
|
|
362
|
+
</div>
|
|
363
|
+
|
|
364
|
+
<div class="validation" class:valid={isValidReorderRange}>
|
|
365
|
+
{isValidReorderRange ? '✓ Valid configuration' : '✗ Invalid reorder range'}
|
|
366
|
+
</div>
|
|
367
|
+
</div>
|
|
368
|
+
|
|
369
|
+
<style>
|
|
370
|
+
.validation.valid {
|
|
371
|
+
color: #2e7d32;
|
|
372
|
+
}
|
|
373
|
+
.validation:not(.valid) {
|
|
374
|
+
color: #d32f2f;
|
|
375
|
+
}
|
|
376
|
+
</style>
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
## Validation Logic
|
|
380
|
+
|
|
381
|
+
The NumberRange component automatically enforces logical constraints:
|
|
382
|
+
|
|
383
|
+
1. **Range Order**: The "from" value cannot exceed the "to" value
|
|
384
|
+
2. **Boundary Respect**: Both values respect the global min/max constraints
|
|
385
|
+
3. **Cross-validation**: When one value changes, the other adjusts if necessary
|
|
386
|
+
4. **Real-time Feedback**: Validation occurs during typing
|
|
387
|
+
|
|
388
|
+
## Best Practices
|
|
389
|
+
|
|
390
|
+
1. **Set Appropriate Boundaries**: Use min/max to prevent unrealistic values
|
|
391
|
+
2. **Provide Clear Labels**: Indicate what the range represents
|
|
392
|
+
3. **Handle Empty States**: Consider what happens when values are null
|
|
393
|
+
4. **Use Compact Mode Wisely**: In dense layouts or tables
|
|
394
|
+
5. **Validate Range Logic**: Ensure business rules are met
|
|
395
|
+
6. **Consider User Workflow**: Which input should users typically fill first
|
|
396
|
+
7. **Provide Feedback**: Show range calculations or validation messages
|
|
397
|
+
|
|
398
|
+
## Styling
|
|
399
|
+
|
|
400
|
+
The NumberRange component uses the following CSS structure:
|
|
401
|
+
|
|
402
|
+
```css
|
|
403
|
+
.uniface-range-editor {
|
|
404
|
+
display: flex;
|
|
405
|
+
align-items: center;
|
|
406
|
+
border: 1px solid #e0e0e0;
|
|
407
|
+
border-radius: 4px;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
.uniface-range-editor .divider {
|
|
411
|
+
width: 8px;
|
|
412
|
+
height: 1px;
|
|
413
|
+
background: #ccc;
|
|
414
|
+
margin: 0 4px;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
.uniface-range-editor.compact {
|
|
418
|
+
padding: 4px 8px;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
.uniface-range-editor.outlined {
|
|
422
|
+
border: 2px solid #1976d2;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
.uniface-range-editor.filled {
|
|
426
|
+
background-color: #f5f5f5;
|
|
427
|
+
}
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
## Accessibility
|
|
431
|
+
|
|
432
|
+
- Proper ARIA labels for screen readers
|
|
433
|
+
- Keyboard navigation between inputs
|
|
434
|
+
- Focus management and visual indicators
|
|
435
|
+
- Support for high contrast modes
|
|
436
|
+
- Logical tab order
|
|
437
|
+
|
|
438
|
+
## Related Components
|
|
439
|
+
|
|
440
|
+
- [NumberEditor](../number-editor/README.md) - For single number input
|
|
441
|
+
- [DateRange](../date-range/README.md) - For date range selection
|
|
442
|
+
- [CriteriaField](../criteria-field/README.md) - For search form layouts
|
|
443
|
+
- [FormField](../form-field/README.md) - For form field labels and layout
|