gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-merchant-backoffice] 01/02: updated form for deep object


From: gnunet
Subject: [taler-merchant-backoffice] 01/02: updated form for deep object
Date: Wed, 10 Mar 2021 19:47:53 +0100

This is an automated email from the git hooks/post-receive script.

sebasjm pushed a commit to branch master
in repository merchant-backoffice.

commit 224cbe6846fbf3ea7652bc2413cdd8fc73535b20
Author: Sebastian <sebasjm@gmail.com>
AuthorDate: Wed Mar 10 15:45:36 2021 -0300

    updated form for deep object
---
 packages/frontend/src/components/form/Field.tsx    |  23 +++-
 packages/frontend/src/components/form/Input.tsx    |  24 +++-
 .../frontend/src/components/form/InputArray.tsx    |  20 ++--
 .../frontend/src/components/form/InputCurrency.tsx |   5 +-
 .../frontend/src/components/form/InputDuration.tsx |   6 +-
 .../frontend/src/components/form/InputPayto.tsx    |   2 +-
 .../frontend/src/components/form/InputSecured.tsx  | 125 +++++++++++----------
 .../src/components/form/InputWithAddon.tsx         |  10 +-
 packages/frontend/src/routes/admin/list/Table.tsx  |   7 +-
 .../src/routes/instance/update/UpdatePage.tsx      |  43 +++++--
 .../frontend/src/routes/instance/update/index.tsx  |  14 +--
 11 files changed, 171 insertions(+), 108 deletions(-)

