Skip to content

Commit 237a19b

Browse files
committed
fix: refactor range picker to correctly set filters, when value changes quickly
https://web.tracklify.com/project/2b7ZVgE5/AdminForth/1373/rd80SCLJ/custom-range-picker-incorectly
1 parent e03681d commit 237a19b

File tree

1 file changed

+23
-2
lines changed

1 file changed

+23
-2
lines changed

adminforth/spa/src/components/Filters.vue

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,9 @@
123123
:min="getFilterMinValue(c.name)"
124124
:max="getFilterMaxValue(c.name)"
125125
: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')"
127127
: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')"
129129
/>
130130

131131
<div v-else-if="['integer', 'decimal', 'float'].includes(c.type)" class="flex gap-2">
@@ -275,6 +275,27 @@ const onFilterInput = computed(() => {
275275
}, {});
276276
});
277277
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+
278299
const onSearchInput = computed(() => {
279300
return createSearchInputHandlers(
280301
props.columns,

0 commit comments

Comments
 (0)