|
123 | 123 | :min="getFilterMinValue(c.name)" |
124 | 124 | :max="getFilterMaxValue(c.name)" |
125 | 125 | :valueStart="getFilterItem({ column: c, operator: 'gte' })" |
126 | | - @update:valueStart="onFilterInput[c.name]({ column: c, operator: 'gte', value: ($event !== '' && $event !== null) ? (c.type === 'decimal' ? String($event) : $event) : undefined })" |
| 126 | + @update:valueStart="(val) => rangeChangeHandler((val !== '' && val !== null) ? (c.type === 'decimal' ? String(val) : val) : undefined, c, 'gte')" |
127 | 127 | :valueEnd="getFilterItem({ column: c, operator: 'lte' })" |
128 | | - @update:valueEnd="onFilterInput[c.name]({ column: c, operator: 'lte', value: ($event !== '' && $event !== null) ? (c.type === 'decimal' ? String($event) : $event) : undefined })" |
| 128 | + @update:valueEnd="(val) => rangeChangeHandler((val !== '' && val !== null) ? (c.type === 'decimal' ? String(val) : val) : undefined, c, 'lte')" |
129 | 129 | /> |
130 | 130 |
|
131 | 131 | <div v-else-if="['integer', 'decimal', 'float'].includes(c.type)" class="flex gap-2"> |
@@ -275,6 +275,27 @@ const onFilterInput = computed(() => { |
275 | 275 | }, {}); |
276 | 276 | }); |
277 | 277 |
|
| 278 | +// rangeState is used for cutom range picker, because if we change two values very quickly |
| 279 | +// in filters writes only the last one, because of debounce |
| 280 | +const rangeState = reactive({}); |
| 281 | +
|
| 282 | +const updateRange = (column) => { |
| 283 | + debounce(() => { |
| 284 | + const { gte, lte } = rangeState[column.name]; |
| 285 | +
|
| 286 | + setFilterItem({ column, operator: 'gte', value: gte }); |
| 287 | + setFilterItem({ column, operator: 'lte', value: lte }); |
| 288 | + }, column?.filterOptions?.debounceTimeMs || 10)(); |
| 289 | +} |
| 290 | +
|
| 291 | +function rangeChangeHandler(value, column, operator) { |
| 292 | + if (!rangeState[column.name]) { |
| 293 | + rangeState[column.name] = { gte: null, lte: null }; |
| 294 | + } |
| 295 | + rangeState[column.name][operator] = value; |
| 296 | + updateRange(column); |
| 297 | +} |
| 298 | +
|
278 | 299 | const onSearchInput = computed(() => { |
279 | 300 | return createSearchInputHandlers( |
280 | 301 | props.columns, |
|
0 commit comments