Skip to content

Commit 12f983e

Browse files
committed
feat: added keyboard lookup
1 parent 55390ed commit 12f983e

File tree

3 files changed

+79
-25
lines changed

3 files changed

+79
-25
lines changed

packages/create-invoice-form/src/lib/create-invoice-form.svelte

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import Button from "@requestnetwork/shared-components/button.svelte";
2424
import Status from "@requestnetwork/shared-components/status.svelte";
2525
import Modal from "@requestnetwork/shared-components/modal.svelte";
26-
import { EncryptionTypes, CipherProviderTypes } from '@requestnetwork/types';
26+
import { EncryptionTypes, CipherProviderTypes } from "@requestnetwork/types";
2727
2828
export let config: IConfig;
2929
export let wagmiConfig: WagmiConfig;
@@ -115,7 +115,7 @@
115115
totalAmount: 0,
116116
};
117117
118-
$: cipherProvider = requestNetwork?.getCipherProvider();
118+
$: cipherProvider = undefined;
119119
120120
$: {
121121
if (wagmiConfig) {
@@ -188,7 +188,7 @@
188188
try {
189189
addToStatus(APP_STATUS.PERSISTING_TO_IPFS);
190190
let request;
191-
if(cipherProvider && formData.isEncrypted) {
191+
if (cipherProvider && formData.isEncrypted) {
192192
const payeeEncryptionParams = {
193193
key: requestCreateParameters.requestInfo.payee?.value!,
194194
method: EncryptionTypes.METHOD.KMS,
@@ -205,7 +205,7 @@
205205
paymentNetwork: requestCreateParameters.paymentNetwork,
206206
contentData: requestCreateParameters.contentData,
207207
},
208-
[payeeEncryptionParams, payerEncryptionParams],
208+
[payeeEncryptionParams, payerEncryptionParams]
209209
);
210210
} else {
211211
request = await requestNetwork.createRequest({

packages/create-invoice-form/src/lib/invoice/form.svelte

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,19 @@
568568
</tbody>
569569
</table>
570570
</div>
571+
<div class="flex justify-between invoice-form-table-body-add-item">
572+
<Button
573+
text="Add Item"
574+
type="button"
575+
onClick={() => {
576+
addInvoiceItem();
577+
}}
578+
>
579+
<div slot="icon">
580+
<Plus />
581+
</div>
582+
</Button>
583+
</div>
571584
<div class="invoice-form-dates">
572585
<Input
573586
id="issuedOn"
@@ -587,19 +600,7 @@
587600
{handleInput}
588601
/>
589602
</div>
590-
<div class="flex justify-between invoice-form-table-body-add-item">
591-
<Button
592-
text="Add Item"
593-
type="button"
594-
onClick={() => {
595-
addInvoiceItem();
596-
}}
597-
>
598-
<div slot="icon">
599-
<Plus />
600-
</div>
601-
</Button>
602-
</div>
603+
603604
<div class="invoice-form-label-wrapper">
604605
<Input
605606
max={200}
@@ -643,7 +644,7 @@
643644
box-shadow: 0 4px 4px rgba(0, 0, 0, 0.06);
644645
gap: 20px;
645646
box-sizing: border-box;
646-
min-width: 700px;
647+
min-width: 760px;
647648
}
648649
649650
.invoice-form-container {

shared/components/searchable-dropdown.svelte

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
let searchTerm = "";
1212
let isOpen = false;
1313
let filteredItems: any[] = [];
14+
let selectedIndex = -1;
15+
let dropdownElement: HTMLDivElement;
1416
1517
$: filteredItems = searchTerm
1618
? items.filter((item) => {
@@ -24,6 +26,54 @@
2426
);
2527
})
2628
: items;
29+
30+
function handleKeydown(event: KeyboardEvent) {
31+
if (!isOpen) return;
32+
33+
switch (event.key) {
34+
case "ArrowDown":
35+
event.preventDefault();
36+
selectedIndex = Math.min(selectedIndex + 1, filteredItems.length - 1);
37+
scrollSelectedIntoView();
38+
break;
39+
case "ArrowUp":
40+
event.preventDefault();
41+
selectedIndex = Math.max(selectedIndex - 1, -1);
42+
scrollSelectedIntoView();
43+
break;
44+
case "Enter":
45+
event.preventDefault();
46+
if (selectedIndex >= 0 && selectedIndex < filteredItems.length) {
47+
selectItem(filteredItems[selectedIndex]);
48+
}
49+
break;
50+
case "Escape":
51+
event.preventDefault();
52+
isOpen = false;
53+
selectedIndex = -1;
54+
break;
55+
}
56+
}
57+
58+
function scrollSelectedIntoView() {
59+
if (dropdownElement && selectedIndex >= 0) {
60+
const selectedElement = dropdownElement.children[
61+
selectedIndex
62+
] as HTMLElement;
63+
if (selectedElement) {
64+
selectedElement.scrollIntoView({ block: "nearest" });
65+
}
66+
}
67+
}
68+
69+
function selectItem(item: any) {
70+
onSelect(item.value);
71+
searchTerm = getValue(item);
72+
isOpen = false;
73+
selectedIndex = -1;
74+
}
75+
76+
$: if (!isOpen) selectedIndex = -1;
2777
</script>
2878

2979
{#if isOpen && !disabled}
@@ -37,6 +87,7 @@
3787
{placeholder}
3888
bind:value={searchTerm}
3989
on:focus={() => !disabled && (isOpen = true)}
90+
on:keydown={handleKeydown}
4091
{disabled}
4192
/>
4293
<svg
@@ -55,15 +106,13 @@
55106
</svg>
56107
</div>
57108
{#if isOpen && !disabled}
58-
<div class="dropdown-list">
59-
{#each filteredItems as item}
109+
<div class="dropdown-list" bind:this={dropdownElement}>
110+
{#each filteredItems as item, index}
60111
<div
61112
class="dropdown-item"
62-
on:click={() => {
63-
onSelect(item.value);
64-
searchTerm = getValue(item);
65-
isOpen = false;
66-
}}
113+
class:selected={index === selectedIndex}
114+
on:click={() => selectItem(item)}
115+
on:mouseenter={() => (selectedIndex = index)}
67116
>
68117
{#if item.type === "network"}
69118
<Network network={item.value} showLabel={false} />
@@ -163,4 +212,8 @@
163212
pointer-events: none;
164213
z-index: 1;
165214
}
215+
216+
.dropdown-item.selected {
217+
background-color: #f0f0f0;
218+
}
166219
</style>

0 commit comments

Comments
 (0)