Skip to content

Commit 6e3248a

Browse files
hahn-kevrmunn
andauthored
fix playwright test failures on admin dashboard (#1665)
* Have FilterBar do its own debouncing Don't use DebouncedInput in FilterBar as it's causing Playwright test failures where links briefly aren't clickable. Doing the debouncing directly in FilterBar eliminates the issue. --------- Co-authored-by: Robin Munn <[email protected]>
1 parent 25d07c7 commit 6e3248a

File tree

3 files changed

+17
-60
lines changed

3 files changed

+17
-60
lines changed

frontend/src/lib/components/FilterBar/FilterBar.svelte

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,19 @@
1313
<script lang="ts">
1414
import type { ConditionalPick } from 'type-fest';
1515
import Loader from '$lib/components/Loader.svelte';
16-
import { DebouncedInput } from '$lib/forms';
16+
import { PlainInput } from '$lib/forms';
1717
import { pick } from '$lib/util/object';
1818
import t from '$lib/i18n';
1919
import type { Writable } from 'svelte/store';
2020
import Dropdown from '../Dropdown.svelte';
21-
import { Previous } from 'runed';
21+
import { Previous, Debounced, watch } from 'runed';
22+
import { DEFAULT_DEBOUNCE_TIME } from '$lib/util/time';
2223
2324
type DumbFilters = $$Generic<Record<string, unknown>>;
2425
// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
2526
type Filters = DumbFilters & Record<typeof searchKey, string>;
2627
27-
let searchInput: DebouncedInput | undefined = $state();
28+
let searchInput: PlainInput | undefined = $state();
2829
2930
interface Props {
3031
searchKey: keyof ConditionalPick<DumbFilters, string>;
@@ -57,6 +58,17 @@
5758
filterSlot,
5859
}: Props = $props();
5960
let undebouncedSearch: string | undefined = $state(undefined);
61+
let watcher: () => string | undefined;
62+
if (debounce === false) {
63+
watcher = () => undebouncedSearch;
64+
} else {
65+
const debounceTime: number = debounce === true ? DEFAULT_DEBOUNCE_TIME : debounce;
66+
const debouncer = new Debounced(() => undebouncedSearch, debounceTime);
67+
watcher = () => debouncer.current;
68+
}
69+
watch(watcher, (value) => {
70+
$allFilters[searchKey] = value as Filters[typeof searchKey];
71+
});
6072
6173
function onClearFiltersClick(): void {
6274
if (!searchInput) return;
@@ -103,10 +115,8 @@
103115
<div class="input filter-bar input-bordered flex items-center gap-2 py-1.5 px-2 flex-wrap h-[unset] min-h-12">
104116
{@render activeFilterSlot?.({ activeFilters })}
105117
<div class="flex grow">
106-
<DebouncedInput
107-
bind:value={$allFilters[searchKey]}
108-
{debounce}
109-
bind:undebouncedValue={undebouncedSearch}
118+
<PlainInput
119+
bind:value={undebouncedSearch}
110120
bind:this={searchInput}
111121
placeholder={$t('filter.placeholder')}
112122
style="seach-input border-none h-8 px-1 focus:outline-none min-w-[120px] flex-grow"

frontend/src/lib/forms/DebouncedInput.svelte

Lines changed: 0 additions & 51 deletions
This file was deleted.

frontend/src/lib/forms/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import FormField from './FormField.svelte';
55
import FormError from './FormError.svelte';
66
import Input from './Input.svelte';
77
import PlainInput from './PlainInput.svelte';
8-
import DebouncedInput from './DebouncedInput.svelte';
98
import Checkbox from './Checkbox.svelte';
109
import ProtectedForm, { type Token } from './ProtectedForm.svelte';
1110
import MaybeProtectedForm from './MaybeProtectedForm.svelte';
@@ -29,7 +28,6 @@ export {
2928
FormError,
3029
Input,
3130
PlainInput,
32-
DebouncedInput,
3331
ProtectedForm,
3432
MaybeProtectedForm,
3533
Select,

0 commit comments

Comments
 (0)