taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit 4750a8a1dfbfc3ebbc718aa72123b6f767a499ab
parent 7b1dc6cda0901dfc13e156b41b49c33064988a00
Author: Sebastian <sebasjm@gmail.com>
Date:   Wed,  7 May 2025 16:40:02 -0300

fix #9878

Diffstat:
Mpackages/challenger-ui/src/pages/AskChallenge.tsx | 2+-
Mpackages/kyc-ui/src/pages/TriggerKyc.tsx | 24++++++++++++++++++++++++
Mpackages/taler-wallet-webextension/src/components/HistoryItem.tsx | 40+++++++++++++++++++++-------------------
Mpackages/web-util/src/forms/forms-ui.tsx | 16++++++++++++++++
4 files changed, 62 insertions(+), 20 deletions(-)

diff --git a/packages/challenger-ui/src/pages/AskChallenge.tsx b/packages/challenger-ui/src/pages/AskChallenge.tsx @@ -387,7 +387,7 @@ export function AskChallenge({ </form> */} <div class="mx-auto mt-4 max-w-xl "> - <FormUI design={design} model={form.model} /> + <FormUI design={design} model={form.model} onSubmit={onSend?.onClick} /> </div> {lastStatus === undefined ? undefined : ( diff --git a/packages/kyc-ui/src/pages/TriggerKyc.tsx b/packages/kyc-ui/src/pages/TriggerKyc.tsx @@ -356,6 +356,30 @@ export function TriggerKyc({ onKycStarted }: Props): VNode { <i18n.Translate>Challenger test</i18n.Translate> </Button> </div> + <div> + <Button + type="submit" + handler={triggerAmount( + Amounts.parseOrThrow(`${config.config.currency}:1000120`), + )} + // disabled={!submitHandler} + class="disabled:opacity-50 disabled:cursor-default rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600" + > + <i18n.Translate>Trigger VQF 902.9 customer</i18n.Translate> + </Button> + </div> + <div> + <Button + type="submit" + handler={triggerAmount( + Amounts.parseOrThrow(`${config.config.currency}:1000130`), + )} + // disabled={!submitHandler} + class="disabled:opacity-50 disabled:cursor-default rounded-md bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600" + > + <i18n.Translate>Trigger VQF 902.9 officer</i18n.Translate> + </Button> + </div> </div> </div> ); diff --git a/packages/taler-wallet-webextension/src/components/HistoryItem.tsx b/packages/taler-wallet-webextension/src/components/HistoryItem.tsx @@ -50,10 +50,10 @@ export function HistoryItem(props: { tx: Transaction }): VNode { switch (tx.type) { case TransactionType.Withdrawal: //withdrawal that has not been confirmed are hidden - if (!tx.exchangeBaseUrl) return <Fragment /> + if (!tx.exchangeBaseUrl) return <Fragment />; return ( <Layout - id={tx.transactionId} + href={Pages.balanceTransaction({ tid: tx.transactionId })} amount={tx.amountEffective} debitCreditIndicator={"credit"} title={new URL(tx.exchangeBaseUrl).hostname} @@ -77,7 +77,7 @@ export function HistoryItem(props: { tx: Transaction }): VNode { case TransactionType.InternalWithdrawal: return ( <Layout - id={tx.transactionId} + href={Pages.balanceTransaction({ tid: tx.transactionId })} amount={tx.amountEffective} debitCreditIndicator={"credit"} title={new URL(tx.exchangeBaseUrl).hostname} @@ -101,7 +101,7 @@ export function HistoryItem(props: { tx: Transaction }): VNode { case TransactionType.Payment: return ( <Layout - id={tx.transactionId} + href={Pages.balanceTransaction({ tid: tx.transactionId })} amount={tx.amountEffective} debitCreditIndicator={"debit"} title={tx.info.merchant.name} @@ -119,7 +119,7 @@ export function HistoryItem(props: { tx: Transaction }): VNode { case TransactionType.Refund: return ( <Layout - id={tx.transactionId} + href={Pages.balanceTransaction({ tid: tx.transactionId })} amount={tx.amountEffective} debitCreditIndicator={"credit"} subtitle={tx.paymentInfo ? tx.paymentInfo.summary : undefined} //FIXME: DD37 wallet-core is not returning this value @@ -141,7 +141,7 @@ export function HistoryItem(props: { tx: Transaction }): VNode { case TransactionType.Refresh: return ( <Layout - id={tx.transactionId} + href={Pages.balanceTransaction({ tid: tx.transactionId })} amount={tx.amountEffective} debitCreditIndicator={"credit"} title={"Refresh"} @@ -155,13 +155,15 @@ export function HistoryItem(props: { tx: Transaction }): VNode { } /> ); - case TransactionType.Deposit:{ + case TransactionType.Deposit: { const payto = parsePaytoUri(tx.targetPaytoUri); - const title = payto === undefined || !payto.isKnown ? tx.targetPaytoUri : - payto.params["receiver-name"] ; + const title = + payto === undefined || !payto.isKnown + ? tx.targetPaytoUri + : payto.params["receiver-name"]; return ( <Layout - id={tx.transactionId} + href={Pages.balanceTransaction({ tid: tx.transactionId })} amount={tx.amountEffective} debitCreditIndicator={"debit"} title={title} @@ -179,7 +181,7 @@ export function HistoryItem(props: { tx: Transaction }): VNode { case TransactionType.PeerPullCredit: return ( <Layout - id={tx.transactionId} + href={Pages.balanceTransaction({ tid: tx.transactionId })} amount={tx.amountEffective} debitCreditIndicator={"credit"} title={tx.info.summary || "Invoice"} @@ -196,7 +198,7 @@ export function HistoryItem(props: { tx: Transaction }): VNode { case TransactionType.PeerPullDebit: return ( <Layout - id={tx.transactionId} + href={Pages.balanceTransaction({ tid: tx.transactionId })} amount={tx.amountEffective} debitCreditIndicator={"debit"} title={tx.info.summary || "Invoice"} @@ -213,7 +215,7 @@ export function HistoryItem(props: { tx: Transaction }): VNode { case TransactionType.PeerPushCredit: return ( <Layout - id={tx.transactionId} + href={Pages.balanceTransaction({ tid: tx.transactionId })} amount={tx.amountEffective} debitCreditIndicator={"credit"} title={tx.info.summary || "Transfer"} @@ -230,7 +232,7 @@ export function HistoryItem(props: { tx: Transaction }): VNode { case TransactionType.PeerPushDebit: return ( <Layout - id={tx.transactionId} + href={Pages.balanceTransaction({ tid: tx.transactionId })} amount={tx.amountEffective} debitCreditIndicator={"debit"} title={tx.info.summary || "Transfer"} @@ -249,7 +251,7 @@ export function HistoryItem(props: { tx: Transaction }): VNode { case DenomLossEventType.DenomExpired: { return ( <Layout - id={tx.transactionId} + href={Pages.balanceTransaction({ tid: tx.transactionId })} amount={tx.amountEffective} debitCreditIndicator={"debit"} title={i18n.str`Denomination expired`} @@ -263,7 +265,7 @@ export function HistoryItem(props: { tx: Transaction }): VNode { case DenomLossEventType.DenomVanished: { return ( <Layout - id={tx.transactionId} + href={Pages.balanceTransaction({ tid: tx.transactionId })} amount={tx.amountEffective} debitCreditIndicator={"debit"} title={i18n.str`Denomination vanished`} @@ -277,7 +279,7 @@ export function HistoryItem(props: { tx: Transaction }): VNode { case DenomLossEventType.DenomUnoffered: { return ( <Layout - id={tx.transactionId} + href={Pages.balanceTransaction({ tid: tx.transactionId })} amount={tx.amountEffective} debitCreditIndicator={"debit"} title={i18n.str`Denomination unoffered`} @@ -306,7 +308,7 @@ function Layout(props: LayoutProps): VNode { const { i18n } = useTranslationContext(); return ( <HistoryRow - href={Pages.balanceTransaction({ tid: props.id })} + href={props.href} style={{ backgroundColor: props.currentState === TransactionMajorState.Pending || @@ -363,10 +365,10 @@ interface LayoutProps { timestamp: AbsoluteTime; title: string; subtitle?: string; - id: string; iconPath: string; currentState: TransactionMajorState; description?: string; + href: string; } interface TransactionAmountProps { diff --git a/packages/web-util/src/forms/forms-ui.tsx b/packages/web-util/src/forms/forms-ui.tsx @@ -101,12 +101,14 @@ export function FormUI<T>({ model, disabled, focus, + onSubmit, }: { name?: string; design: FormDesign; model: FormModel; focus?: boolean; disabled?: boolean; + onSubmit?: () => void; }): VNode { switch (design.type) { case "double-column": { @@ -121,6 +123,7 @@ export function FormUI<T>({ model={model} focus={focus} disabled={disabled} + onSubmit={onSubmit} /> ); }); @@ -142,6 +145,7 @@ export function FormUI<T>({ fields={design.fields} model={model} focus={focus} + onSubmit={onSubmit} disabled={disabled} /> ); @@ -156,6 +160,7 @@ export function DoubleColumnFormSectionUI<T>({ focus, model, disabled, + onSubmit, }: { sectionKey: string; name: string; @@ -163,6 +168,7 @@ export function DoubleColumnFormSectionUI<T>({ section: DoubleColumnFormSection; focus?: boolean; disabled?: boolean; + onSubmit?: () => void; }): VNode { const { i18n } = useTranslationContext(); const fs = convertFormConfigToUiField( @@ -194,6 +200,10 @@ export function DoubleColumnFormSectionUI<T>({ <form name={name} class="grid grid-cols-1 gap-x-8 gap-y-8 pt-5 md:grid-cols-3" + onSubmit={(e) => { + e.preventDefault(); + if (onSubmit) onSubmit(); + }} > <div class="px-4 sm:px-0"> <h2 class="text-base font-semibold leading-7 text-gray-900"> @@ -227,18 +237,24 @@ export function SingleColumnFormSectionUI<T>({ model, focus, disabled, + onSubmit, }: { name: string; model: FormModel; fields: UIFormElementConfig[]; focus?: boolean; disabled?: boolean; + onSubmit?: () => void; }): VNode { const { i18n } = useTranslationContext(); return ( <form name={name} class="bg-white shadow-sm ring-1 ring-gray-900/5 rounded-md md:col-span-2" + onSubmit={(e) => { + e.preventDefault(); + if (onSubmit) onSubmit(); + }} > <div class="p-3"> <div class="grid max-w-2xl grid-cols-1 gap-x-6 gap-y-8 sm:grid-cols-6">