From a69e559890d888d10739c8e29549ff37b788743a Mon Sep 17 00:00:00 2001 From: Sebastian Date: Fri, 4 Nov 2022 11:18:30 -0300 Subject: better type signature for undefinedIfEmpty --- .../src/components/form/InputPaytoForm.tsx | 7 +------ .../src/paths/admin/create/CreatePage.tsx | 7 +------ .../src/paths/instance/orders/create/CreatePage.tsx | 7 +------ .../src/paths/instance/update/UpdatePage.tsx | 7 +------ packages/merchant-backoffice-ui/src/utils/table.ts | 16 ++++++++++++++++ 5 files changed, 20 insertions(+), 24 deletions(-) (limited to 'packages') diff --git a/packages/merchant-backoffice-ui/src/components/form/InputPaytoForm.tsx b/packages/merchant-backoffice-ui/src/components/form/InputPaytoForm.tsx index c2aa9c3e9..e8022ca15 100644 --- a/packages/merchant-backoffice-ui/src/components/form/InputPaytoForm.tsx +++ b/packages/merchant-backoffice-ui/src/components/form/InputPaytoForm.tsx @@ -22,6 +22,7 @@ import { h, VNode, Fragment } from "preact"; import { useCallback, useState } from "preact/hooks"; import { Translate, Translator, useTranslator } from "../../i18n/index.js"; import { COUNTRY_TABLE } from "../../utils/constants.js"; +import { undefinedIfEmpty } from "../../utils/table.js"; import { FormErrors, FormProvider } from "./FormProvider.js"; import { Input } from "./Input.js"; import { InputGroup } from "./InputGroup.js"; @@ -154,12 +155,6 @@ const targets = [ const noTargetValue = targets[0]; const defaultTarget = { target: noTargetValue, options: {} }; -function undefinedIfEmpty(obj: T): T | undefined { - return Object.keys(obj).some((k) => (obj as any)[k] !== undefined) - ? obj - : undefined; -} - export function InputPaytoForm({ name, readonly, diff --git a/packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx index 16f22ea4b..0d7681e1d 100644 --- a/packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/admin/create/CreatePage.tsx @@ -33,6 +33,7 @@ import { Translate, useTranslator } from "../../../i18n/index.js"; import { DefaultInstanceFormFields } from "../../../components/instance/DefaultInstanceFormFields.js"; import { INSTANCE_ID_REGEX, PAYTO_REGEX } from "../../../utils/constants.js"; import { Amounts } from "@gnu-taler/taler-util"; +import { undefinedIfEmpty } from "../../../utils/table.js"; export type Entity = MerchantBackend.Instances.InstanceConfigurationMessage & { auth_token?: string; @@ -54,12 +55,6 @@ function with_defaults(id?: string): Partial { }; } -function undefinedIfEmpty(obj: T): T | undefined { - return Object.keys(obj).some((k) => (obj as any)[k] !== undefined) - ? obj - : undefined; -} - export function CreatePage({ onCreate, onBack, forceId }: Props): VNode { const [value, valueHandler] = useState(with_defaults(forceId)); const [isTokenSet, updateIsTokenSet] = useState(false); diff --git a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/CreatePage.tsx index fa0dd7a5a..56bb65b90 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/orders/create/CreatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/orders/create/CreatePage.tsx @@ -42,6 +42,7 @@ import { InventoryProductForm } from "../../../../components/product/InventoryPr import { NonInventoryProductFrom } from "../../../../components/product/NonInventoryProductForm.js"; import { InputNumber } from "../../../../components/form/InputNumber.js"; import { InputBoolean } from "../../../../components/form/InputBoolean.js"; +import { undefinedIfEmpty } from "../../../../utils/table.js"; interface Props { onCreate: (d: MerchantBackend.Orders.PostOrderRequest) => void; @@ -126,12 +127,6 @@ const stringIsValidJSON = (value: string) => { } }; -function undefinedIfEmpty(obj: T): T | undefined { - return Object.keys(obj).some((k) => (obj as any)[k] !== undefined) - ? obj - : undefined; -} - export function CreatePage({ onCreate, onBack, diff --git a/packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx index fb4794bf0..b5328249a 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/update/UpdatePage.tsx @@ -34,6 +34,7 @@ import { Translate, useTranslator } from "../../../i18n/index.js"; import { DefaultInstanceFormFields } from "../../../components/instance/DefaultInstanceFormFields.js"; import { PAYTO_REGEX } from "../../../utils/constants.js"; import { Amounts } from "@gnu-taler/taler-util"; +import { undefinedIfEmpty } from "../../../utils/table.js"; type Entity = MerchantBackend.Instances.InstanceReconfigurationMessage & { auth_token?: string; @@ -70,12 +71,6 @@ function getTokenValuePart(t?: string): string | undefined { return match[1]; } -function undefinedIfEmpty(obj: T): T | undefined { - return Object.keys(obj).some((k) => (obj as any)[k] !== undefined) - ? obj - : undefined; -} - export function UpdatePage({ onUpdate, onChangeAuth, diff --git a/packages/merchant-backoffice-ui/src/utils/table.ts b/packages/merchant-backoffice-ui/src/utils/table.ts index 4ebd95807..199e5fda5 100644 --- a/packages/merchant-backoffice-ui/src/utils/table.ts +++ b/packages/merchant-backoffice-ui/src/utils/table.ts @@ -35,3 +35,19 @@ export function buildActions(instances: T[], selected: string[ .filter(notEmpty) .map(id => ({ element: id, type: action })) } + +/** + * For any object or array, return the same object if is not empty. + * not empty: + * - for arrays: at least one element not undefined + * - for objects: at least one property not undefined + * @param obj + * @returns + */ +export function undefinedIfEmpty|Array>(obj: T): T | undefined { + if (obj === undefined) return undefined + return Object.values(obj).some((v) => v !== undefined) + ? obj + : undefined; +} + -- cgit v1.2.3