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:
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(