[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-wallet-core] branch master updated: take the right imports, remov
From: |
gnunet |
Subject: |
[taler-wallet-core] branch master updated: take the right imports, remove unused code, move gana forms to web-utils |
Date: |
Fri, 10 Jan 2025 20:28:35 +0100 |
This is an automated email from the git hooks/post-receive script.
sebasjm pushed a commit to branch master
in repository wallet-core.
The following commit(s) were added to refs/heads/master by this push:
new a4973dc23 take the right imports, remove unused code, move gana forms
to web-utils
a4973dc23 is described below
commit a4973dc237a9c775d23d151db065c8f29699fa18
Author: Sebastian <sebasjm@gmail.com>
AuthorDate: Fri Jan 10 16:28:23 2025 -0300
take the right imports, remove unused code, move gana forms to web-utils
---
packages/aml-backoffice-ui/src/hooks/form.ts | 216 -------------------
packages/aml-backoffice-ui/src/pages/Cases.tsx | 37 +---
.../aml-backoffice-ui/src/pages/CreateAccount.tsx | 22 +-
packages/aml-backoffice-ui/src/pages/Search.tsx | 6 +-
.../aml-backoffice-ui/src/pages/UnlockAccount.tsx | 4 +-
packages/kyc-ui/src/forms/index.ts | 18 +-
packages/kyc-ui/src/hooks/form.ts | 228 ---------------------
packages/kyc-ui/src/pages/FillForm.tsx | 9 -
packages/web-util/src/forms/Caption.tsx | 5 +-
packages/web-util/src/forms/DownloadLink.tsx | 2 +-
packages/web-util/src/forms/Group.tsx | 5 +-
packages/web-util/src/forms/HtmlIframe.tsx | 2 +-
packages/web-util/src/forms/field-types.ts | 35 ++--
.../{ => fields}/InputAbsoluteTime.stories.tsx | 6 +-
.../src/forms/{ => fields}/InputAbsoluteTime.tsx | 6 +-
.../src/forms/{ => fields}/InputAmount.stories.tsx | 6 +-
.../src/forms/{ => fields}/InputAmount.tsx | 2 +-
.../src/forms/{ => fields}/InputArray.stories.tsx | 6 +-
.../web-util/src/forms/{ => fields}/InputArray.tsx | 8 +-
.../{ => fields}/InputChoiceHorizontal.stories.tsx | 6 +-
.../forms/{ => fields}/InputChoiceHorizontal.tsx | 2 +-
.../{ => fields}/InputChoiceStacked.stories.tsx | 6 +-
.../src/forms/{ => fields}/InputChoiceStacked.tsx | 2 +-
.../src/forms/{ => fields}/InputFile.stories.tsx | 6 +-
.../web-util/src/forms/{ => fields}/InputFile.tsx | 2 +-
.../forms/{ => fields}/InputInteger.stories.tsx | 6 +-
.../src/forms/{ => fields}/InputInteger.tsx | 2 +-
.../web-util/src/forms/{ => fields}/InputLine.tsx | 2 +-
.../{ => fields}/InputSelectMultiple.stories.tsx | 6 +-
.../src/forms/{ => fields}/InputSelectMultiple.tsx | 2 +-
.../forms/{ => fields}/InputSelectOne.stories.tsx | 6 +-
.../src/forms/{ => fields}/InputSelectOne.tsx | 2 +-
.../src/forms/{ => fields}/InputText.stories.tsx | 6 +-
.../web-util/src/forms/{ => fields}/InputText.tsx | 2 +-
.../forms/{ => fields}/InputTextArea.stories.tsx | 6 +-
.../src/forms/{ => fields}/InputTextArea.tsx | 2 +-
.../src/forms/{ => fields}/InputToggle.stories.tsx | 6 +-
.../src/forms/{ => fields}/InputToggle.tsx | 2 +-
.../forms => web-util/src/forms/gana}/VQF_902_1.ts | 0
.../src/forms/gana}/VQF_902_11.ts | 0
.../src/forms/gana}/VQF_902_12.ts | 0
.../src/forms/gana}/VQF_902_13.ts | 0
.../src/forms/gana}/VQF_902_14.ts | 0
.../src/forms/gana}/VQF_902_15.ts | 0
.../forms => web-util/src/forms/gana}/VQF_902_4.ts | 0
.../forms => web-util/src/forms/gana}/VQF_902_5.ts | 0
.../forms => web-util/src/forms/gana}/VQF_902_9.ts | 0
.../src/forms/gana}/taler_form_attributes.ts | 0
packages/web-util/src/forms/index.stories.ts | 24 +--
packages/web-util/src/forms/index.ts | 36 ++--
packages/web-util/src/forms/useField.ts | 95 ---------
packages/web-util/src/hooks/index.ts | 8 +-
52 files changed, 140 insertions(+), 720 deletions(-)
diff --git a/packages/aml-backoffice-ui/src/hooks/form.ts
b/packages/aml-backoffice-ui/src/hooks/form.ts
deleted file mode 100644
index 6305e4cf5..000000000
--- a/packages/aml-backoffice-ui/src/hooks/form.ts
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- This file is part of GNU Taler
- (C) 2022-2024 Taler Systems S.A.
-
- GNU Taler is free software; you can redistribute it and/or modify it under the
- terms of the GNU General Public License as published by the Free Software
- Foundation; either version 3, or (at your option) any later version.
-
- GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along with
- GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
- */
-
-import {
- AbsoluteTime,
- AmountJson,
- TalerExchangeApi,
- TranslatedString,
-} from "@gnu-taler/taler-util";
-import {
- UIFieldHandler,
- UIFormElementConfig,
- UIHandlerId,
-} from "@gnu-taler/web-util/browser";
-import { useState } from "preact/hooks";
-import { undefinedIfEmpty } from "../pages/CreateAccount.js";
-
-// export type UIField = {
-// value: string | undefined;
-// onUpdate: (s: string) => void;
-// error: TranslatedString | undefined;
-// };
-
-export type FormHandler<T> = {
- [k in keyof T]?: T[k] extends string
- ? UIFieldHandler
- : T[k] extends AmountJson
- ? UIFieldHandler
- : T[k] extends TalerExchangeApi.AmlState
- ? UIFieldHandler
- : FormHandler<T[k]>;
-};
-
-export type FormValues<T> = {
- [k in keyof T]: T[k] extends string ? string | undefined : FormValues<T[k]>;
-};
-
-export type RecursivePartial<T> = {
- [k in keyof T]?: T[k] extends string
- ? string
- : T[k] extends AmountJson
- ? AmountJson
- : T[k] extends TalerExchangeApi.AmlState
- ? TalerExchangeApi.AmlState
- : RecursivePartial<T[k]>;
-};
-
-export type FormErrors<T> = {
- [k in keyof T]?: T[k] extends string
- ? TranslatedString
- : T[k] extends AmountJson
- ? TranslatedString
- : T[k] extends AbsoluteTime
- ? TranslatedString
- : T[k] extends TalerExchangeApi.AmlState
- ? TranslatedString
- : FormErrors<T[k]>;
-};
-
-export type FormStatus<T> =
- | {
- status: "ok";
- result: T;
- errors: undefined;
- }
- | {
- status: "fail";
- result: RecursivePartial<T>;
- errors: FormErrors<T>;
- };
-
-// function constructFormHandler<T>(
-// shape: Array<UIHandlerId>,
-// form: RecursivePartial<FormValues<T>>,
-// updateForm: (d: RecursivePartial<FormValues<T>>) => void,
-// errors: FormErrors<T> | undefined,
-// ): FormHandler<T> {
-// const handler = shape.reduce((handleForm, fieldId) => {
-// const path = fieldId.split(".");
-
-// function updater(newValue: unknown) {
-// updateForm(setValueDeeper(form, path, newValue));
-// }
-
-// const currentValue = getValueDeeper<string>(form as any, path,
undefined);
-// const currentError = getValueDeeper<TranslatedString>(
-// errors as any,
-// path,
-// undefined,
-// );
-// const field: UIFieldHandler = {
-// error: currentError,
-// value: currentValue,
-// onChange: updater,
-// state: {}, //FIXME: add the state of the field (hidden, )
-// };
-
-// return setValueDeeper(handleForm, path, field);
-// }, {} as FormHandler<T>);
-
-// return handler;
-// }
-
-// export function useFormState<T>(
-// shape: Array<UIHandlerId>,
-// defaultValue: RecursivePartial<FormValues<T>>,
-// check: (f: RecursivePartial<FormValues<T>>) => FormStatus<T>,
-// ): { handler: FormHandler<T>; status: FormStatus<T> } {
-// const [form, updateForm] =
-// useState<RecursivePartial<FormValues<T>>>(defaultValue);
-
-// const status = check(form);
-// const handler = constructFormHandler(shape, form, updateForm,
status.errors);
-
-// return { handler, status };
-// }
-
-interface Tree<T> extends Record<string, Tree<T> | T> {}
-
-export function getValueDeeper<T>(
- object: Tree<T> | undefined,
- names: string[],
- notFoundValue?: T,
-): T | undefined {
- if (names.length === 0) return object as T;
- const [head, ...rest] = names;
- if (!head) {
- return getValueDeeper(object, rest, notFoundValue);
- }
- if (object === undefined) {
- return notFoundValue;
- }
- return getValueDeeper(object[head] as Tree<T>, rest, notFoundValue);
-}
-
-export function setValueDeeper(object: any, names: string[], value: any): any {
- if (names.length === 0) return value;
- const [head, ...rest] = names;
- if (!head) {
- return setValueDeeper(object, rest, value);
- }
- if (object === undefined) {
- return undefinedIfEmpty({ [head]: setValueDeeper({}, rest, value) });
- }
- return undefinedIfEmpty({
- ...object,
- [head]: setValueDeeper(object[head] ?? {}, rest, value),
- });
-}
-
-// export function getShapeFromFields(
-// fields: UIFormElementConfig[],
-// ): Array<UIHandlerId> {
-// const shape: Array<UIHandlerId> = [];
-// fields.forEach((field) => {
-// if ("id" in field) {
-// // FIXME: this should be a validation when loading the form
-// // consistency check
-// if (shape.indexOf(field.id) !== -1) {
-// throw Error(`already present: ${field.id}`);
-// }
-// shape.push(field.id);
-// } else if (field.type === "group") {
-// Array.prototype.push.apply(shape, getShapeFromFields(field.fields));
-// }
-// });
-// return shape;
-// }
-
-// export function getRequiredFields(
-// fields: UIFormElementConfig[],
-// ): Array<UIHandlerId> {
-// const shape: Array<UIHandlerId> = [];
-// fields.forEach((field) => {
-// if ("id" in field) {
-// // FIXME: this should be a validation when loading the form
-// // consistency check
-// if (shape.indexOf(field.id) !== -1) {
-// throw Error(`already present: ${field.id}`);
-// }
-// if (!field.required) {
-// return;
-// }
-// shape.push(field.id);
-// } else if (field.type === "group") {
-// Array.prototype.push.apply(shape, getRequiredFields(field.fields));
-// }
-// });
-// return shape;
-// }
-// export function validateRequiredFields<FormType>(
-// errors: FormErrors<FormType> | undefined,
-// form: object,
-// fields: Array<UIHandlerId>,
-// ): FormErrors<FormType> | undefined {
-// let result: FormErrors<FormType> | undefined = errors;
-// fields.forEach((f) => {
-// const path = f.split(".");
-// const v = getValueDeeper(form as any, path);
-// result = setValueDeeper(result, path, !v ? "required" : undefined);
-// });
-// return result;
-// }
diff --git a/packages/aml-backoffice-ui/src/pages/Cases.tsx
b/packages/aml-backoffice-ui/src/pages/Cases.tsx
index 07185e476..345cfc3b7 100644
--- a/packages/aml-backoffice-ui/src/pages/Cases.tsx
+++ b/packages/aml-backoffice-ui/src/pages/Cases.tsx
@@ -31,10 +31,10 @@ import {
useCurrentDecisionsUnderInvestigation,
} from "../hooks/decisions.js";
+import { useState } from "preact/hooks";
import { privatePages } from "../Routing.js";
import { ErrorLoadingWithDebug } from "../components/ErrorLoadingWithDebug.js";
import { Officer } from "./Officer.js";
-import { useState } from "preact/hooks";
type FormType = {
// state: TalerExchangeApi.AmlState;
@@ -100,41 +100,6 @@ export function CasesUI({
}): VNode {
const { i18n } = useTranslationContext();
- // const [form, status] = useFormState<FormType>(
- // [".state"] as Array<UIHandlerId>,
- // {
- // // state: filter,
- // },
- // (state) => {
- // const errors = undefinedIfEmpty<FormErrors<FormType>>({
- // state: state.state === undefined ? i18n.str`required` : undefined,
- // });
- // if (errors === undefined) {
- // const result: FormType = {
- // state: state.state!,
- // };
- // return {
- // status: "ok",
- // result,
- // errors,
- // };
- // }
- // const result: RecursivePartial<FormType> = {
- // state: state.state,
- // };
- // return {
- // status: "fail",
- // result,
- // errors,
- // };
- // },
- // );
- // useEffect(() => {
- // if (status.status === "ok" && filter !== status.result.state) {
- // onChangeFilter(status.result.state);
- // }
- // }, [form?.state?.value]);
-
return (
<div>
<div class="sm:flex sm:items-center">
diff --git a/packages/aml-backoffice-ui/src/pages/CreateAccount.tsx
b/packages/aml-backoffice-ui/src/pages/CreateAccount.tsx
index ce409458a..d1bafb0a4 100644
--- a/packages/aml-backoffice-ui/src/pages/CreateAccount.tsx
+++ b/packages/aml-backoffice-ui/src/pages/CreateAccount.tsx
@@ -16,22 +16,19 @@
import {
Button,
FormDesign,
+ FormErrors,
FormUI,
- InputLine,
+ FormValues,
InternationalizationAPI,
LocalNotificationBanner,
+ RecursivePartial,
UIHandlerId,
+ undefinedIfEmpty,
useForm,
useLocalNotificationHandler,
useTranslationContext,
} from "@gnu-taler/web-util/browser";
import { VNode, h } from "preact";
-import {
- FormErrors,
- FormStatus,
- FormValues,
- RecursivePartial,
-} from "../hooks/form.js";
import { useOfficer } from "../hooks/officer.js";
import { usePreferences } from "../hooks/preferences.js";
@@ -70,17 +67,6 @@ function createFormValidator(
};
}
-export function undefinedIfEmpty<T extends object | undefined>(
- obj: T,
-): T | undefined {
- if (obj === undefined) return undefined;
- return Object.keys(obj).some(
- (k) => (obj as Record<string, T>)[k] !== undefined,
- )
- ? obj
- : undefined;
-}
-
const createAccountForm = (i18n: InternationalizationAPI): FormDesign => ({
type: "single-column",
fields: [
diff --git a/packages/aml-backoffice-ui/src/pages/Search.tsx
b/packages/aml-backoffice-ui/src/pages/Search.tsx
index d537f86b4..040d73ded 100644
--- a/packages/aml-backoffice-ui/src/pages/Search.tsx
+++ b/packages/aml-backoffice-ui/src/pages/Search.tsx
@@ -31,12 +31,16 @@ import {
Attention,
encodeCrockForURI,
FormDesign,
+ FormErrors,
FormUI,
+ FormValues,
InternationalizationAPI,
Loading,
+ RecursivePartial,
Time,
UIFormElementConfig,
UIHandlerId,
+ undefinedIfEmpty,
useExchangeApiContext,
useForm,
useTranslationContext,
@@ -45,11 +49,9 @@ import { Fragment, h, VNode } from "preact";
import { useState } from "preact/hooks";
import { ErrorLoadingWithDebug } from "../components/ErrorLoadingWithDebug.js";
import { useAccountDecisions } from "../hooks/decisions.js";
-import { FormErrors, FormValues, RecursivePartial } from "../hooks/form.js";
import { useOfficer } from "../hooks/officer.js";
import { privatePages } from "../Routing.js";
import { Pagination, ToInvestigateIcon } from "./Cases.js";
-import { undefinedIfEmpty } from "./CreateAccount.js";
import { HandleAccountNotReady } from "./HandleAccountNotReady.js";
export function Search() {
diff --git a/packages/aml-backoffice-ui/src/pages/UnlockAccount.tsx
b/packages/aml-backoffice-ui/src/pages/UnlockAccount.tsx
index e8014fe32..de3768564 100644
--- a/packages/aml-backoffice-ui/src/pages/UnlockAccount.tsx
+++ b/packages/aml-backoffice-ui/src/pages/UnlockAccount.tsx
@@ -16,18 +16,18 @@
import {
Button,
FormDesign,
+ FormErrors,
InputLine,
InternationalizationAPI,
LocalNotificationBanner,
UIHandlerId,
+ undefinedIfEmpty,
useForm,
useLocalNotificationHandler,
useTranslationContext,
} from "@gnu-taler/web-util/browser";
import { VNode, h } from "preact";
-import { FormErrors } from "../hooks/form.js";
import { useOfficer } from "../hooks/officer.js";
-import { undefinedIfEmpty } from "./CreateAccount.js";
type FormType = {
password: string;
diff --git a/packages/kyc-ui/src/forms/index.ts
b/packages/kyc-ui/src/forms/index.ts
index cc6dfe110..29de3b13a 100644
--- a/packages/kyc-ui/src/forms/index.ts
+++ b/packages/kyc-ui/src/forms/index.ts
@@ -16,20 +16,20 @@
import {
FormMetadata,
InternationalizationAPI,
+ VQF_902_1,
+ VQF_902_11,
+ VQF_902_12,
+ VQF_902_13,
+ VQF_902_14,
+ VQF_902_15,
+ VQF_902_4,
+ VQF_902_5,
+ VQF_902_9,
} from "@gnu-taler/web-util/browser";
import { simplest } from "./simplest.js";
import { acceptTos } from "./accept-tos.js";
import { nameAndDob } from "./nameAndBirthdate.js";
import { personalInfo } from "./personal-info.js";
-import { VQF_902_15 } from "./VQF_902_15.js";
-import { VQF_902_14 } from "./VQF_902_14.js";
-import { VQF_902_13 } from "./VQF_902_13.js";
-import { VQF_902_12 } from "./VQF_902_12.js";
-import { VQF_902_11 } from "./VQF_902_11.js";
-import { VQF_902_9 } from "./VQF_902_9.js";
-import { VQF_902_5 } from "./VQF_902_5.js";
-import { VQF_902_4 } from "./VQF_902_4.js";
-import { VQF_902_1 } from "./VQF_902_1.js";
export const preloadedForms: (
i18n: InternationalizationAPI,
diff --git a/packages/kyc-ui/src/hooks/form.ts
b/packages/kyc-ui/src/hooks/form.ts
deleted file mode 100644
index 9a3be1fdf..000000000
--- a/packages/kyc-ui/src/hooks/form.ts
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- This file is part of GNU Taler
- (C) 2022-2024 Taler Systems S.A.
-
- GNU Taler is free software; you can redistribute it and/or modify it under the
- terms of the GNU General Public License as published by the Free Software
- Foundation; either version 3, or (at your option) any later version.
-
- GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along with
- GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
- */
-
-import {
- AbsoluteTime,
- AmountJson,
- TalerExchangeApi,
- TranslatedString,
-} from "@gnu-taler/taler-util";
-import {
- UIFieldHandler,
- UIFormElementConfig,
- UIHandlerId,
-} from "@gnu-taler/web-util/browser";
-import { useState } from "preact/hooks";
-import { undefinedIfEmpty } from "../pages/Start.js";
-
-// export type UIField = {
-// value: string | undefined;
-// onUpdate: (s: string) => void;
-// error: TranslatedString | undefined;
-// };
-
-export type FormHandler<T> = {
- [k in keyof T]?: T[k] extends string
- ? UIFieldHandler
- : T[k] extends AmountJson
- ? UIFieldHandler
- : T[k] extends TalerExchangeApi.AmlState
- ? UIFieldHandler
- : FormHandler<T[k]>;
-};
-
-export type FormValues<T> = {
- [k in keyof T]: T[k] extends string ? string | undefined : FormValues<T[k]>;
-};
-
-export type RecursivePartial<T> = {
- [k in keyof T]?: T[k] extends string
- ? string
- : T[k] extends AmountJson
- ? AmountJson
- : T[k] extends TalerExchangeApi.AmlState
- ? TalerExchangeApi.AmlState
- : RecursivePartial<T[k]>;
-};
-
-export type FormErrors<T> = {
- [k in keyof T]?: T[k] extends string
- ? TranslatedString
- : T[k] extends AmountJson
- ? TranslatedString
- : T[k] extends AbsoluteTime
- ? TranslatedString
- : T[k] extends TalerExchangeApi.AmlState
- ? TranslatedString
- : FormErrors<T[k]>;
-};
-
-export type FormStatus<T> =
- | {
- status: "ok";
- result: T;
- errors: undefined;
- }
- | {
- status: "fail";
- result: RecursivePartial<T>;
- errors: FormErrors<T>;
- };
-
-function constructFormHandler<T>(
- shape: Array<UIHandlerId>,
- form: RecursivePartial<FormValues<T>>,
- updateForm: (d: RecursivePartial<FormValues<T>>) => void,
- errors: FormErrors<T> | undefined,
-): FormHandler<T> {
- const handler = shape.reduce((handleForm, fieldId) => {
- const path = fieldId.split(".");
-
- function updater(newValue: unknown) {
- updateForm(setValueDeeper(form, path, newValue));
- }
-
- const currentValue = getValueDeeper<string>(form as any, path, undefined);
- const currentError = getValueDeeper<TranslatedString>(
- errors as any,
- path,
- undefined,
- );
- const field: UIFieldHandler = {
- error: currentError,
- value: currentValue,
- onChange: updater,
- state: {}, //FIXME: add the state of the field (hidden, )
- };
-
- return setValueDeeper(handleForm, path, field);
- }, {} as FormHandler<T>);
-
- return handler;
-}
-
-/**
- * FIXME: Consider sending this to web-utils
- *
- *
- * @param defaultValue
- * @param check
- * @returns
- */
-export function useFormState<T>(
- shape: Array<UIHandlerId>,
- defaultValue: RecursivePartial<FormValues<T>>,
- check: (f: RecursivePartial<FormValues<T>>) => FormStatus<T>,
-): [FormHandler<T>, FormStatus<T>] {
- const [form, updateForm] =
- useState<RecursivePartial<FormValues<T>>>(defaultValue);
-
- const status = check(form);
- const handler = constructFormHandler(shape, form, updateForm, status.errors);
-
- return [handler, status];
-}
-
-interface Tree<T> extends Record<string, Tree<T> | T> {}
-
-export function getValueDeeper<T>(
- object: Tree<T> | undefined,
- names: string[],
- notFoundValue?: T,
-): T | undefined {
- if (names.length === 0) return object as T;
- const [head, ...rest] = names;
- if (!head) {
- return getValueDeeper(object, rest, notFoundValue);
- }
- if (object === undefined) {
- return notFoundValue;
- }
- return getValueDeeper(object[head] as Tree<T>, rest, notFoundValue);
-}
-
-export function setValueDeeper(object: any, names: string[], value: any): any {
- if (names.length === 0) return value;
- const [head, ...rest] = names;
- if (!head) {
- return setValueDeeper(object, rest, value);
- }
- if (object === undefined) {
- return undefinedIfEmpty({ [head]: setValueDeeper({}, rest, value) });
- }
- return undefinedIfEmpty({
- ...object,
- [head]: setValueDeeper(object[head] ?? {}, rest, value),
- });
-}
-
-export function getShapeFromFields(
- fields: UIFormElementConfig[],
-): Array<UIHandlerId> {
- const shape: Array<UIHandlerId> = [];
- fields.forEach((field) => {
- if ("id" in field) {
- // FIXME: this should be a validation when loading the form
- // consistency check
- // if (shape.indexOf(field.id) !== -1) {
- // throw Error(`already present: ${field.id}`);
- // }
- shape.push(field.id);
- } else if (field.type === "group") {
- Array.prototype.push.apply(shape, getShapeFromFields(field.fields));
- }
- });
- return shape;
-}
-
-export function getRequiredFields(
- fields: UIFormElementConfig[],
-): Array<UIHandlerId> {
- const shape: Array<UIHandlerId> = [];
- fields.forEach((field) => {
- if ("id" in field) {
- // FIXME: this should be a validation when loading the form
- // consistency check
- // if (shape.indexOf(field.id) !== -1) {
- // throw Error(`already present: ${field.id}`);
- // }
- if (!field.required) {
- return;
- }
- shape.push(field.id);
- } else if (field.type === "group") {
- Array.prototype.push.apply(shape, getRequiredFields(field.fields));
- }
- });
- return shape;
-}
-export function validateRequiredFields<FormType>(
- errors: FormErrors<FormType> | undefined,
- form: object,
- fields: Array<UIHandlerId>,
-): FormErrors<FormType> | undefined {
- let result: FormErrors<FormType> | undefined = errors;
- fields.forEach((f) => {
- const path = f.split(".");
- const v = getValueDeeper(form as any, path);
- result = setValueDeeper(
- result,
- path,
- v === undefined ? "required" : undefined,
- );
- });
- return result;
-}
diff --git a/packages/kyc-ui/src/pages/FillForm.tsx
b/packages/kyc-ui/src/pages/FillForm.tsx
index d01dbb141..1f4996353 100644
--- a/packages/kyc-ui/src/pages/FillForm.tsx
+++ b/packages/kyc-ui/src/pages/FillForm.tsx
@@ -105,15 +105,6 @@ export function FillForm({
? undefined
: withErrorHandler(
async () => {
- const information: KycForm = {
- header: {
- id: theForm.id,
- version: theForm.version,
- when: AbsoluteTime.now(),
- },
- payload: validatedForm,
- };
-
// const data = new FormData()
// data.set("header", JSON.stringify(information.header))
// data.set("payload", JSON.stringify(information.payload))
diff --git a/packages/web-util/src/forms/Caption.tsx
b/packages/web-util/src/forms/Caption.tsx
index 0a4de5a4c..889fa8397 100644
--- a/packages/web-util/src/forms/Caption.tsx
+++ b/packages/web-util/src/forms/Caption.tsx
@@ -1,6 +1,9 @@
import { TranslatedString } from "@gnu-taler/taler-util";
import { VNode, h } from "preact";
-import { LabelWithTooltipMaybeRequired, RenderAddon } from "./InputLine.js";
+import {
+ LabelWithTooltipMaybeRequired,
+ RenderAddon,
+} from "./fields/InputLine.js";
import { Addon } from "./FormProvider.js";
interface Props {
diff --git a/packages/web-util/src/forms/DownloadLink.tsx
b/packages/web-util/src/forms/DownloadLink.tsx
index f4f8c6894..fab49edae 100644
--- a/packages/web-util/src/forms/DownloadLink.tsx
+++ b/packages/web-util/src/forms/DownloadLink.tsx
@@ -1,6 +1,6 @@
import { TranslatedString } from "@gnu-taler/taler-util";
import { VNode, h } from "preact";
-import { LabelWithTooltipMaybeRequired, RenderAddon } from "./InputLine.js";
+import { RenderAddon } from "./fields/InputLine.js";
import { Addon } from "./FormProvider.js";
interface Props {
diff --git a/packages/web-util/src/forms/Group.tsx
b/packages/web-util/src/forms/Group.tsx
index 83504fc96..58e164319 100644
--- a/packages/web-util/src/forms/Group.tsx
+++ b/packages/web-util/src/forms/Group.tsx
@@ -1,7 +1,10 @@
import { TranslatedString } from "@gnu-taler/taler-util";
import { VNode, h } from "preact";
import { Addon } from "./FormProvider.js";
-import { LabelWithTooltipMaybeRequired, RenderAddon } from "./InputLine.js";
+import {
+ LabelWithTooltipMaybeRequired,
+ RenderAddon,
+} from "./fields/InputLine.js";
import { RenderAllFieldsByUiConfig } from "./forms-ui.js";
import { UIFormField } from "./field-types.js";
diff --git a/packages/web-util/src/forms/HtmlIframe.tsx
b/packages/web-util/src/forms/HtmlIframe.tsx
index 4569011a6..8aff06012 100644
--- a/packages/web-util/src/forms/HtmlIframe.tsx
+++ b/packages/web-util/src/forms/HtmlIframe.tsx
@@ -1,6 +1,6 @@
import { TranslatedString } from "@gnu-taler/taler-util";
import { VNode, h } from "preact";
-import { LabelWithTooltipMaybeRequired, RenderAddon } from "./InputLine.js";
+import { RenderAddon } from "./fields/InputLine.js";
import { Addon } from "./FormProvider.js";
interface Props {
diff --git a/packages/web-util/src/forms/field-types.ts
b/packages/web-util/src/forms/field-types.ts
index 809467b24..91c4b2539 100644
--- a/packages/web-util/src/forms/field-types.ts
+++ b/packages/web-util/src/forms/field-types.ts
@@ -1,27 +1,20 @@
-import { h as create, Fragment, VNode } from "preact";
+import { VNode } from "preact";
import { Caption } from "./Caption.js";
+import { DownloadLink } from "./DownloadLink.js";
+import { InputAbsoluteTime } from "./fields/InputAbsoluteTime.js";
+import { InputAmount } from "./fields/InputAmount.js";
+import { InputArray } from "./fields/InputArray.js";
+import { InputChoiceHorizontal } from "./fields/InputChoiceHorizontal.js";
+import { InputChoiceStacked } from "./fields/InputChoiceStacked.js";
+import { InputFile } from "./fields/InputFile.js";
+import { InputInteger } from "./fields/InputInteger.js";
+import { InputSelectMultiple } from "./fields/InputSelectMultiple.js";
+import { InputSelectOne } from "./fields/InputSelectOne.js";
+import { InputText } from "./fields/InputText.js";
+import { InputTextArea } from "./fields/InputTextArea.js";
+import { InputToggle } from "./fields/InputToggle.js";
import { Group } from "./Group.js";
-import { InputAbsoluteTime } from "./InputAbsoluteTime.js";
-import { InputAmount } from "./InputAmount.js";
-import { InputArray } from "./InputArray.js";
-import { InputChoiceHorizontal } from "./InputChoiceHorizontal.js";
-import { InputChoiceStacked } from "./InputChoiceStacked.js";
-import { InputFile } from "./InputFile.js";
-import { InputInteger } from "./InputInteger.js";
-import { InputSelectMultiple } from "./InputSelectMultiple.js";
-import { InputSelectOne } from "./InputSelectOne.js";
-import { InputText } from "./InputText.js";
-import { InputTextArea } from "./InputTextArea.js";
-import { InputToggle } from "./InputToggle.js";
-import { Addon, StringConverter, UIFieldHandler } from "./FormProvider.js";
-import {
- InternationalizationAPI,
- UIFieldElementDescription,
-} from "../index.browser.js";
-import { assertUnreachable, TranslatedString } from "@gnu-taler/taler-util";
-import { UIFormFieldBaseConfig, UIFormElementConfig } from "./forms-types.js";
import { HtmlIframe } from "./HtmlIframe.js";
-import { DownloadLink } from "./DownloadLink.js";
/**
* Constrain the type with the ui props
*/
diff --git a/packages/web-util/src/forms/InputAbsoluteTime.stories.tsx
b/packages/web-util/src/forms/fields/InputAbsoluteTime.stories.tsx
similarity index 89%
rename from packages/web-util/src/forms/InputAbsoluteTime.stories.tsx
rename to packages/web-util/src/forms/fields/InputAbsoluteTime.stories.tsx
index 28afd71b1..4209dee4d 100644
--- a/packages/web-util/src/forms/InputAbsoluteTime.stories.tsx
+++ b/packages/web-util/src/forms/fields/InputAbsoluteTime.stories.tsx
@@ -20,9 +20,9 @@
*/
import { AbsoluteTime, TranslatedString } from "@gnu-taler/taler-util";
-import * as tests from "../tests/hook.js";
-import { FormDesign, UIHandlerId } from "./forms-types.js";
-import { DefaultForm as TestedComponent } from "./forms-ui.js";
+import * as tests from "../../tests/hook.js";
+import { FormDesign, UIHandlerId } from "../forms-types.js";
+import { DefaultForm as TestedComponent } from "../forms-ui.js";
export default {
title: "Input Absolute Time",
};
diff --git a/packages/web-util/src/forms/InputAbsoluteTime.tsx
b/packages/web-util/src/forms/fields/InputAbsoluteTime.tsx
similarity index 95%
rename from packages/web-util/src/forms/InputAbsoluteTime.tsx
rename to packages/web-util/src/forms/fields/InputAbsoluteTime.tsx
index a1287cc9b..1ba24f2f5 100644
--- a/packages/web-util/src/forms/InputAbsoluteTime.tsx
+++ b/packages/web-util/src/forms/fields/InputAbsoluteTime.tsx
@@ -2,9 +2,9 @@ import { AbsoluteTime } from "@gnu-taler/taler-util";
import { format, parse } from "date-fns";
import { Fragment, VNode, h } from "preact";
import { useState } from "preact/hooks";
-import { Calendar } from "./Calendar.js";
-import { Dialog } from "./Dialog.js";
-import { UIFormProps } from "./FormProvider.js";
+import { Calendar } from "../Calendar.js";
+import { Dialog } from "../Dialog.js";
+import { UIFormProps } from "../FormProvider.js";
import { InputLine } from "./InputLine.js";
import { noHandlerPropsAndNoContextForField } from "./InputArray.js";
diff --git a/packages/web-util/src/forms/InputAmount.stories.tsx
b/packages/web-util/src/forms/fields/InputAmount.stories.tsx
similarity index 89%
rename from packages/web-util/src/forms/InputAmount.stories.tsx
rename to packages/web-util/src/forms/fields/InputAmount.stories.tsx
index 18516db14..1501cc3a9 100644
--- a/packages/web-util/src/forms/InputAmount.stories.tsx
+++ b/packages/web-util/src/forms/fields/InputAmount.stories.tsx
@@ -20,9 +20,9 @@
*/
import { AmountJson, Amounts, TranslatedString } from "@gnu-taler/taler-util";
-import * as tests from "../tests/hook.js";
-import { DefaultForm as TestedComponent } from "./forms-ui.js";
-import { FormDesign, UIHandlerId } from "./forms-types.js";
+import * as tests from "../../tests/hook.js";
+import { DefaultForm as TestedComponent } from "../forms-ui.js";
+import { FormDesign, UIHandlerId } from "../forms-types.js";
export default {
title: "Input Amount",
diff --git a/packages/web-util/src/forms/InputAmount.tsx
b/packages/web-util/src/forms/fields/InputAmount.tsx
similarity index 95%
rename from packages/web-util/src/forms/InputAmount.tsx
rename to packages/web-util/src/forms/fields/InputAmount.tsx
index 874fa8686..04d9cd94e 100644
--- a/packages/web-util/src/forms/InputAmount.tsx
+++ b/packages/web-util/src/forms/fields/InputAmount.tsx
@@ -1,6 +1,6 @@
import { AmountJson, Amounts, TranslatedString } from "@gnu-taler/taler-util";
import { VNode, h } from "preact";
-import { UIFormProps } from "./FormProvider.js";
+import { UIFormProps } from "../FormProvider.js";
import { InputLine } from "./InputLine.js";
import { noHandlerPropsAndNoContextForField } from "./InputArray.js";
diff --git a/packages/web-util/src/forms/InputArray.stories.tsx
b/packages/web-util/src/forms/fields/InputArray.stories.tsx
similarity index 94%
rename from packages/web-util/src/forms/InputArray.stories.tsx
rename to packages/web-util/src/forms/fields/InputArray.stories.tsx
index e9807d2e6..a20c98756 100644
--- a/packages/web-util/src/forms/InputArray.stories.tsx
+++ b/packages/web-util/src/forms/fields/InputArray.stories.tsx
@@ -20,9 +20,9 @@
*/
import { TranslatedString } from "@gnu-taler/taler-util";
-import * as tests from "../tests/hook.js";
-import { DefaultForm as TestedComponent } from "./forms-ui.js";
-import { FormDesign, UIHandlerId } from "./forms-types.js";
+import * as tests from "../../tests/hook.js";
+import { DefaultForm as TestedComponent } from "../forms-ui.js";
+import { FormDesign, UIHandlerId } from "../forms-types.js";
export default {
title: "Input Array",
diff --git a/packages/web-util/src/forms/InputArray.tsx
b/packages/web-util/src/forms/fields/InputArray.tsx
similarity index 97%
rename from packages/web-util/src/forms/InputArray.tsx
rename to packages/web-util/src/forms/fields/InputArray.tsx
index f1fd00b11..b0cfd80bc 100644
--- a/packages/web-util/src/forms/InputArray.tsx
+++ b/packages/web-util/src/forms/fields/InputArray.tsx
@@ -1,14 +1,14 @@
import { TranslatedString } from "@gnu-taler/taler-util";
import { Fragment, h, VNode } from "preact";
import { useEffect, useState } from "preact/hooks";
-import { getValueFromPath, useForm } from "../hooks/useForm.js";
+import { getValueFromPath, useForm } from "../../hooks/useForm.js";
import {
SingleColumnFormSectionUI,
useTranslationContext,
-} from "../index.browser.js";
-import { UIFormProps } from "./FormProvider.js";
+} from "../../index.browser.js";
+import { UIFormProps } from "../FormProvider.js";
import { LabelWithTooltipMaybeRequired } from "./InputLine.js";
-import { UIFormElementConfig, UIHandlerId } from "./forms-types.js";
+import { UIFormElementConfig, UIHandlerId } from "../forms-types.js";
function Option({
label,
diff --git a/packages/web-util/src/forms/InputChoiceHorizontal.stories.tsx
b/packages/web-util/src/forms/fields/InputChoiceHorizontal.stories.tsx
similarity index 91%
rename from packages/web-util/src/forms/InputChoiceHorizontal.stories.tsx
rename to packages/web-util/src/forms/fields/InputChoiceHorizontal.stories.tsx
index f2c86779a..ddd8334ba 100644
--- a/packages/web-util/src/forms/InputChoiceHorizontal.stories.tsx
+++ b/packages/web-util/src/forms/fields/InputChoiceHorizontal.stories.tsx
@@ -20,9 +20,9 @@
*/
import { TranslatedString } from "@gnu-taler/taler-util";
-import * as tests from "../tests/hook.js";
-import { DefaultForm as TestedComponent } from "./forms-ui.js";
-import { FormDesign, UIHandlerId } from "./forms-types.js";
+import * as tests from "../../tests/hook.js";
+import { DefaultForm as TestedComponent } from "../forms-ui.js";
+import { FormDesign, UIHandlerId } from "../forms-types.js";
export default {
title: "Input Choice Horizontal",
diff --git a/packages/web-util/src/forms/InputChoiceHorizontal.tsx
b/packages/web-util/src/forms/fields/InputChoiceHorizontal.tsx
similarity index 98%
rename from packages/web-util/src/forms/InputChoiceHorizontal.tsx
rename to packages/web-util/src/forms/fields/InputChoiceHorizontal.tsx
index bc50b59ed..cf05128c2 100644
--- a/packages/web-util/src/forms/InputChoiceHorizontal.tsx
+++ b/packages/web-util/src/forms/fields/InputChoiceHorizontal.tsx
@@ -1,6 +1,6 @@
import { TranslatedString } from "@gnu-taler/taler-util";
import { Fragment, VNode, h } from "preact";
-import { UIFormProps } from "./FormProvider.js";
+import { UIFormProps } from "../FormProvider.js";
import { LabelWithTooltipMaybeRequired } from "./InputLine.js";
import { noHandlerPropsAndNoContextForField } from "./InputArray.js";
diff --git a/packages/web-util/src/forms/InputChoiceStacked.stories.tsx
b/packages/web-util/src/forms/fields/InputChoiceStacked.stories.tsx
similarity index 91%
rename from packages/web-util/src/forms/InputChoiceStacked.stories.tsx
rename to packages/web-util/src/forms/fields/InputChoiceStacked.stories.tsx
index d08069893..bf243c12a 100644
--- a/packages/web-util/src/forms/InputChoiceStacked.stories.tsx
+++ b/packages/web-util/src/forms/fields/InputChoiceStacked.stories.tsx
@@ -20,9 +20,9 @@
*/
import { TranslatedString } from "@gnu-taler/taler-util";
-import * as tests from "../tests/hook.js";
-import { DefaultForm as TestedComponent } from "./forms-ui.js";
-import { FormDesign, UIHandlerId } from "./forms-types.js";
+import * as tests from "../../tests/hook.js";
+import { DefaultForm as TestedComponent } from "../forms-ui.js";
+import { FormDesign, UIHandlerId } from "../forms-types.js";
export default {
title: "Input Choice Stacked",
diff --git a/packages/web-util/src/forms/InputChoiceStacked.tsx
b/packages/web-util/src/forms/fields/InputChoiceStacked.tsx
similarity index 98%
rename from packages/web-util/src/forms/InputChoiceStacked.tsx
rename to packages/web-util/src/forms/fields/InputChoiceStacked.tsx
index 2415cd5db..999208c98 100644
--- a/packages/web-util/src/forms/InputChoiceStacked.tsx
+++ b/packages/web-util/src/forms/fields/InputChoiceStacked.tsx
@@ -1,6 +1,6 @@
import { TranslatedString } from "@gnu-taler/taler-util";
import { Fragment, VNode, h } from "preact";
-import { UIFormProps } from "./FormProvider.js";
+import { UIFormProps } from "../FormProvider.js";
import { LabelWithTooltipMaybeRequired } from "./InputLine.js";
import { noHandlerPropsAndNoContextForField } from "./InputArray.js";
diff --git a/packages/web-util/src/forms/InputFile.stories.tsx
b/packages/web-util/src/forms/fields/InputFile.stories.tsx
similarity index 90%
rename from packages/web-util/src/forms/InputFile.stories.tsx
rename to packages/web-util/src/forms/fields/InputFile.stories.tsx
index 24f983ad4..201c66f34 100644
--- a/packages/web-util/src/forms/InputFile.stories.tsx
+++ b/packages/web-util/src/forms/fields/InputFile.stories.tsx
@@ -20,9 +20,9 @@
*/
import { TranslatedString } from "@gnu-taler/taler-util";
-import * as tests from "../tests/hook.js";
-import { DefaultForm as TestedComponent } from "./forms-ui.js";
-import { FormDesign, UIHandlerId } from "./forms-types.js";
+import * as tests from "../../tests/hook.js";
+import { DefaultForm as TestedComponent } from "../forms-ui.js";
+import { FormDesign, UIHandlerId } from "../forms-types.js";
export default {
title: "Input File",
diff --git a/packages/web-util/src/forms/InputFile.tsx
b/packages/web-util/src/forms/fields/InputFile.tsx
similarity index 99%
rename from packages/web-util/src/forms/InputFile.tsx
rename to packages/web-util/src/forms/fields/InputFile.tsx
index 78eb9cf29..09a0f6ea3 100644
--- a/packages/web-util/src/forms/InputFile.tsx
+++ b/packages/web-util/src/forms/fields/InputFile.tsx
@@ -1,5 +1,5 @@
import { Fragment, VNode, h } from "preact";
-import { UIFormProps } from "./FormProvider.js";
+import { UIFormProps } from "../FormProvider.js";
import { noHandlerPropsAndNoContextForField } from "./InputArray.js";
import { LabelWithTooltipMaybeRequired } from "./InputLine.js";
diff --git a/packages/web-util/src/forms/InputInteger.stories.tsx
b/packages/web-util/src/forms/fields/InputInteger.stories.tsx
similarity index 88%
rename from packages/web-util/src/forms/InputInteger.stories.tsx
rename to packages/web-util/src/forms/fields/InputInteger.stories.tsx
index 369be670d..0a2bcaca0 100644
--- a/packages/web-util/src/forms/InputInteger.stories.tsx
+++ b/packages/web-util/src/forms/fields/InputInteger.stories.tsx
@@ -20,9 +20,9 @@
*/
import { TranslatedString } from "@gnu-taler/taler-util";
-import * as tests from "../tests/hook.js";
-import { DefaultForm as TestedComponent } from "./forms-ui.js";
-import { FormDesign, UIHandlerId } from "./forms-types.js";
+import * as tests from "../../tests/hook.js";
+import { DefaultForm as TestedComponent } from "../forms-ui.js";
+import { FormDesign, UIHandlerId } from "../forms-types.js";
export default {
title: "Input Integer",
diff --git a/packages/web-util/src/forms/InputInteger.tsx
b/packages/web-util/src/forms/fields/InputInteger.tsx
similarity index 91%
rename from packages/web-util/src/forms/InputInteger.tsx
rename to packages/web-util/src/forms/fields/InputInteger.tsx
index a6a02ad43..b565fc380 100644
--- a/packages/web-util/src/forms/InputInteger.tsx
+++ b/packages/web-util/src/forms/fields/InputInteger.tsx
@@ -1,6 +1,6 @@
import { VNode, h } from "preact";
import { InputLine } from "./InputLine.js";
-import { UIFormProps } from "./FormProvider.js";
+import { UIFormProps } from "../FormProvider.js";
export function InputInteger<T extends object, K extends keyof T>(
props: UIFormProps<T, K>,
diff --git a/packages/web-util/src/forms/InputLine.tsx
b/packages/web-util/src/forms/fields/InputLine.tsx
similarity index 99%
rename from packages/web-util/src/forms/InputLine.tsx
rename to packages/web-util/src/forms/fields/InputLine.tsx
index 6f160abf4..982fd4670 100644
--- a/packages/web-util/src/forms/InputLine.tsx
+++ b/packages/web-util/src/forms/fields/InputLine.tsx
@@ -1,6 +1,6 @@
import { TranslatedString } from "@gnu-taler/taler-util";
import { ComponentChildren, Fragment, VNode, h } from "preact";
-import { Addon, UIFormProps } from "./FormProvider.js";
+import { Addon, UIFormProps } from "../FormProvider.js";
import { noHandlerPropsAndNoContextForField } from "./InputArray.js";
//@ts-ignore
diff --git a/packages/web-util/src/forms/InputSelectMultiple.stories.tsx
b/packages/web-util/src/forms/fields/InputSelectMultiple.stories.tsx
similarity index 93%
rename from packages/web-util/src/forms/InputSelectMultiple.stories.tsx
rename to packages/web-util/src/forms/fields/InputSelectMultiple.stories.tsx
index a39f5fb26..604efbe1f 100644
--- a/packages/web-util/src/forms/InputSelectMultiple.stories.tsx
+++ b/packages/web-util/src/forms/fields/InputSelectMultiple.stories.tsx
@@ -20,9 +20,9 @@
*/
import { TranslatedString } from "@gnu-taler/taler-util";
-import * as tests from "../tests/hook.js";
-import { DefaultForm as TestedComponent } from "./forms-ui.js";
-import { FormDesign, UIHandlerId } from "./forms-types.js";
+import * as tests from "../../tests/hook.js";
+import { DefaultForm as TestedComponent } from "../forms-ui.js";
+import { FormDesign, UIHandlerId } from "../forms-types.js";
export default {
title: "Input Select Multiple",
diff --git a/packages/web-util/src/forms/InputSelectMultiple.tsx
b/packages/web-util/src/forms/fields/InputSelectMultiple.tsx
similarity index 99%
rename from packages/web-util/src/forms/InputSelectMultiple.tsx
rename to packages/web-util/src/forms/fields/InputSelectMultiple.tsx
index 1a52ce9d1..ef74e28c2 100644
--- a/packages/web-util/src/forms/InputSelectMultiple.tsx
+++ b/packages/web-util/src/forms/fields/InputSelectMultiple.tsx
@@ -1,6 +1,6 @@
import { Fragment, VNode, h } from "preact";
import { useState } from "preact/hooks";
-import { UIFormProps } from "./FormProvider.js";
+import { UIFormProps } from "../FormProvider.js";
import { noHandlerPropsAndNoContextForField } from "./InputArray.js";
import { ChoiceS } from "./InputChoiceStacked.js";
import { LabelWithTooltipMaybeRequired } from "./InputLine.js";
diff --git a/packages/web-util/src/forms/InputSelectOne.stories.tsx
b/packages/web-util/src/forms/fields/InputSelectOne.stories.tsx
similarity index 91%
rename from packages/web-util/src/forms/InputSelectOne.stories.tsx
rename to packages/web-util/src/forms/fields/InputSelectOne.stories.tsx
index ba14d180d..5c9dfe04f 100644
--- a/packages/web-util/src/forms/InputSelectOne.stories.tsx
+++ b/packages/web-util/src/forms/fields/InputSelectOne.stories.tsx
@@ -20,9 +20,9 @@
*/
import { TranslatedString } from "@gnu-taler/taler-util";
-import * as tests from "../tests/hook.js";
-import { DefaultForm as TestedComponent } from "./forms-ui.js";
-import { FormDesign, UIHandlerId } from "./forms-types.js";
+import * as tests from "../../tests/hook.js";
+import { DefaultForm as TestedComponent } from "../forms-ui.js";
+import { FormDesign, UIHandlerId } from "../forms-types.js";
export default {
title: "Input Select One",
diff --git a/packages/web-util/src/forms/InputSelectOne.tsx
b/packages/web-util/src/forms/fields/InputSelectOne.tsx
similarity index 98%
rename from packages/web-util/src/forms/InputSelectOne.tsx
rename to packages/web-util/src/forms/fields/InputSelectOne.tsx
index 331f4720b..4e7ecfa28 100644
--- a/packages/web-util/src/forms/InputSelectOne.tsx
+++ b/packages/web-util/src/forms/fields/InputSelectOne.tsx
@@ -1,6 +1,6 @@
import { Fragment, VNode, h } from "preact";
import { useState } from "preact/hooks";
-import { UIFormProps } from "./FormProvider.js";
+import { UIFormProps } from "../FormProvider.js";
import { noHandlerPropsAndNoContextForField } from "./InputArray.js";
import { ChoiceS } from "./InputChoiceStacked.js";
import { LabelWithTooltipMaybeRequired } from "./InputLine.js";
diff --git a/packages/web-util/src/forms/InputText.stories.tsx
b/packages/web-util/src/forms/fields/InputText.stories.tsx
similarity index 89%
rename from packages/web-util/src/forms/InputText.stories.tsx
rename to packages/web-util/src/forms/fields/InputText.stories.tsx
index e4ea621a2..092e8fa81 100644
--- a/packages/web-util/src/forms/InputText.stories.tsx
+++ b/packages/web-util/src/forms/fields/InputText.stories.tsx
@@ -20,9 +20,9 @@
*/
import { TranslatedString } from "@gnu-taler/taler-util";
-import * as tests from "../tests/hook.js";
-import { DefaultForm as TestedComponent } from "./forms-ui.js";
-import { FormDesign, UIHandlerId } from "./forms-types.js";
+import * as tests from "../../tests/hook.js";
+import { DefaultForm as TestedComponent } from "../forms-ui.js";
+import { FormDesign, UIHandlerId } from "../forms-types.js";
export default {
title: "Input Text",
diff --git a/packages/web-util/src/forms/InputText.tsx
b/packages/web-util/src/forms/fields/InputText.tsx
similarity index 82%
rename from packages/web-util/src/forms/InputText.tsx
rename to packages/web-util/src/forms/fields/InputText.tsx
index 1c0c04225..80c9b844e 100644
--- a/packages/web-util/src/forms/InputText.tsx
+++ b/packages/web-util/src/forms/fields/InputText.tsx
@@ -1,5 +1,5 @@
import { VNode, h } from "preact";
-import { UIFormProps } from "./FormProvider.js";
+import { UIFormProps } from "../FormProvider.js";
import { InputLine } from "./InputLine.js";
export function InputText<T extends object, K extends keyof T>(
diff --git a/packages/web-util/src/forms/InputTextArea.stories.tsx
b/packages/web-util/src/forms/fields/InputTextArea.stories.tsx
similarity index 89%
rename from packages/web-util/src/forms/InputTextArea.stories.tsx
rename to packages/web-util/src/forms/fields/InputTextArea.stories.tsx
index 5d3cf4f12..42ebec30d 100644
--- a/packages/web-util/src/forms/InputTextArea.stories.tsx
+++ b/packages/web-util/src/forms/fields/InputTextArea.stories.tsx
@@ -20,9 +20,9 @@
*/
import { TranslatedString } from "@gnu-taler/taler-util";
-import * as tests from "../tests/hook.js";
-import { DefaultForm as TestedComponent } from "./forms-ui.js";
-import { FormDesign, UIHandlerId } from "./forms-types.js";
+import * as tests from "../../tests/hook.js";
+import { DefaultForm as TestedComponent } from "../forms-ui.js";
+import { FormDesign, UIHandlerId } from "../forms-types.js";
export default {
title: "Input Text Area",
diff --git a/packages/web-util/src/forms/InputTextArea.tsx
b/packages/web-util/src/forms/fields/InputTextArea.tsx
similarity index 82%
rename from packages/web-util/src/forms/InputTextArea.tsx
rename to packages/web-util/src/forms/fields/InputTextArea.tsx
index 6b76d8329..4e9f643ca 100644
--- a/packages/web-util/src/forms/InputTextArea.tsx
+++ b/packages/web-util/src/forms/fields/InputTextArea.tsx
@@ -1,6 +1,6 @@
import { VNode, h } from "preact";
import { InputLine } from "./InputLine.js";
-import { UIFormProps } from "./FormProvider.js";
+import { UIFormProps } from "../FormProvider.js";
export function InputTextArea<T extends object, K extends keyof T>(
props: UIFormProps<T, K>,
diff --git a/packages/web-util/src/forms/InputToggle.stories.tsx
b/packages/web-util/src/forms/fields/InputToggle.stories.tsx
similarity index 90%
rename from packages/web-util/src/forms/InputToggle.stories.tsx
rename to packages/web-util/src/forms/fields/InputToggle.stories.tsx
index c4ed868ef..6a2f30c80 100644
--- a/packages/web-util/src/forms/InputToggle.stories.tsx
+++ b/packages/web-util/src/forms/fields/InputToggle.stories.tsx
@@ -20,9 +20,9 @@
*/
import { TranslatedString } from "@gnu-taler/taler-util";
-import * as tests from "../tests/hook.js";
-import { DefaultForm as TestedComponent } from "./forms-ui.js";
-import { FormDesign, UIHandlerId } from "./forms-types.js";
+import * as tests from "../../tests/hook.js";
+import { DefaultForm as TestedComponent } from "../forms-ui.js";
+import { FormDesign, UIHandlerId } from "../forms-types.js";
export default {
title: "Input Toggle",
diff --git a/packages/web-util/src/forms/InputToggle.tsx
b/packages/web-util/src/forms/fields/InputToggle.tsx
similarity index 97%
rename from packages/web-util/src/forms/InputToggle.tsx
rename to packages/web-util/src/forms/fields/InputToggle.tsx
index b1c800ad3..f22ffe1e7 100644
--- a/packages/web-util/src/forms/InputToggle.tsx
+++ b/packages/web-util/src/forms/fields/InputToggle.tsx
@@ -1,5 +1,5 @@
import { VNode, h } from "preact";
-import { UIFormProps } from "./FormProvider.js";
+import { UIFormProps } from "../FormProvider.js";
import { noHandlerPropsAndNoContextForField } from "./InputArray.js";
import { LabelWithTooltipMaybeRequired } from "./InputLine.js";
diff --git a/packages/kyc-ui/src/forms/VQF_902_1.ts
b/packages/web-util/src/forms/gana/VQF_902_1.ts
similarity index 100%
rename from packages/kyc-ui/src/forms/VQF_902_1.ts
rename to packages/web-util/src/forms/gana/VQF_902_1.ts
diff --git a/packages/kyc-ui/src/forms/VQF_902_11.ts
b/packages/web-util/src/forms/gana/VQF_902_11.ts
similarity index 100%
rename from packages/kyc-ui/src/forms/VQF_902_11.ts
rename to packages/web-util/src/forms/gana/VQF_902_11.ts
diff --git a/packages/kyc-ui/src/forms/VQF_902_12.ts
b/packages/web-util/src/forms/gana/VQF_902_12.ts
similarity index 100%
rename from packages/kyc-ui/src/forms/VQF_902_12.ts
rename to packages/web-util/src/forms/gana/VQF_902_12.ts
diff --git a/packages/kyc-ui/src/forms/VQF_902_13.ts
b/packages/web-util/src/forms/gana/VQF_902_13.ts
similarity index 100%
rename from packages/kyc-ui/src/forms/VQF_902_13.ts
rename to packages/web-util/src/forms/gana/VQF_902_13.ts
diff --git a/packages/kyc-ui/src/forms/VQF_902_14.ts
b/packages/web-util/src/forms/gana/VQF_902_14.ts
similarity index 100%
rename from packages/kyc-ui/src/forms/VQF_902_14.ts
rename to packages/web-util/src/forms/gana/VQF_902_14.ts
diff --git a/packages/kyc-ui/src/forms/VQF_902_15.ts
b/packages/web-util/src/forms/gana/VQF_902_15.ts
similarity index 100%
rename from packages/kyc-ui/src/forms/VQF_902_15.ts
rename to packages/web-util/src/forms/gana/VQF_902_15.ts
diff --git a/packages/kyc-ui/src/forms/VQF_902_4.ts
b/packages/web-util/src/forms/gana/VQF_902_4.ts
similarity index 100%
rename from packages/kyc-ui/src/forms/VQF_902_4.ts
rename to packages/web-util/src/forms/gana/VQF_902_4.ts
diff --git a/packages/kyc-ui/src/forms/VQF_902_5.ts
b/packages/web-util/src/forms/gana/VQF_902_5.ts
similarity index 100%
rename from packages/kyc-ui/src/forms/VQF_902_5.ts
rename to packages/web-util/src/forms/gana/VQF_902_5.ts
diff --git a/packages/kyc-ui/src/forms/VQF_902_9.ts
b/packages/web-util/src/forms/gana/VQF_902_9.ts
similarity index 100%
rename from packages/kyc-ui/src/forms/VQF_902_9.ts
rename to packages/web-util/src/forms/gana/VQF_902_9.ts
diff --git a/packages/kyc-ui/src/forms/taler_form_attributes.ts
b/packages/web-util/src/forms/gana/taler_form_attributes.ts
similarity index 100%
rename from packages/kyc-ui/src/forms/taler_form_attributes.ts
rename to packages/web-util/src/forms/gana/taler_form_attributes.ts
diff --git a/packages/web-util/src/forms/index.stories.ts
b/packages/web-util/src/forms/index.stories.ts
index b08c727a4..cdccff050 100644
--- a/packages/web-util/src/forms/index.stories.ts
+++ b/packages/web-util/src/forms/index.stories.ts
@@ -1,12 +1,12 @@
-export * as a1 from "./InputAmount.stories.js";
-export * as a2 from "./InputArray.stories.js";
-export * as a3 from "./InputChoiceHorizontal.stories.js";
-export * as a4 from "./InputChoiceStacked.stories.js";
-export * as a5 from "./InputAbsoluteTime.stories.js";
-export * as a6 from "./InputFile.stories.js";
-export * as a7 from "./InputInteger.stories.js";
-export * as a9 from "./InputSelectMultiple.stories.js";
-export * as a10 from "./InputSelectOne.stories.js";
-export * as a11 from "./InputText.stories.js";
-export * as a12 from "./InputTextArea.stories.js";
-export * as a13 from "./InputToggle.stories.js";
+export * as a1 from "./fields/InputAmount.stories.js";
+export * as a2 from "./fields/InputArray.stories.js";
+export * as a3 from "./fields/InputChoiceHorizontal.stories.js";
+export * as a4 from "./fields/InputChoiceStacked.stories.js";
+export * as a5 from "./fields/InputAbsoluteTime.stories.js";
+export * as a6 from "./fields/InputFile.stories.js";
+export * as a7 from "./fields/InputInteger.stories.js";
+export * as a9 from "./fields/InputSelectMultiple.stories.js";
+export * as a10 from "./fields/InputSelectOne.stories.js";
+export * as a11 from "./fields/InputText.stories.js";
+export * as a12 from "./fields/InputTextArea.stories.js";
+export * as a13 from "./fields/InputToggle.stories.js";
diff --git a/packages/web-util/src/forms/index.ts
b/packages/web-util/src/forms/index.ts
index 187fffef3..1ae882ab9 100644
--- a/packages/web-util/src/forms/index.ts
+++ b/packages/web-util/src/forms/index.ts
@@ -4,19 +4,29 @@ export * from "./HtmlIframe.js";
export * from "./Dialog.js";
export * from "./FormProvider.js";
export * from "./Group.js";
-export * from "./InputAbsoluteTime.js";
-export * from "./InputAmount.js";
-export * from "./InputArray.js";
-export * from "./InputChoiceHorizontal.js";
-export * from "./InputChoiceStacked.js";
-export * from "./InputFile.js";
-export * from "./InputInteger.js";
-export * from "./InputLine.js";
-export * from "./InputSelectMultiple.js";
-export * from "./InputSelectOne.js";
-export * from "./InputText.js";
-export * from "./InputTextArea.js";
-export * from "./InputToggle.js";
+export * from "./gana/VQF_902_1.js";
+export * from "./gana/VQF_902_4.js";
+export * from "./gana/VQF_902_5.js";
+export * from "./gana/VQF_902_9.js";
+export * from "./gana/VQF_902_11.js";
+export * from "./gana/VQF_902_12.js";
+export * from "./gana/VQF_902_13.js";
+export * from "./gana/VQF_902_14.js";
+export * from "./gana/VQF_902_15.js";
+export * from "./gana/taler_form_attributes.js";
+export * from "./fields/InputAbsoluteTime.js";
+export * from "./fields/InputAmount.js";
+export * from "./fields/InputArray.js";
+export * from "./fields/InputChoiceHorizontal.js";
+export * from "./fields/InputChoiceStacked.js";
+export * from "./fields/InputFile.js";
+export * from "./fields/InputInteger.js";
+export * from "./fields/InputLine.js";
+export * from "./fields/InputSelectMultiple.js";
+export * from "./fields/InputSelectOne.js";
+export * from "./fields/InputText.js";
+export * from "./fields/InputTextArea.js";
+export * from "./fields/InputToggle.js";
export * from "./TimePicker.js";
export * from "./field-types.js";
export * from "./forms-types.js";
diff --git a/packages/web-util/src/forms/useField.ts
b/packages/web-util/src/forms/useField.ts
deleted file mode 100644
index 1b4bce02a..000000000
--- a/packages/web-util/src/forms/useField.ts
+++ /dev/null
@@ -1,95 +0,0 @@
-import { useContext } from "preact/compat";
-import { FieldUIOptions, FormContext } from "./FormProvider.js";
-import { TranslatedString } from "@gnu-taler/taler-util";
-
-export interface InputFieldHandler<Type> {
- value: Type;
- onChange: (s: Type) => void;
- state: FieldUIOptions;
- error?: TranslatedString | undefined;
-}
-
-/**
- * @deprecated removing this so we don't depend on context to create a form
- * @param name
- * @returns
- */
-export function useField_deprecated<T extends object, K extends keyof T>(
- name: K,
-): InputFieldHandler<T[K]> | undefined {
- const ctx = useContext(FormContext);
- if (!ctx) {
- //no context, can't be used
- return undefined;
- }
- const {
- value: formValue,
- computeFormState,
- onUpdate: notifyUpdate,
- readOnly: readOnlyForm,
- } = ctx;
-
- type P = typeof name;
- type V = T[P];
- const formState = computeFormState ? computeFormState(formValue.current) :
{};
-
- const fieldValue = readField(formValue.current, String(name)) as V;
-
- const fieldState =
- readField<Partial<FieldUIOptions>>(formState, String(name)) ?? {};
-
- //compute default state
- const state = {
- disabled: readOnlyForm ? true : fieldState.disabled ?? false,
- hidden: fieldState.hidden ?? false,
- help: fieldState.help,
- elements: "elements" in fieldState ? fieldState.elements ?? [] : [],
- };
-
- function onChange(value: V): void {
- // setCurrentValue(value);
- formValue.current = setValueDeeper_toberemoved(
- formValue.current,
- String(name).split("."),
- value,
- );
- if (notifyUpdate) {
- notifyUpdate(formValue.current);
- }
- }
-
- return {
- value: fieldValue,
- onChange,
- state,
- };
-}
-
-/**
- * read the field of an object an support accessing it using '.'
- *
- * @param object
- * @param name
- * @returns
- */
-function readField<T>(object: any, name: string): T | undefined {
- return name.split(".").reduce((prev, current) => {
- return prev ? prev[current] : undefined;
- }, object);
-}
-
-function setValueDeeper_toberemoved(
- object: any,
- names: string[],
- value: any,
-): any {
- if (names.length === 0) return value;
- const [head, ...rest] = names;
- if (object === undefined) {
- return { [head]: setValueDeeper_toberemoved({}, rest, value) };
- }
- return {
- ...object,
- [head]: setValueDeeper_toberemoved(object[head] ?? {}, rest, value),
- };
-}
diff --git a/packages/web-util/src/hooks/index.ts
b/packages/web-util/src/hooks/index.ts
index 35c1e3186..db9c3620c 100644
--- a/packages/web-util/src/hooks/index.ts
+++ b/packages/web-util/src/hooks/index.ts
@@ -7,7 +7,13 @@ export {
} from "./useLocalStorage.js";
export { useMemoryStorage } from "./useMemoryStorage.js";
export * from "./useNotifications.js";
-export { useForm } from "./useForm.js";
+export {
+ useForm,
+ RecursivePartial,
+ FormValues,
+ FormErrors,
+ undefinedIfEmpty,
+} from "./useForm.js";
export {
useAsyncAsHook,
HookError,
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [taler-wallet-core] branch master updated: take the right imports, remove unused code, move gana forms to web-utils,
gnunet <=