gnunet-svn
[Top][All Lists]
Advanced

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

[taler-merchant-backoffice] branch master updated (f4aa1c0 -> ee3f5c5)


From: gnunet
Subject: [taler-merchant-backoffice] branch master updated (f4aa1c0 -> ee3f5c5)
Date: Mon, 02 Aug 2021 16:23:03 +0200

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

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

    from f4aa1c0  make the managment login intention explicit
     new cfd0c07  Revert "make the managment login intention explicit"
     new ee3f5c5  making purge instance feature

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 packages/frontend/src/ApplicationReadyRoutes.tsx   | 38 +++---------
 packages/frontend/src/InstanceRoutes.tsx           |  8 +--
 .../frontend/src/components/exception/login.tsx    | 33 ++---------
 packages/frontend/src/components/modal/index.tsx   |  9 +++
 packages/frontend/src/context/backend.ts           |  8 +--
 packages/frontend/src/hooks/admin.ts               | 12 +++-
 packages/frontend/src/hooks/index.ts               | 11 ++--
 packages/frontend/src/index.tsx                    |  4 +-
 .../admin/list/{Table.tsx => TableActive.tsx}      |  2 +-
 .../admin/list/{Table.tsx => TableDeleted.tsx}     | 68 +++-------------------
 packages/frontend/src/paths/admin/list/View.tsx    | 12 +++-
 packages/frontend/src/paths/admin/list/index.tsx   | 43 +++++++++++++-
 packages/frontend/src/paths/login/index.tsx        |  2 +-
 13 files changed, 105 insertions(+), 145 deletions(-)
 copy packages/frontend/src/paths/admin/list/{Table.tsx => TableActive.tsx} 
(99%)
 rename packages/frontend/src/paths/admin/list/{Table.tsx => TableDeleted.tsx} 
(51%)

diff --git a/packages/frontend/src/ApplicationReadyRoutes.tsx 
b/packages/frontend/src/ApplicationReadyRoutes.tsx
index 37a4caf..d9bd75d 100644
--- a/packages/frontend/src/ApplicationReadyRoutes.tsx
+++ b/packages/frontend/src/ApplicationReadyRoutes.tsx
@@ -29,30 +29,23 @@ import { NotYetReadyAppMenu, Menu, NotificationCard } from 
'./components/menu';
 import { useTranslator } from './i18n';
 import { createHashHistory } from 'history';
 import { useState } from 'preact/hooks';
+import { CreateStockNoRestock } from './components/form/InputStock.stories';
 
