taler-typescript-core

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

commit ddbcc263b03de6dacea0f2781c0f57d79f6f224d
parent e1766b10e3cb3c7aa42144cada05b65239c9f976
Author: Sebastian <sebasjm@gmail.com>
Date:   Tue,  1 Apr 2025 15:06:15 -0300

carry payto on wizard when the it is a new account

Diffstat:
Mpackages/aml-backoffice-ui/src/Routing.tsx | 62+++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
Mpackages/aml-backoffice-ui/src/forms/index.ts | 7+------
Mpackages/aml-backoffice-ui/src/pages/decision/AmlDecisionRequestWizard.tsx | 5++++-
Mpackages/aml-backoffice-ui/src/pages/decision/Properties.tsx | 43++++++++++++++++++++++++++++---------------
Mpackages/aml-backoffice-ui/src/pages/decision/Summary.tsx | 4++++
5 files changed, 92 insertions(+), 29 deletions(-)

diff --git a/packages/aml-backoffice-ui/src/Routing.tsx b/packages/aml-backoffice-ui/src/Routing.tsx @@ -15,6 +15,8 @@ */ import { + decodeCrockFromURI, + encodeCrockForURI, urlPattern, useCurrentLocation, useNavigationContext, @@ -107,6 +109,9 @@ export const privatePages = { profile: urlPattern(/\/profile/, () => "#/profile"), dashboard: urlPattern(/\/dashboard/, () => "#/dashboard"), statsDownload: urlPattern(/\/download-stats/, () => "#/download-stats"), + /** + * This 4 URL could be only one with multple params + */ decideWithStep: urlPattern<{ cid: string; step: string }>( /\/decide\/(?<cid>[a-zA-Z0-9]+)\/(?<step>[a-z]+)/, ({ cid, step }) => `#/decide/${cid}/${step}`, @@ -115,6 +120,10 @@ export const privatePages = { /\/decide\/(?<cid>[a-zA-Z0-9]+)/, ({ cid }) => `#/decide/${cid}`, ), + decideNewWithStep: urlPattern<{ cid: string; payto: string; step: string }>( + /\/decide_new\/(?<cid>[a-zA-Z0-9]+)\/(?<payto>[a-zA-Z0-9]+)\/(?<step>[a-z]+)/, + ({ cid, payto, step }) => `#/decide_new/${cid}/${payto}/${step}`, + ), decideNew: urlPattern<{ cid: string; payto: string }>( /\/decide_new\/(?<cid>[a-zA-Z0-9]+)\/(?<payto>[a-zA-Z0-9]+)/, ({ cid, payto }) => `#/decide_new/${cid}/${payto}`, @@ -157,11 +166,13 @@ function PrivateRouting(): VNode { case "measuresNew": { return <NewMeasure />; } - case "decideNew": { + case "decide": { return ( <AmlDecisionRequestWizard account={location.values.cid} - formId={location.params.formId ? location.params.formId[0] : undefined} + formId={ + location.params.formId ? location.params.formId[0] : undefined + } onMove={(step) => { if (!step) { if (location.values.cid) { @@ -183,11 +194,14 @@ function PrivateRouting(): VNode { /> ); } - case "decide": { + case "decideWithStep": { return ( <AmlDecisionRequestWizard account={location.values.cid} - formId={location.params.formId ? location.params.formId[0] : undefined} + formId={ + location.params.formId ? location.params.formId[0] : undefined + } + step={location.values.step as WizardSteps} onMove={(step) => { if (!step) { if (location.values.cid) { @@ -209,11 +223,44 @@ function PrivateRouting(): VNode { /> ); } - case "decideWithStep": { + case "decideNew": { + return ( + <AmlDecisionRequestWizard + account={location.values.cid} + newPayto={decodeCrockFromURI(location.values.payto)} + formId={ + location.params.formId ? location.params.formId[0] : undefined + } + onMove={(step) => { + if (!step) { + if (location.values.cid) { + navigateTo( + privatePages.caseDetails.url({ cid: location.values.cid }), + ); + } else { + navigateTo(privatePages.dashboard.url({})); + } + } else { + navigateTo( + privatePages.decideNewWithStep.url({ + cid: location.values.cid, + payto: location.values.payto, + step, + }), + ); + } + }} + /> + ); + } + case "decideNewWithStep": { return ( <AmlDecisionRequestWizard account={location.values.cid} - formId={location.params.formId ? location.params.formId[0] : undefined} + newPayto={decodeCrockFromURI(location.values.payto)} + formId={ + location.params.formId ? location.params.formId[0] : undefined + } step={location.values.step as WizardSteps} onMove={(step) => { if (!step) { @@ -226,8 +273,9 @@ function PrivateRouting(): VNode { } } else { navigateTo( - privatePages.decideWithStep.url({ + privatePages.decideNewWithStep.url({ cid: location.values.cid, + payto: location.values.payto, step, }), ); diff --git a/packages/aml-backoffice-ui/src/forms/index.ts b/packages/aml-backoffice-ui/src/forms/index.ts @@ -14,6 +14,7 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ import { + design_VQF_902_1_customer, form_vqf_902_1_customer, VQF_902_11, VQF_902_14, @@ -29,12 +30,6 @@ import { v1 as simplest } from "./simplest.js"; export const preloadedForms: ( i18n: InternationalizationAPI, ) => Array<FormMetadata> = (i18n) => [ - // { - // label: i18n.str`Simple comment`, - // id: "__simple_comment", - // version: 1, - // config: simplest(i18n, ), - // }, form_vqf_902_1_customer(i18n), { label: i18n.str`Identification Form (acceptance)`, diff --git a/packages/aml-backoffice-ui/src/pages/decision/AmlDecisionRequestWizard.tsx b/packages/aml-backoffice-ui/src/pages/decision/AmlDecisionRequestWizard.tsx @@ -15,6 +15,7 @@ */ import { assertUnreachable, + PaytoString, TranslatedString } from "@gnu-taler/taler-util"; import { @@ -89,11 +90,13 @@ function isJustificationCompleted(request: DecisionRequest): boolean { export function AmlDecisionRequestWizard({ account, + newPayto, step, formId, onMove, }: { account: string; + newPayto?: PaytoString, formId: string | undefined; step?: WizardSteps; onMove: (n: WizardSteps | undefined) => void; @@ -115,7 +118,7 @@ export function AmlDecisionRequestWizard({ case "attributes": return <Attributes formId={formId}/>; case "summary": - return <Summary account={account} onMove={onMove} />; + return <Summary account={account} onMove={onMove} newPayto={newPayto}/>; } assertUnreachable(stepOrDefault); })(); diff --git a/packages/aml-backoffice-ui/src/pages/decision/Properties.tsx b/packages/aml-backoffice-ui/src/pages/decision/Properties.tsx @@ -1,14 +1,16 @@ import { AccountProperties, AmlSpaDialect, + assertUnreachable, GLS_AccountProperties, GLS_AML_PROPERTIES, + HttpStatusCode, LegitimizationRuleSet, PropertiesMapInfo, TalerError, TalerFormAttributes, TOPS_AccountProperties, - TOPS_AML_PROPERTIES + TOPS_AML_PROPERTIES, } from "@gnu-taler/taler-util"; import { FormDesign, @@ -20,7 +22,7 @@ import { UIHandlerId, useExchangeApiContext, useForm, - useTranslationContext + useTranslationContext, } from "@gnu-taler/web-util/browser"; import { h, VNode } from "preact"; import { @@ -29,6 +31,7 @@ import { } from "../../hooks/decision-request.js"; import { useAccountActiveDecision } from "../../hooks/decisions.js"; import { usePreferences } from "../../hooks/preferences.js"; +import { ErrorLoadingWithDebug } from "../../components/ErrorLoadingWithDebug.js"; /** * Update account properites @@ -41,29 +44,40 @@ export function Properties({ account }: { account: string }): VNode { const { config } = useExchangeApiContext(); const [pref] = usePreferences(); - const lastDecision = - !activeDecision || - activeDecision instanceof TalerError || - activeDecision.type === "fail" - ? undefined - : activeDecision.body; + if (!activeDecision) { + return <Loading />; + } + if (activeDecision instanceof TalerError) { + return <ErrorLoadingWithDebug error={activeDecision} />; + } + if (activeDecision.type === "fail") { + switch (activeDecision.case) { + // case HttpStatusCode.Unauthorized: + case HttpStatusCode.Forbidden: + case HttpStatusCode.NotFound: + case HttpStatusCode.Conflict: + return <div />; + default: + assertUnreachable(activeDecision); + } + } + + const lastDecision = activeDecision.body; const dialect = (pref.testingDialect ? undefined : config.config.aml_spa_dialect) ?? AmlSpaDialect.TESTING; - if (!lastDecision) { - return <Loading /> - } - - const calculatedProps = calculatePropertiesBasedOnState( + const calculatedProps = !lastDecision + ? undefined + : calculatePropertiesBasedOnState( lastDecision.limits, lastDecision.properties ?? {}, request, dialect, ); - const merged = Object.entries(calculatedProps).reduce( + const merged = !calculatedProps ? {} : Object.entries(calculatedProps).reduce( (prev, [key, value]) => { if (prev[key] === undefined) { prev[key] = !!value; @@ -269,5 +283,4 @@ function calculatePropertiesBasedOnState( ); } } - } diff --git a/packages/aml-backoffice-ui/src/pages/decision/Summary.tsx b/packages/aml-backoffice-ui/src/pages/decision/Summary.tsx @@ -4,6 +4,7 @@ import { assertUnreachable, Duration, HttpStatusCode, + PaytoString, TalerError, } from "@gnu-taler/taler-util"; import { @@ -34,8 +35,10 @@ import { useCustomMeasures } from "../../hooks/custom-measures.js"; export function Summary({ account, onMove, + newPayto, }: { account?: string; + newPayto?: PaytoString; onMove: (n: WizardSteps | undefined) => void; }): VNode { const { i18n } = useTranslationContext(); @@ -108,6 +111,7 @@ export function Summary({ AbsoluteTime.now(), ), justification: decision.justification!, + payto_uri: newPayto, keep_investigating: decision.keep_investigating, new_rules: { expiration_time: AbsoluteTime.toProtocolTimestamp(