gnunet-svn
[Top][All Lists]
Advanced

[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.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]