-/**
- * We know that we are connection to a merchant backend because we have 
- * succeeded with a /config request but we should check for credentials 
- * and management control before continue
- *  
- * @returns Application or Login form with an error
- */
 export function ApplicationReadyRoutes(): VNode {
   const i18n = useTranslator();
-  const { url: backendURL, managementIntended, changeBackend, updateToken, 
clearAllTokens } = useBackendContext();
+  const { url: backendURL, changeBackend, updateToken, clearAllTokens } = 
useBackendContext();
 
-  const updateLoginStatus = (url: string, management: boolean, token?: string) 
=> {
-    changeBackend(url, management);
+  const updateLoginStatus = (url: string, token?: string) => {
+    changeBackend(url);
     if (token) updateToken(token);
   };
+  const result = useBackendInstancesTestForAdmin()
 
   const clearTokenAndGoToRoot = () => {
     clearAllTokens();
     route('/')
   }
 
-  const result = useBackendInstancesTestForAdmin()
-
   if (result.clientError && result.isUnauthorized) {
     return <Fragment>
       <NotYetReadyAppMenu title="Login" onLogout={clearTokenAndGoToRoot} />
@@ -69,25 +62,10 @@ export function ApplicationReadyRoutes(): VNode {
 
   if (result.loading) return <NotYetReadyAppMenu title="Loading..." />
 
-  let admin = managementIntended;
+  let admin = true;
   let instanceNameByBackendURL;
 
   if (!result.ok) {
-
-    if (managementIntended) {
-      return <Fragment>
-        <NotYetReadyAppMenu title="Login" onLogout={clearTokenAndGoToRoot} />
-        <NotificationCard notification={{
-          message: i18n`Couldn't access the server`,
-          description: i18n`You ask for management but seems that this is not 
the default instance of the backend`,
-          type: 'ERROR'
-        }}
-        />
-        <LoginPage onConfirm={updateLoginStatus} />
-      </Fragment>
-    }
-    admin = false
-
     const path = new URL(backendURL).pathname
     const match = INSTANCE_ID_LOOKUP.exec(path)
     if (!match || !match[1]) {
@@ -106,12 +84,10 @@ export function ApplicationReadyRoutes(): VNode {
       </Fragment>
     }
 
+    admin = false
     instanceNameByBackendURL = match[1]
   }
 
-  /**
-   * We are using router to take information from the URL parameters
-   */
   const history = createHashHistory()
   return <Router history={history}>
     <Route default component={DefaultMainRoute} 
clearTokenAndGoToRoot={clearTokenAndGoToRoot} admin={admin} 
instanceNameByBackendURL={instanceNameByBackendURL} />
diff --git a/packages/frontend/src/InstanceRoutes.tsx 
b/packages/frontend/src/InstanceRoutes.tsx
index 5acca16..2914f5f 100644
--- a/packages/frontend/src/InstanceRoutes.tsx
+++ b/packages/frontend/src/InstanceRoutes.tsx
@@ -102,8 +102,8 @@ export function InstanceRoutes({ id, admin, setInstanceName 
}: Props): VNode {
       updateDefaultToken(token)
     }
   }
-  const updateLoginStatus = (url: string, magement: boolean, token?: string) 
=> {
-    changeBackend(url, magement);
+  const updateLoginStatus = (url: string, token?: string) => {
+    changeBackend(url);
     if (!token) return
     changeToken(token)
   };
@@ -303,8 +303,8 @@ export function Redirect({ to }: { to: string }): null {
 function AdminInstanceUpdatePage({ id, ...rest }: { id: string } & 
InstanceUpdatePageProps) {
   const [token, changeToken] = useBackendInstanceToken(id);
   const { changeBackend } = useBackendContext();
-  const updateLoginStatus = (url: string, management: boolean, token?: string) 
=> {
-    changeBackend(url, management);
+  const updateLoginStatus = (url: string, token?: string) => {
+    changeBackend(url);
     if (token)
     changeToken(token);
   };
diff --git a/packages/frontend/src/components/exception/login.tsx 
b/packages/frontend/src/components/exception/login.tsx
index 6b83879..fca81ae 100644
--- a/packages/frontend/src/components/exception/login.tsx
+++ b/packages/frontend/src/components/exception/login.tsx
@@ -28,7 +28,7 @@ import { Notification } from "../../utils/types";
 
 interface Props {
   withMessage?: Notification;
-  onConfirm: (backend: string, management: boolean, token?: string) => void;
+  onConfirm: (backend: string, token?: string) => void;
 }
 
 function getTokenValuePart(t?: string): string | undefined {
@@ -44,8 +44,7 @@ export function LoginModal({ onConfirm, withMessage }: 
Props): VNode {
   const { admin, token: instanceToken } = useInstanceContext()
   const currentToken = getTokenValuePart(!admin ? baseToken : instanceToken || 
'')
   const [token, setToken] = useState(currentToken)
-  const [management, setManagement] = useState(false)
-
+  
   const [url, setURL] = useState(backendUrl)
   const i18n = useTranslator()
 
@@ -66,7 +65,7 @@ export function LoginModal({ onConfirm, withMessage }: 
Props): VNode {
                 <p class="control is-expanded">
                   <input class="input" type="text" placeholder="set new url" 
name="id"
                     value={url}
-                    onKeyPress={e => e.keyCode === 13 ? onConfirm(url, 
management, token ? `secret-token:${token}` : undefined) : null}
+                    onKeyPress={e => e.keyCode === 13 ? onConfirm(url, token ? 
`secret-token:${token}` : undefined) : null}
                     onInput={(e): void => setURL(e?.currentTarget.value)}
                   />
                 </p>
@@ -81,38 +80,18 @@ export function LoginModal({ onConfirm, withMessage }: 
Props): VNode {
               <div class="field">
                 <p class="control is-expanded">
                   <input class="input" type="text" placeholder={"set new 
access token"} name="token"
-                    onKeyPress={e => e.keyCode === 13 ? onConfirm(url, 
management, token ? `secret-token:${token}` : undefined) : null}
-                    value={token}
+                    onKeyPress={e => e.keyCode === 13 ? onConfirm(url, token ? 
`secret-token:${token}` : undefined) : null}
+                    value={token} 
                     onInput={(e): void => setToken(e?.currentTarget.value)}
                   />
                 </p>
               </div>
             </div>
           </div>
-          <div class="field is-horizontal">
-            <div class="field-label is-normal">
-              <label class="label"><Translate>Management</Translate></label>
-            </div>
-            <div class="field-body">
-              <div class="field">
-                <p class="control is-expanded">
-                  <label class="b-checkbox checkbox">
-                    <input type="checkbox"
-                      class="input"
-                      checked={management}
-                      placeholder={"asdsad"}
-                      name="management"
-                      onChange={() => setManagement(v => !v)} />
-                    <span class="check" />
-                  </label>
-                </p>
-              </div>
-            </div>
-          </div>
         </section>
         <footer class="modal-card-foot " style={{ justifyContent: 'flex-end', 
border: '1px solid', borderTop: 0 }} >
           <button class="button is-info" onClick={(): void => {
-            onConfirm(url, management, token ? `secret-token:${token}` : 
undefined);
+            onConfirm(url, token ? `secret-token:${token}` : undefined);
           }} ><Translate>Confirm</Translate></button>
         </footer>
       </div>
diff --git a/packages/frontend/src/components/modal/index.tsx 
b/packages/frontend/src/components/modal/index.tsx
index a427215..15157f0 100644
--- a/packages/frontend/src/components/modal/index.tsx
+++ b/packages/frontend/src/components/modal/index.tsx
@@ -124,8 +124,17 @@ interface DeleteModalProps {
 }
 
 export function DeleteModal({ element, onCancel, onConfirm }: 
DeleteModalProps): VNode {
+  return <ConfirmModal description="delete_instance" danger active 
onCancel={onCancel} onConfirm={() => onConfirm(element.id)}>
+    <p>This will deactivate the instance "{element.name}" with id 
<b>{element.id}</b></p>
+    <p>The merchant will not be able to create order or make refunds 
anymore.</p>
+    <p>Please confirm this action</p>
+  </ConfirmModal>
+}
+
+export function PurgeModal({ element, onCancel, onConfirm }: 
DeleteModalProps): VNode {
   return <ConfirmModal description="delete_instance" danger active 
onCancel={onCancel} onConfirm={() => onConfirm(element.id)}>
     <p>This will permanently delete instance "{element.name}" with id 
<b>{element.id}</b></p>
+    <p>The information being deleted also include tax records, make sure you 
have backups.</p>
     <p>Please confirm this action</p>
   </ConfirmModal>
 }
diff --git a/packages/frontend/src/context/backend.ts 
b/packages/frontend/src/context/backend.ts
index aeb1c81..1a7cd72 100644
--- a/packages/frontend/src/context/backend.ts
+++ b/packages/frontend/src/context/backend.ts
@@ -27,8 +27,7 @@ interface BackendContextType {
   url: string;
   token?: string;
   triedToLog: boolean;
-  managementIntended: boolean;
-  changeBackend: (url: string, management: boolean) => void;
+  changeBackend: (url: string) => void;
   resetBackend: () => void;
   clearAllTokens: () => void;
   addTokenCleaner: (c: () => void) => void;
@@ -39,7 +38,6 @@ const BackendContext = createContext<BackendContextType>({
   url: '',
   token: undefined,
   triedToLog: false,
-  managementIntended: false,
   changeBackend: () => null,
   resetBackend: () => null,
   clearAllTokens: () => null,
@@ -48,7 +46,7 @@ const BackendContext = createContext<BackendContextType>({
 })
 
 export function useBackendContextState(defaultUrl?:string): BackendContextType 
{
-  const [url, triedToLog, management, changeBackend, resetBackend] = 
useBackendURL(defaultUrl);
+  const [url, triedToLog, changeBackend, resetBackend] = 
useBackendURL(defaultUrl);
   const [token, _updateToken] = useBackendDefaultToken();
   const updateToken = (t?:string) => {
     _updateToken(t)
@@ -68,7 +66,7 @@ export function useBackendContextState(defaultUrl?:string): 
BackendContextType {
     resetBackend()
   }
 
-  return { url, token, triedToLog, managementIntended: management, 
changeBackend, updateToken, resetBackend, clearAllTokens, addTokenCleaner: 
addTokenCleanerMemo }
+  return { url, token, triedToLog, changeBackend, updateToken, resetBackend, 
clearAllTokens, addTokenCleaner: addTokenCleanerMemo }
 }
 
 export const BackendContextProvider = ({children, defaultUrl}:{children:any, 
defaultUrl?:string}):VNode => {
diff --git a/packages/frontend/src/hooks/admin.ts 
b/packages/frontend/src/hooks/admin.ts
index 3c095de..24089b7 100644
--- a/packages/frontend/src/hooks/admin.ts
+++ b/packages/frontend/src/hooks/admin.ts
@@ -40,10 +40,20 @@ export function useAdminAPI(): AdminAPI {
     mutateAll(/@"\/private\/instances"@/);
   };
 
-  return { createInstance, deleteInstance };
+  const purgeInstance = async (id: string): Promise<void> => {
+    await request(`${url}/private/instances/${id}?purge=YES`, {
+      method: 'delete',
+      token,
+    });
+
+    mutateAll(/@"\/private\/instances"@/);
+  };
+
+  return { createInstance, deleteInstance, purgeInstance };
 }
 
 export interface AdminAPI {
   createInstance: (data: 
MerchantBackend.Instances.InstanceConfigurationMessage) => Promise<void>;
   deleteInstance: (id: string) => Promise<void>;
+  purgeInstance: (id: string) => Promise<void>;
 }
diff --git a/packages/frontend/src/hooks/index.ts 
b/packages/frontend/src/hooks/index.ts
index 46b3222..19d672a 100644
--- a/packages/frontend/src/hooks/index.ts
+++ b/packages/frontend/src/hooks/index.ts
@@ -28,22 +28,19 @@ const calculateRootPath = () => {
   return rootPath
 }
 
-export function useBackendURL(url?: string): [string, boolean, boolean, 
(url:string, m:boolean) => void, () => void] {
+export function useBackendURL(url?: string): [string, boolean, 
StateUpdater<string>, () => void] {
   const [value, setter] = useNotNullLocalStorage('backend-url', url || 
calculateRootPath())
-  const [mngmt, setMngmt] = useLocalStorage('backend-management')
   const [triedToLog, setTriedToLog] = useLocalStorage('tried-login')
 
-  const checkedSetter = (v: string, m: boolean) => {
+  const checkedSetter = (v: ValueOrFunction<string>) => {
     setTriedToLog('yes')
-    setMngmt(m ? 'yes' : 'no')
-    return setter(v.replace(/\/$/, ''))
+    return setter(p => (v instanceof Function ? v(p) : v).replace(/\/$/, ''))
   }
 
   const resetBackend = () => {
-    setMngmt(undefined)
     setTriedToLog(undefined)
   }
-  return [value, !!triedToLog, mngmt === 'yes', checkedSetter, resetBackend]
+  return [value, !!triedToLog, checkedSetter, resetBackend]
 }
 
 export function useBackendDefaultToken(): [string | undefined, 
StateUpdater<string | undefined>] {
diff --git a/packages/frontend/src/index.tsx b/packages/frontend/src/index.tsx
index 0dee1fe..0a77533 100644
--- a/packages/frontend/src/index.tsx
+++ b/packages/frontend/src/index.tsx
@@ -51,8 +51,8 @@ function ApplicationStatusRoutes(): VNode {
   const result = useBackendConfig();
   const i18n = useTranslator()
 
-  const updateLoginInfoAndGoToRoot = (url: string, management: boolean, 
token?: string) => {
-    changeBackend(url, management)
+  const updateLoginInfoAndGoToRoot = (url: string, token?: string) => {
+    changeBackend(url)
     if (token) updateToken(token)
     route('/')
   }
diff --git a/packages/frontend/src/paths/admin/list/Table.tsx 
b/packages/frontend/src/paths/admin/list/TableActive.tsx
similarity index 99%
copy from packages/frontend/src/paths/admin/list/Table.tsx
copy to packages/frontend/src/paths/admin/list/TableActive.tsx
index b306c43..d4e586b 100644
--- a/packages/frontend/src/paths/admin/list/Table.tsx
+++ b/packages/frontend/src/paths/admin/list/TableActive.tsx
@@ -134,7 +134,7 @@ function Table({ rowSelection, rowSelectionHandler, 
setInstanceName, instances,
                     <Translate>Edit</Translate>
                   </button>
                   <button class="button is-small is-danger jb-modal" 
type="button" onClick={(): void => onDelete(i)}>
-                    <Translate>Delete</Translate>
+                    <Translate>Disable</Translate>
                   </button>
                 </div>
               </td>
diff --git a/packages/frontend/src/paths/admin/list/Table.tsx 
b/packages/frontend/src/paths/admin/list/TableDeleted.tsx
similarity index 51%
rename from packages/frontend/src/paths/admin/list/Table.tsx
rename to packages/frontend/src/paths/admin/list/TableDeleted.tsx
index b306c43..667ff19 100644
--- a/packages/frontend/src/paths/admin/list/Table.tsx
+++ b/packages/frontend/src/paths/admin/list/TableDeleted.tsx
@@ -26,58 +26,23 @@ import { Translate, useTranslator } from "../../../i18n";
 
 interface Props {
   instances: MerchantBackend.Instances.Instance[];
-  onUpdate: (id: string) => void;
-  onDelete: (id: MerchantBackend.Instances.Instance) => void;
-  onCreate: () => void;
-  selected?: boolean;
-  setInstanceName: (s: string) => void;
+  onPurge: (id: MerchantBackend.Instances.Instance) => void;
 }
 
-export function CardTable({ instances, onCreate, onUpdate, setInstanceName, 
onDelete, selected }: Props): VNode {
-  const [actionQueue, actionQueueHandler] = useState<Actions[]>([]);
-  const [rowSelection, rowSelectionHandler] = useState<string[]>([])
-
-  useEffect(() => {
-    if (actionQueue.length > 0 && !selected && actionQueue[0].type == 
'DELETE') {
-      onDelete(actionQueue[0].element)
-      actionQueueHandler(actionQueue.slice(1))
-    }
-  }, [actionQueue, selected, onDelete])
-
-  useEffect(() => {
-    if (actionQueue.length > 0 && !selected && actionQueue[0].type == 
'UPDATE') {
-      onUpdate(actionQueue[0].element.id)
-      actionQueueHandler(actionQueue.slice(1))
-    }
-  }, [actionQueue, selected, onUpdate])
+export function CardTable({ instances, onPurge }: Props): VNode {
 
   const i18n = useTranslator()
 
   return <div class="card has-table">
     <header class="card-header">
-      <p class="card-header-title"><span class="icon"><i class="mdi 
mdi-desktop-mac" /></span><Translate>Instances</Translate></p>
-
-      <div class="card-header-icon" aria-label="more options">
-
-        <button class={rowSelection.length > 0 ? "button is-danger" : 
"is-hidden"}
-          type="button" onClick={(): void => 
actionQueueHandler(buildActions(instances, rowSelection, 'DELETE'))} >
-          <Translate>Delete</Translate>
-        </button>
-      </div>
-      <div class="card-header-icon" aria-label="more options">
-        <span class="has-tooltip-left" data-tooltip={i18n`add new instance`}>
-          <button class="button is-info" type="button" onClick={onCreate}>
-            <span class="icon is-small" ><i class="mdi mdi-plus mdi-36px" 
/></span>
-          </button>
-        </span>
-      </div>
+      <p class="card-header-title"><span class="icon"><i class="mdi 
mdi-desktop-mac" /></span><Translate>Disabled instances</Translate></p>
 
     </header>
     <div class="card-content">
       <div class="b-table has-pagination">
         <div class="table-wrapper has-mobile-cards">
           {instances.length > 0 ?
-            <Table instances={instances} onUpdate={onUpdate} 
setInstanceName={setInstanceName} onDelete={onDelete} 
rowSelection={rowSelection} rowSelectionHandler={rowSelectionHandler} /> :
+            <Table instances={instances} onPurge={onPurge} /> :
             <EmptyTable />
           }
         </div>
@@ -86,29 +51,21 @@ export function CardTable({ instances, onCreate, onUpdate, 
setInstanceName, onDe
   </div>
 }
 interface TableProps {
-  rowSelection: string[];
   instances: MerchantBackend.Instances.Instance[];
-  onUpdate: (id: string) => void;
-  onDelete: (id: MerchantBackend.Instances.Instance) => void;
-  rowSelectionHandler: StateUpdater<string[]>;
-  setInstanceName: (s:string) => void;
+  onPurge: (id: MerchantBackend.Instances.Instance) => void;
 }
 
 function toggleSelected<T>(id: T): (prev: T[]) => T[] {
   return (prev: T[]): T[] => prev.indexOf(id) == -1 ? [...prev, id] : 
prev.filter(e => e != id)
 }
 
-function Table({ rowSelection, rowSelectionHandler, setInstanceName, 
instances, onUpdate, onDelete }: TableProps): VNode {
+function Table({ instances, onPurge }: TableProps): VNode {
   return (
     <div class="table-container">
       <table class="table is-fullwidth is-striped is-hoverable is-fullwidth">
         <thead>
           <tr>
             <th class="is-checkbox-cell">
-              <label class="b-checkbox checkbox">
-                <input type="checkbox" checked={rowSelection.length === 
instances.length} onClick={(): void => rowSelectionHandler(rowSelection.length 
=== instances.length ? [] : instances.map(i => i.id))} />
-                <span class="check" />
-              </label>
             </th>
             <th><Translate>ID</Translate></th>
             <th><Translate>Name</Translate></th>
@@ -119,21 +76,12 @@ function Table({ rowSelection, rowSelectionHandler, 
setInstanceName, instances,
           {instances.map(i => {
             return <tr key={i.id}>
               <td class="is-checkbox-cell">
-                <label class="b-checkbox checkbox">
-                  <input type="checkbox" checked={rowSelection.indexOf(i.id) 
!= -1} onClick={(): void => rowSelectionHandler(toggleSelected(i.id))} />
-                  <span class="check" />
-                </label>
               </td>
-              <td><a href={`#/orders?instance=${i.id}`} onClick={(e) => {
-                setInstanceName(i.id);
-              }}>{i.id}</a></td>
+              <td>{i.id}</td>
               <td >{i.name}</td>
               <td class="is-actions-cell right-sticky">
                 <div class="buttons is-right">
-                  <button class="button is-small is-success jb-modal" 
type="button" onClick={(): void => onUpdate(i.id)}>
-                    <Translate>Edit</Translate>
-                  </button>
-                  <button class="button is-small is-danger jb-modal" 
type="button" onClick={(): void => onDelete(i)}>
+                  <button class="button is-small is-danger jb-modal" 
type="button" onClick={(): void => onPurge(i)}>
                     <Translate>Delete</Translate>
                   </button>
                 </div>
diff --git a/packages/frontend/src/paths/admin/list/View.tsx 
b/packages/frontend/src/paths/admin/list/View.tsx
index 43ab4e7..e7413c1 100644
--- a/packages/frontend/src/paths/admin/list/View.tsx
+++ b/packages/frontend/src/paths/admin/list/View.tsx
@@ -21,23 +21,29 @@
 
 import { h, VNode } from "preact";
 import { MerchantBackend } from "../../../declaration";
-import { CardTable } from './Table';
+import { CardTable as CardTableActive } from './TableActive';
+import { CardTable as CardTableDeleted } from './TableDeleted';
 
 interface Props {
   instances: MerchantBackend.Instances.Instance[];
   onCreate: () => void;
   onUpdate: (id: string) => void;
   onDelete: (id: MerchantBackend.Instances.Instance) => void;
+  onPurge: (id: MerchantBackend.Instances.Instance) => void;
   selected?: boolean;
   setInstanceName: (s:string) => void;
 }
 
-export function View({ instances, onCreate, onDelete, onUpdate, 
setInstanceName, selected }: Props): VNode {
+export function View({ instances, onCreate, onDelete, onPurge, onUpdate, 
setInstanceName, selected }: Props): VNode {
 
   return <div id="app">
 
     <section class="section is-main-section">
-      <CardTable instances={instances} onDelete={onDelete} 
setInstanceName={setInstanceName} onUpdate={onUpdate} selected={selected} 
onCreate={onCreate} />
+      <CardTableActive instances={instances.filter(i => !i.deleted)} 
onDelete={onDelete} setInstanceName={setInstanceName} onUpdate={onUpdate} 
selected={selected} onCreate={onCreate} />
+    </section>
+
+    <section class="section is-main-section">
+      <CardTableDeleted instances={instances.filter(i => i.deleted)} 
onPurge={onPurge} />
     </section>
 
   </div >
diff --git a/packages/frontend/src/paths/admin/list/index.tsx 
b/packages/frontend/src/paths/admin/list/index.tsx
index 0d42e63..8dd5eef 100644
--- a/packages/frontend/src/paths/admin/list/index.tsx
+++ b/packages/frontend/src/paths/admin/list/index.tsx
@@ -22,11 +22,14 @@
 import { Fragment, h, VNode } from 'preact';
 import { useState } from 'preact/hooks';
 import { Loading } from '../../../components/exception/loading';
-import { DeleteModal } from '../../../components/modal';
+import { NotificationCard } from '../../../components/menu';
+import { DeleteModal, PurgeModal } from '../../../components/modal';
 import { MerchantBackend } from '../../../declaration';
 import { useAdminAPI } from "../../../hooks/admin";
 import { HttpError } from '../../../hooks/backend';
 import { useBackendInstances } from '../../../hooks/instance';
+import { useTranslator } from '../../../i18n';
+import { Notification } from '../../../utils/types';
 import { View } from './View';
 
 interface Props {
@@ -42,7 +45,10 @@ interface Props {
 export default function Instances({ onUnauthorized, onLoadError, onNotFound, 
onCreate, onUpdate, setInstanceName }: Props): VNode {
   const result = useBackendInstances()
   const [deleting, setDeleting] = useState<MerchantBackend.Instances.Instance 
| null>(null)
-  const { deleteInstance } = useAdminAPI()
+  const [purging, setPurging] = useState<MerchantBackend.Instances.Instance | 
null>(null)
+  const { deleteInstance, purgeInstance } = useAdminAPI()
+  const [notif, setNotif] = useState<Notification | undefined>(undefined)
+  const i18n = useTranslator()
 
   if (result.clientError && result.isUnauthorized) return onUnauthorized()
   if (result.clientError && result.isNotfound) return onNotFound()
@@ -50,9 +56,11 @@ export default function Instances({ onUnauthorized, 
onLoadError, onNotFound, onC
   if (!result.ok) return onLoadError(result)
 
   return <Fragment>
+    <NotificationCard notification={notif} />
     <View instances={result.data.instances}
       onDelete={setDeleting}
       onCreate={onCreate}
+      onPurge={setPurging}
       onUpdate={onUpdate}
       setInstanceName={setInstanceName}
       selected={!!deleting}
@@ -64,11 +72,40 @@ export default function Instances({ onUnauthorized, 
onLoadError, onNotFound, onC
         try {
           await deleteInstance(deleting.id)
           // pushNotification({ message: 'delete_success', type: 'SUCCESS' })
-        } catch (e) {
+          setNotif({
+            message: i18n`Instance disable`,
+            type: 'SUCCESS'
+          })
+        } catch (error) {
+          setNotif({
+            message: i18n`Failed to disable instance`,
+            type: "ERROR",
+            description: error.message
+          })
           // pushNotification({ message: 'delete_error', type: 'ERROR' })
         }
         setDeleting(null)
       }}
     />}
+    {purging && <PurgeModal
+      element={purging}
+      onCancel={() => setPurging(null)}
+      onConfirm={async (): Promise<void> => {
+        try {
+          await purgeInstance(purging.id)
+          setNotif({
+            message: i18n`Instance deleted`,
+            type: 'SUCCESS'
+          })
+        } catch (error) {
+          setNotif({
+            message: i18n`Failed to delete instance`,
+            type: "ERROR",
+            description: error.message
+          })
+        }
+        setPurging(null)
+      }}
+    />}
   </Fragment>;
 }
diff --git a/packages/frontend/src/paths/login/index.tsx 
b/packages/frontend/src/paths/login/index.tsx
index 44ab9b1..acad7fe 100644
--- a/packages/frontend/src/paths/login/index.tsx
+++ b/packages/frontend/src/paths/login/index.tsx
@@ -22,7 +22,7 @@ import { h, VNode } from "preact";
 import { LoginModal } from '../../components/exception/login';
 
 interface Props {
-  onConfirm: (url: string, management: boolean, token?: string) => void;
+  onConfirm: (url: string, token?: string) => void;
 }
 export default function LoginPage({ onConfirm }: Props): VNode {
   return <LoginModal onConfirm={onConfirm} />

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