diff --git a/packages/frontend/src/components/form/Field.tsx 
b/packages/frontend/src/components/form/Field.tsx
index 1561459..43c04f7 100644
--- a/packages/frontend/src/components/form/Field.tsx
+++ b/packages/frontend/src/components/form/Field.tsx
@@ -74,14 +74,31 @@ export function FormProvider<T>({ object = {}, errors = {}, 
valueHandler, childr
   </FormContext.Provider>
 }
 
+/**
+ * read the field of an object an support accesing it using '.'
+ * 
+ * @param object 
+ * @param name 
+ * @returns 
+ */
+const readField = (object: any, name: string) => {
+  return name.split('.').reduce((prev, current) => prev[current], object)
+}
+
+const setValueDeeper = (object: any, names: string[], value: any): any => {
+  if (names.length === 0) return value
+  const [head, ...rest] = names
+  return {...object, [head]: setValueDeeper(object[head], rest, value) }
+}
+
 export function useField<T>(name: keyof T) {
   const { errors, object, initial, toStr, fromStr, valueHandler } = 
useContext<FormType<T>>(FormContext)
   type P = typeof name
   type V = T[P]
 
-  const updateField = (f: P) => (v: V): void => {
+  const updateField = (field: P) => (value: V): void => {
     return valueHandler((prev) => {
-      return ({ ...prev, [f]: v })
+      return setValueDeeper(prev, String(field).split('.'), value)
     })
   }
   
@@ -90,7 +107,7 @@ export function useField<T>(name: keyof T) {
     
   return {
     error: errors[name],
-    value: object[name],
+    value: readField(object, String(name)),
     initial: initial[name],
     onChange: updateField(name),
     toStr: toStr[name] ? toStr[name]! : defaultToString,
diff --git a/packages/frontend/src/components/form/Input.tsx 
b/packages/frontend/src/components/form/Input.tsx
index 32afa6f..565e17b 100644
--- a/packages/frontend/src/components/form/Input.tsx
+++ b/packages/frontend/src/components/form/Input.tsx
@@ -25,10 +25,21 @@ import { useField } from "./Field";
 interface Props<T> {
   name: T;
   readonly?: boolean;
+  inputType?: 'text' | 'number' | 'multiline';
+  expand?: boolean;
+  toStr?: (v?: any) => string;
+  fromStr?: (s: string) => any;
 }
 
-export function Input<T>({ name, readonly }: Props<keyof T>): VNode {
-  const { error, value, onChange, toStr, fromStr } = useField<T>(name);
+const defaultToString = (f?: any): string => f || ''
+const defaultFromString = (v: string): any => v as any
+
+const TextInput = ({inputType, error, ...rest}:any) => inputType === 
'multiline' ? 
+  <textarea {...rest} class={error ? "textarea is-danger" : "textarea"} 
rows="3"  /> : 
+  <input {...rest} class={error ? "input is-danger" : "input"} 
type={inputType} />;
+
+export function Input<T>({ name, readonly, expand, inputType, fromStr = 
defaultFromString, toStr = defaultToString }: Props<keyof T>): VNode {
+  const { error, value, onChange } = useField<T>(name);
 
   const placeholder = useMessage(`fields.instance.${name}.placeholder`);
   const tooltip = useMessage(`fields.instance.${name}.tooltip`);
@@ -42,13 +53,14 @@ export function Input<T>({ name, readonly }: Props<keyof 
T>): VNode {
         </span>}
       </label>
     </div>
-    <div class="field-body">
+    <div class="field-body is-flex-grow-3">
       <div class="field">
-        <p class="control">
-          <input class={error ? "input is-danger" : "input"} type="text"
+      <p class={ expand ? "control is-expanded" : "control" }>
+          <TextInput error={error}
+            inputType={inputType}
             placeholder={placeholder} readonly={readonly}
             name={String(name)} value={toStr(value)} disabled={readonly}
-            onChange={(e): void => onChange(fromStr(e.currentTarget.value))} />
+            onChange={(e:h.JSX.TargetedEvent<HTMLInputElement>): void => 
onChange(fromStr(e.currentTarget.value))} />
           <Message id={`fields.instance.${name}.help`}> </Message>
         </p>
         {error ? <p class="help is-danger">
diff --git a/packages/frontend/src/components/form/InputArray.tsx 
b/packages/frontend/src/components/form/InputArray.tsx
index 47f6bea..80feec8 100644
--- a/packages/frontend/src/components/form/InputArray.tsx
+++ b/packages/frontend/src/components/form/InputArray.tsx
@@ -26,7 +26,7 @@ import { FormErrors, useField, ValidationError } from 
"./Field";
 export interface Props<T> {
   name: T;
   readonly?: boolean;
-  isValid: (e: any) => boolean;
+  isValid?: (e: any) => boolean;
   addonBefore?: string;
   toStr?: (v?: any) => string;
   fromStr?: (s: string) => any;
@@ -35,7 +35,7 @@ export interface Props<T> {
 const defaultToString = (f?: any): string => f || ''
 const defaultFromString = (v: string): any => v as any
 
-export function InputArray<T>({ name, readonly, addonBefore, isValid, fromStr 
= defaultFromString, toStr = defaultToString }: Props<keyof T>): VNode {
+export function InputArray<T>({ name, readonly, addonBefore, isValid = () => 
true, fromStr = defaultFromString, toStr = defaultToString }: Props<keyof T>): 
VNode {
   const { error: formError, value, onChange } = useField<T>(name);
   const [localError, setLocalError] = useState<ValidationError | null>(null)
   const placeholder = useMessage(`fields.instance.${name}.placeholder`);
@@ -56,13 +56,13 @@ export function InputArray<T>({ name, readonly, 
addonBefore, isValid, fromStr =
         </span>}
       </label>
     </div>
-    <div class="field-body">
+    <div class="field-body is-flex-grow-3">
       <div class="field">
         <div class="field has-addons">
           {addonBefore && <div class="control">
             <a class="button is-static">{addonBefore}</a>
           </div>}
-          <p class="control">
+          <p class="control is-expanded">
             <input class={error ? "input is-danger" : "input"} type="text"
               placeholder={placeholder} readonly={readonly} disabled={readonly}
               name={String(name)} value={currentValue}
@@ -75,9 +75,9 @@ export function InputArray<T>({ name, readonly, addonBefore, 
isValid, fromStr =
               if (!isValid(v)) {
                 setLocalError({ message: i18n`The value ${v} is invalid for a 
payment url` })
                 return;
-              } 
-                setLocalError(null)
-              
+              }
+              setLocalError(null)
+
               onChange([v, ...array] as any);
               setCurrentValue('');
             }}>add</button>
@@ -86,9 +86,9 @@ export function InputArray<T>({ name, readonly, addonBefore, 
isValid, fromStr =
         {error ? <p class="help is-danger">
           <Message id={`validation.${error.type}`} 
fields={error.params}>{error.message}</Message>
         </p> : null}
-        {array.map(v => <div class="tags has-addons">
-          <span class="tag is-medium is-info" 
style={{maxWidth:'90%'}}>{v}</span>
-          <a class="tag is-medium is-danger is-delete" onClick={() => {
+        {array.map(v => <div class="tags has-addons mt-3 mb-0">
+          <span class="tag is-medium is-info mb-0" style={{ maxWidth: '90%' 
}}>{v}</span>
+          <a class="tag is-medium is-danger is-delete mb-0" onClick={() => {
             onChange(array.filter(f => f !== v) as any);
             setCurrentValue(toStr(v));
           }} />
diff --git a/packages/frontend/src/components/form/InputCurrency.tsx 
b/packages/frontend/src/components/form/InputCurrency.tsx
index 9b425c8..72334b7 100644
--- a/packages/frontend/src/components/form/InputCurrency.tsx
+++ b/packages/frontend/src/components/form/InputCurrency.tsx
@@ -21,16 +21,17 @@
 import { h } from "preact";
 import { Amount } from "../../declaration";
 import { InputWithAddon } from "./InputWithAddon";
-import { useField } from "./Field";
 
 export interface Props<T> {
   name: keyof T;
   readonly?: boolean;
+  expand?: boolean;
   currency: string;
 }
 
-export function InputCurrency<T>({ name, readonly, currency }: Props<T>) {
+export function InputCurrency<T>({ name, readonly, expand, currency }: 
Props<T>) {
   return <InputWithAddon<T> name={name} readonly={readonly} 
addonBefore={currency}
+    inputType='number' expand={expand}
     toStr={(v?: Amount) => v?.split(':')[1] || ''}
     fromStr={(v: string) => `${currency}:${v}`}
   />
diff --git a/packages/frontend/src/components/form/InputDuration.tsx 
b/packages/frontend/src/components/form/InputDuration.tsx
index a08719a..18b55a3 100644
--- a/packages/frontend/src/components/form/InputDuration.tsx
+++ b/packages/frontend/src/components/form/InputDuration.tsx
@@ -26,12 +26,14 @@ import { useField } from "./Field";
 
 export interface Props<T> {
   name: keyof T;
+  expand?: boolean;
   readonly?: boolean;
 }
 
-export function InputDuration<T>({ name, readonly }: Props<T>) {
+export function InputDuration<T>({ name, expand, readonly }: Props<T>) {
   const { value } = useField<T>(name);
-  return <InputWithAddon<T> name={name} readonly={readonly} 
addonAfter={readableDuration( value as any )}
+  return <InputWithAddon<T> name={name} readonly={readonly} 
addonAfter={readableDuration(value as any)}
+    expand={expand}
     toStr={(v?: RelativeTime) => `${(v && v.d_ms !== "forever" && v.d_ms ? 
v.d_ms / 1000 : '')}`}
     fromStr={(v: string) => ({ d_ms: (parseInt(v, 10) * 1000) || undefined })}
   />
diff --git a/packages/frontend/src/components/form/InputPayto.tsx 
b/packages/frontend/src/components/form/InputPayto.tsx
index f6717cb..23de52a 100644
--- a/packages/frontend/src/components/form/InputPayto.tsx
+++ b/packages/frontend/src/components/form/InputPayto.tsx
@@ -31,7 +31,7 @@ const PAYTO_START_REGEX = /^payto:\/\//
 
 export function InputPayto<T>({ name, readonly }: Props<T>) {
   return <InputArray<T> name={name} readonly={readonly} 
-    addonBefore="payto://"
+    addonBefore="payto://" 
     isValid={(v) => v && PAYTO_REGEX.test(v) }
     toStr={(v?: string) => !v ? '': v.replace(PAYTO_START_REGEX, '')}
     fromStr={(v: string) => `payto://${v}` }
diff --git a/packages/frontend/src/components/form/InputSecured.tsx 
b/packages/frontend/src/components/form/InputSecured.tsx
index 01b0f19..83a3cbb 100644
--- a/packages/frontend/src/components/form/InputSecured.tsx
+++ b/packages/frontend/src/components/form/InputSecured.tsx
@@ -47,65 +47,76 @@ export function InputSecured<T>({ name, readonly }: 
Props<T>): VNode {
   const [active, setActive] = useState(false);
   const [newValue, setNuewValue] = useState("")
 
-  return <div class="field is-horizontal">
-    <div class="field-label is-normal">
-      <label class="label">
-        <Message id={`fields.instance.${name}.label`} />
-        {tooltip && <span class="icon" data-tooltip={tooltip}>
-          <i class="mdi mdi-information" />
-        </span>}
-      </label>
-    </div>
-    <div class="field-body">
-      {!active ?
-        <Fragment>
-          <div class="field has-addons">
-            <button class="button" onClick={(): void => { setActive(!active); 
}} >
-              <div class="icon is-left"><i class="mdi mdi-lock-reset" /></div>
-              <span>Manage token</span>
-            </button>
-            <TokenStatus prev={initial} post={value} />
-          </div>
-        </Fragment> :
-        <Fragment>
-          <div class="field has-addons">
-            <div class="control">
-              <a class="button is-static">secret-token:</a>
-            </div>
-            <div class="control">
-              <input class="input" type="password"
-                placeholder={placeholder} readonly={readonly || !active}
-                disabled={readonly || !active}
-                name={String(name)} value={newValue}
-                onInput={(e): void => {
-                  setNuewValue(e.currentTarget.value)
-                }} />
-              <Message id={`fields.instance.${name}.help`}> </Message>
-            </div>
-            <div class="control">
-              <button class="button is-info" disabled={fromStr(newValue) === 
value} onClick={(): void => { onChange(fromStr(newValue)); setActive(!active); 
setNuewValue(""); }} >
-                <div class="icon is-left"><i class="mdi mdi-lock-outline" 
/></div>
-                <span>Update</span>
+  return <Fragment>
+    <div class="field is-horizontal">
+      <div class="field-label is-normal">
+        <label class="label">
+          <Message id={`fields.instance.${name}.label`} />
+          {tooltip && <span class="icon" data-tooltip={tooltip}>
+            <i class="mdi mdi-information" />
+          </span>}
+        </label>
+      </div>
+      <div class="field-body is-flex-grow-3">
+        {!active ?
+          <Fragment>
+            <div class="field has-addons">
+              <button class="button" onClick={(): void => { 
setActive(!active); }} >
+                <div class="icon is-left"><i class="mdi mdi-lock-reset" 
/></div>
+                <span>Manage token</span>
               </button>
+              <TokenStatus prev={initial} post={value} />
             </div>
-          </div>
-          <div class="control">
-            <button class="button is-danger" disabled={null === value || 
undefined === value} onClick={(): void => { onChange(null!); 
setActive(!active); setNuewValue("");}} >
-              <div class="icon is-left"><i class="mdi mdi-lock-open-variant" 
/></div>
-              <span>Remove</span>
-            </button>
-          </div>
-          <div class="field ml-4">
-            <div class="control">
-              <button class="button " onClick={(): void => { 
onChange(initial!); setActive(!active); setNuewValue(""); }} >
-                <div class="icon is-left"><i class="mdi mdi-lock-open-variant" 
/></div>
-                <span>Cancel update</span>
-              </button>
+          </Fragment> :
+          <Fragment>
+            <div class="field has-addons">
+              <div class="control">
+                <a class="button is-static">secret-token:</a>
+              </div>
+              <div class="control is-expanded">
+                <input class="input" type="password"
+                  placeholder={placeholder} readonly={readonly || !active}
+                  disabled={readonly || !active}
+                  name={String(name)} value={newValue}
+                  onInput={(e): void => {
+                    setNuewValue(e.currentTarget.value)
+                  }} />
+                <Message id={`fields.instance.${name}.help`}> </Message>
+              </div>
+              <div class="control">
+                <button class="button is-info" disabled={fromStr(newValue) === 
value} onClick={(): void => { onChange(fromStr(newValue)); setActive(!active); 
setNuewValue(""); }} >
+                  <div class="icon is-left"><i class="mdi mdi-lock-outline" 
/></div>
+                  <span>Update</span>
+                </button>
+              </div>
             </div>
-          </div>
-        </Fragment>
-      }
-      {error ? <p class="help is-danger"><Message 
id={`validation.${error.type}`} 
fields={error.params}>{error.message}</Message></p> : null}
+          </Fragment>
+        }
+        {error ? <p class="help is-danger"><Message 
id={`validation.${error.type}`} 
fields={error.params}>{error.message}</Message></p> : null}
+      </div>
     </div>
-  </div>;
+    {active &&
+      <div class="field is-horizontal">
+        <div class="field-body is-flex-grow-3">
+          <div class="level" style={{width:'100%'}}>
+            <div class="level-right is-flex-grow-1">
+              <div class="level-item">
+                <button class="button is-danger" disabled={null === value || 
undefined === value} onClick={(): void => { onChange(null!); 
setActive(!active); setNuewValue(""); }} >
+                  <div class="icon is-left"><i class="mdi 
mdi-lock-open-variant" /></div>
+                  <span>Remove</span>
+                </button>
+              </div>
+              <div class="level-item">
+                <button class="button " onClick={(): void => { 
onChange(initial!); setActive(!active); setNuewValue(""); }} >
+                  <div class="icon is-left"><i class="mdi 
mdi-lock-open-variant" /></div>
+                  <span>Cancel</span>
+                </button>
+              </div>
+            </div>
+
+          </div>
+        </div>
+      </div>
+    }
+  </Fragment >;
 }
diff --git a/packages/frontend/src/components/form/InputWithAddon.tsx 
b/packages/frontend/src/components/form/InputWithAddon.tsx
index 8f33d74..f583f08 100644
--- a/packages/frontend/src/components/form/InputWithAddon.tsx
+++ b/packages/frontend/src/components/form/InputWithAddon.tsx
@@ -25,6 +25,8 @@ import { useField } from "./Field";
 export interface Props<T> {
   name: keyof T;
   readonly?: boolean;
+  expand?: boolean;
+  inputType?: 'text' | 'number';
   addonBefore?: string;
   addonAfter?: string;
   toStr?: (v?: any) => string;
@@ -34,7 +36,7 @@ export interface Props<T> {
 const defaultToString = (f?: any):string => f || ''
 const defaultFromString = (v: string):any => v as any
 
-export function InputWithAddon<T>({ name, readonly, addonBefore, addonAfter, 
toStr = defaultToString, fromStr = defaultFromString }: Props<T>): VNode {
+export function InputWithAddon<T>({ name, readonly, addonBefore, expand, 
inputType, addonAfter, toStr = defaultToString, fromStr = defaultFromString }: 
Props<T>): VNode {
   const { error, value, onChange } = useField<T>(name);
 
   const placeholder = useMessage(`fields.instance.${name}.placeholder`);
@@ -49,14 +51,14 @@ export function InputWithAddon<T>({ name, readonly, 
addonBefore, addonAfter, toS
         </span>}
       </label>
     </div>
-    <div class="field-body">
+    <div class="field-body is-flex-grow-3">
       <div class="field">
         <div class="field has-addons">
           {addonBefore && <div class="control">
             <a class="button is-static">{addonBefore}</a>
           </div>}
-          <p class="control is-expanded">
-            <input class={error ? "input is-danger" : "input"} type="text"
+          <p class={ expand ? "control is-expanded" : "control" }>
+            <input class={error ? "input is-danger" : "input"} type={inputType}
               placeholder={placeholder} readonly={readonly} disabled={readonly}
               name={String(name)} value={toStr(value)}
               onChange={(e): void => onChange(fromStr(e.currentTarget.value))} 
/>
diff --git a/packages/frontend/src/routes/admin/list/Table.tsx 
b/packages/frontend/src/routes/admin/list/Table.tsx
index 4831ed3..024ef9c 100644
--- a/packages/frontend/src/routes/admin/list/Table.tsx
+++ b/packages/frontend/src/routes/admin/list/Table.tsx
@@ -53,7 +53,7 @@ export function CardTable({ instances, onCreate, onUpdate, 
onDelete, selected }:
 
   return <div class="card has-table">
     <header class="card-header">
-      <p class="card-header-title"><span class="icon"><i class="mdi 
mdi-account-multiple" /></span><Message id="Instances" /></p>
+      <p class="card-header-title"><span class="icon"><i class="mdi 
mdi-desktop-mac" /></span><Message id="Instances" /></p>
 
       <div class="card-header-icon" aria-label="more options">
 
@@ -118,10 +118,13 @@ function Table({ rowSelection, rowSelectionHandler, 
instances, onUpdate, onDelet
                 <span class="check" />
               </label>
             </td>
-            <td><a onClick={(): void => onUpdate(i.id)} style={{cursor: 
'pointer'}} >{i.id}</a></td>
+            <td><a onClick={(): void => onUpdate(i.id)} style={{ cursor: 
'pointer' }} >{i.id}</a></td>
             <td >{i.name}</td>
             <td class="is-actions-cell">
               <div class="buttons is-right">
+                <button class="button is-small is-success jb-modal" 
type="button" onClick={(): void => navigator.clipboard.writeText(i.id) as any}>
+                  <span class="icon"><i class="mdi mdi-content-copy" /></span>
+                </button>
                 <button class="button is-small is-success jb-modal" 
type="button" onClick={(): void => onUpdate(i.id)}>
                   <span class="icon"><i class="mdi mdi-pen" /></span>
                 </button>
diff --git a/packages/frontend/src/routes/instance/update/UpdatePage.tsx 
b/packages/frontend/src/routes/instance/update/UpdatePage.tsx
index 6fde628..ac6eec4 100644
--- a/packages/frontend/src/routes/instance/update/UpdatePage.tsx
+++ b/packages/frontend/src/routes/instance/update/UpdatePage.tsx
@@ -34,8 +34,9 @@ import { useConfigContext, useInstanceContext } from 
"../../../context/backend";
 import { InputDuration } from "../../../components/form/InputDuration";
 import { InputCurrency } from "../../../components/form/InputCurrency";
 import { InputPayto } from "../../../components/form/InputPayto";
+import { InputArray } from "../../../components/form/InputArray";
 
-type Entity = MerchantBackend.Instances.InstanceReconfigurationMessage & 
{auth_token?: string}
+type Entity = MerchantBackend.Instances.InstanceReconfigurationMessage & { 
auth_token?: string }
 
 interface Props {
   onUpdate: (d: Entity, auth?: 
MerchantBackend.Instances.InstanceAuthConfigurationMessage) => void;
@@ -73,11 +74,11 @@ export function UpdatePage({ onUpdate, isLoading, selected, 
onBack }: Props): VN
       // use conversion instead of this
       const newToken = value.auth_token;
       value.auth_token = undefined;
-      const auth: MerchantBackend.Instances.InstanceAuthConfigurationMessage | 
undefined = 
-      newToken === currentTokenValue ? undefined : (newToken === null ? 
-          { method: "external" } : 
+      const auth: MerchantBackend.Instances.InstanceAuthConfigurationMessage | 
undefined =
+        newToken === currentTokenValue ? undefined : (newToken === null ?
+          { method: "external" } :
           { method: "token", token: `secret-token:${newToken}` });
-      
+
       // remove above use conversion
       schema.validateSync(value, { abortEarly: false })
       onUpdate(schema.cast(value), auth);
@@ -94,7 +95,7 @@ export function UpdatePage({ onUpdate, isLoading, selected, 
onBack }: Props): VN
     <section class="section is-main-section">
       <div class="columns">
         <div class="column" />
-        <div class="column is-two-thirds">
+        <div class="column is-four-fifths">
           <FormProvider<Entity> errors={errors} object={value} 
valueHandler={valueHandler} >
 
             <Input<Entity> name="name" />
@@ -107,14 +108,38 @@ export function UpdatePage({ onUpdate, isLoading, 
selected, onBack }: Props): VN
 
             <InputCurrency<Entity> name="default_max_wire_fee" 
currency={config.currency} />
 
-            <Input<Entity> name="default_wire_fee_amortization" />
+            <Input<Entity> name="default_wire_fee_amortization" 
inputType="number" />
 
             <InputGroup name="address">
-              <Input<Entity> name="name" />
+              <Input name="address.country" />
+              <Input name="address.address_lines" inputType="multiline"
+                toStr={(v: string[] | undefined) => !v ? '' : v.join('\n')}
+                fromStr={(v: string) => v.split('\n')}
+              />
+              <Input name="address.building_number" />
+              <Input name="address.building_name" />
+              <Input name="address.street" />
+              <Input name="address.post_code" />
+              <Input name="address.town_location" />
+              <Input name="address.town" />
+              <Input name="address.district" />
+              <Input name="address.country_subdivision" />
             </InputGroup>
 
             <InputGroup name="jurisdiction">
-              <Input<Entity> name="name" />
+              <Input name="jurisdiction.country" />
+              <Input name="jurisdiction.address_lines" inputType="multiline"
+                toStr={(v: string[] | undefined) => !v ? '' : v.join('\n')}
+                fromStr={(v: string) => v.split('\n')}
+              />
+              <Input name="jurisdiction.building_number" />
+              <Input name="jurisdiction.building_name" />
+              <Input name="jurisdiction.street" />
+              <Input name="jurisdiction.post_code" />
+              <Input name="jurisdiction.town_location" />
+              <Input name="jurisdiction.town" />
+              <Input name="jurisdiction.district" />
+              <Input name="jurisdiction.country_subdivision" />
             </InputGroup>
 
             <InputDuration<Entity> name="default_pay_delay" />
diff --git a/packages/frontend/src/routes/instance/update/index.tsx 
b/packages/frontend/src/routes/instance/update/index.tsx
index 51bb6a5..3bed0cf 100644
--- a/packages/frontend/src/routes/instance/update/index.tsx
+++ b/packages/frontend/src/routes/instance/update/index.tsx
@@ -33,10 +33,8 @@ interface Props {
 }
 
 export default function Update({ onBack, onConfirm, onLoadError, 
onUpdateError, onUnauthorized }: Props): VNode {
-  const { updateInstance, setNewToken, clearToken } = useInstanceMutateAPI();
-  const [updatingToken, setUpdatingToken] = useState<boolean>(false)
+  const { updateInstance } = useInstanceMutateAPI();
   const details = useInstanceDetails()
-  const { id, token } = useInstanceContext()
 
   if (!details.data) {
     if (details.unauthorized) return onUnauthorized()
@@ -52,15 +50,7 @@ export default function Update({ onBack, onConfirm, 
onLoadError, onUpdateError,
       isLoading={false}
       selected={details.data}
       onUpdate={(d: MerchantBackend.Instances.InstanceReconfigurationMessage, 
t?: MerchantBackend.Instances.InstanceAuthConfigurationMessage): Promise<void> 
=> {
-        return updateInstance(d,t).then(onConfirm).catch(onUpdateError)
+        return updateInstance(d, t).then(onConfirm).catch(onUpdateError)
       }} />
-    <button class="button" onClick={() => setUpdatingToken(true)}>auth</button>
-    {updatingToken && <UpdateTokenModal
-      oldToken={token}
-      element={{ id, name: details.data.name }}
-      onCancel={() => setUpdatingToken(false)}
-      onClear={() => clearToken()}
-      onConfirm={(newToken) => setNewToken(newToken)}
-    />}
   </Fragment>
 }
\ No newline at end of file

-- 
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]