[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[taler-merchant-backoffice] 04/08: added copyright and replace default i
From: |
gnunet |
Subject: |
[taler-merchant-backoffice] 04/08: added copyright and replace default import |
Date: |
Thu, 18 Feb 2021 20:07:16 +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 b923b0d6a489b13fd1d5d405a2febb8a7150bc12
Author: Sebastian <sebasjm@gmail.com>
AuthorDate: Thu Feb 18 09:46:01 2021 -0300
added copyright and replace default import
---
TODO | 4 +-
preact.config.js | 18 +-
src/components/auth/{LoginPage.tsx => index.tsx} | 14 +-
src/components/footer/index.tsx | 2 +-
.../hooks/{useLocalStorage.ts => index.ts} | 35 +-
src/components/hooks/useBackend.ts | 44 --
src/components/hooks/useLang.ts | 27 --
src/components/modal/index.tsx | 2 +-
src/components/navbar/index.tsx | 18 +-
.../notifications/Notifications.stories.tsx | 20 +-
src/components/notifications/index.tsx | 2 +-
src/components/sidebar/index.tsx | 2 +-
src/components/yup/YupField.tsx | 20 +-
src/declaration.d.ts | 4 +-
src/i18n/index.ts | 2 +-
src/index.ts | 7 +-
src/routes/dashboard/index.tsx | 482 ---------------------
src/routes/forms/index.tsx | 279 ------------
src/routes/home/index.tsx | 61 ---
src/routes/index.tsx | 25 +-
src/routes/instances/CardTable.tsx | 14 +-
src/routes/instances/Create.stories.tsx | 6 +-
.../instances/{Create.tsx => CreatePage.tsx} | 14 +-
src/routes/instances/DeleteModal.tsx | 12 +-
src/routes/instances/EmptyTable.tsx | 2 +-
src/routes/instances/Table.tsx | 2 +-
src/routes/instances/UpdateModal.stories.tsx | 45 --
src/routes/instances/UpdateModal.tsx | 57 ---
.../instances/{Update.tsx => UpdatePage.tsx} | 20 +-
src/routes/instances/View.stories.tsx | 22 +-
src/routes/instances/View.tsx | 16 +-
src/routes/instances/index.tsx | 26 +-
src/routes/notfound/index.tsx | 7 +-
src/routes/profile/index.tsx | 239 ----------
tests/header.test.tsx | 10 +-
tsconfig.json | 21 -
36 files changed, 176 insertions(+), 1405 deletions(-)
diff --git a/TODO b/TODO
index 0a46691..4f0d9a3 100644
--- a/TODO
+++ b/TODO
@@ -18,6 +18,8 @@ Already done:
* refactor update page
* Login button should be centered
* format duration as human readable
+ * add copyright headers to every source file
+ * replace default exports for named exports
Next to do:
* implement proper error handling
@@ -25,9 +27,7 @@ Next to do:
Queue:
* replace Yup and type definition with a taler-library for the purpose (first
wait Florian to refactor wallet core)
- * replace default exports for named exports
* implement pnpm
- * add copyright headers to every source file
* add more doc style comments
* check the field names in forms dont break spaces
* update spanish lang
diff --git a/preact.config.js b/preact.config.js
index b62d39b..de2debe 100644
--- a/preact.config.js
+++ b/preact.config.js
@@ -14,22 +14,22 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
// import { DefinePlugin } from 'webpack';
-import { config } from 'dotenv';
-const { parsed } = config();
+// import { config } from 'dotenv';
+// const { parsed } = config();
export default {
webpack(config, env, helpers, options) {
config.node.process = 'mock'
// config.plugins.push(
- // new DefinePlugin({
- // // 'process.env.BACKEND_ENDPOINT':
JSON.stringify(parsed['BACKEND_ENDPOINT']),
- // }),
+ // new DefinePlugin({
+ // // 'process.env.BACKEND_ENDPOINT':
JSON.stringify(parsed['BACKEND_ENDPOINT']),
+ // }),
// );
}
}
diff --git a/src/components/auth/LoginPage.tsx b/src/components/auth/index.tsx
similarity index 93%
rename from src/components/auth/LoginPage.tsx
rename to src/components/auth/index.tsx
index fd72d64..b6541a4 100644
--- a/src/components/auth/LoginPage.tsx
+++ b/src/components/auth/index.tsx
@@ -14,20 +14,20 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
import { h, VNode } from "preact";
import { useState } from "preact/hooks";
-import useBackend from "../hooks/useBackend";
+import { useBackend } from "../hooks";
interface Props {
onConfirm?: () => void;
}
-export default function LoginPage({ onConfirm }: Props): VNode {
+export function LoginPage({ onConfirm }: Props): VNode {
const [backend, setBackend] = useBackend()
const [url, setUrl] = useState(backend.url)
const [token, setToken] = useState(backend.token)
@@ -73,7 +73,7 @@ export default function LoginPage({ onConfirm }: Props):
VNode {
</section>
<footer class="modal-card-foot">
<button class="button is-info" onClick={(): void => {
- setBackend({token, url});
+ setBackend({ token, url });
onConfirm && onConfirm();
}} >Confirm</button>
</footer>
diff --git a/src/components/footer/index.tsx b/src/components/footer/index.tsx
index 734bc29..6a31e88 100644
--- a/src/components/footer/index.tsx
+++ b/src/components/footer/index.tsx
@@ -21,7 +21,7 @@
import { h, VNode } from 'preact';
-export default function Footer(): VNode {
+export function Footer(): VNode {
return (
<footer class="footer">
<div class="container-fluid">
diff --git a/src/components/hooks/useLocalStorage.ts
b/src/components/hooks/index.ts
similarity index 70%
rename from src/components/hooks/useLocalStorage.ts
rename to src/components/hooks/index.ts
index 5054e94..267b765 100644
--- a/src/components/hooks/useLocalStorage.ts
+++ b/src/components/hooks/index.ts
@@ -14,12 +14,37 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
import { StateUpdater, useState } from "preact/hooks";
+import { mutate } from 'swr';
+
+interface State {
+ token?: string;
+ url: string;
+}
+
+export function useBackend(): [State, StateUpdater<State>] {
+ const [url, setUrl] = useLocalStorage('backend-url', window.location.origin)
+ const [token, setToken] = useLocalStorage('backend-token')
+
+ const updater: StateUpdater<State> = (value: State | ((value: State) =>
State)) => {
+ const valueToStore = value instanceof Function ? value({ token, url: url
|| window.location.origin }) : value;
+ setUrl(valueToStore.url)
+ setToken(valueToStore.token)
+
+ mutate('/private/instances', null)
+ }
+
+ return [{ token, url: url || window.location.origin }, updater]
+}
+
+export function useLang(): [string, StateUpdater<string>] {
+ return useNotNullLocalStorage('lang-preference', typeof window !==
"undefined" ? navigator.language || (navigator as any).userLanguage : 'en')
+}
export function useLocalStorage(key: string, initialValue?: string): [string |
undefined, StateUpdater<string | undefined>] {
const [storedValue, setStoredValue] = useState<string | undefined>(():
string | undefined => {
@@ -55,7 +80,7 @@ export function useNotNullLocalStorage(key: string,
initialValue: string): [stri
} else {
window.localStorage.setItem(key, valueToStore);
}
- }
+ }
};
return [storedValue, setValue];
diff --git a/src/components/hooks/useBackend.ts
b/src/components/hooks/useBackend.ts
deleted file mode 100644
index 0c034c5..0000000
--- a/src/components/hooks/useBackend.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- This file is part of GNU Taler
- (C) 2021 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/>
- */
-
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
-
-import { StateUpdater } from "preact/hooks";
-import {useLocalStorage} from "./useLocalStorage";
-import { mutate } from 'swr';
-
-interface State {
- token?: string;
- url: string;
-}
-
-export default function useBackend(): [State, StateUpdater<State>] {
- const [url, setUrl] = useLocalStorage('backend-url', window.location.origin)
- const [token, setToken] = useLocalStorage('backend-token')
-
- const updater: StateUpdater<State> = (value:State | ((value: State) =>
State)) => {
- const valueToStore = value instanceof Function ? value({token, url: url ||
window.location.origin}) : value;
- setUrl(valueToStore.url)
- setToken(valueToStore.token)
-
- mutate('/private/instances', null)
- }
-
- return [{token, url: url || window.location.origin}, updater]
-}
diff --git a/src/components/hooks/useLang.ts b/src/components/hooks/useLang.ts
deleted file mode 100644
index e8f9943..0000000
--- a/src/components/hooks/useLang.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- This file is part of GNU Taler
- (C) 2021 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/>
- */
-
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
-
-import { StateUpdater } from "preact/hooks";
-import { useNotNullLocalStorage } from "./useLocalStorage";
-
-export default function useLang(): [string, StateUpdater<string>] {
- return useNotNullLocalStorage('lang-preference', typeof window !==
"undefined" ? navigator.language || (navigator as any).userLanguage : 'en' )
-}
diff --git a/src/components/modal/index.tsx b/src/components/modal/index.tsx
index 2422f72..ec6d681 100644
--- a/src/components/modal/index.tsx
+++ b/src/components/modal/index.tsx
@@ -31,7 +31,7 @@ interface Props {
danger?: boolean;
}
-export default function ConfirmModal({ active, description, onCancel,
onConfirm, children, danger }: Props): VNode {
+export function ConfirmModal({ active, description, onCancel, onConfirm,
children, danger }: Props): VNode {
return <div class={active ? "modal is-active" : "modal"}>
<div class="modal-background " onClick={onCancel} />
<div class="modal-card">
diff --git a/src/components/navbar/index.tsx b/src/components/navbar/index.tsx
index af017e8..626f471 100644
--- a/src/components/navbar/index.tsx
+++ b/src/components/navbar/index.tsx
@@ -14,15 +14,15 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
import { h, VNode } from 'preact';
import { useState } from 'preact/hooks';
-import LoginPage from '../auth/LoginPage';
-import i18n from '../../i18n'
+import { LoginPage } from '../auth';
+import { translations } from '../../i18n'
// TODO: Fix compilation problem
// import * as logo from '../../assets/logo.jpeg';
@@ -31,12 +31,12 @@ interface Props {
setLang: (l: string) => void;
}
-export default function NavigationBar({ lang, setLang }: Props): VNode {
+export function NavigationBar({ lang, setLang }: Props): VNode {
const [showLogin, setShowLogin] = useState(false)
return (<nav class="navbar is-fixed-top" role="navigation" aria-label="main
navigation">
<div class="navbar-brand">
<a class="navbar-item" href="https://taler.net">
- <img src="https://taler.net/static/images/logo-2020.jpg"
style={{height: 50, maxHeight: 50}} />
+ <img src="https://taler.net/static/images/logo-2020.jpg" style={{
height: 50, maxHeight: 50 }} />
</a>
<a role="button" class="navbar-burger" aria-label="menu"
aria-expanded="false" data-target="navbarBasicExample">
@@ -53,7 +53,7 @@ export default function NavigationBar({ lang, setLang }:
Props): VNode {
<div class="control has-icons-left">
<div class="select">
<select onChange={(e): void => setLang(e.currentTarget.value)}>
- {Object.keys(i18n).map(l => <option selected={lang === l}
value={l}>{l}</option>)}
+ {Object.keys(translations).map(l => <option selected={lang ===
l} value={l}>{l}</option>)}
</select>
</div>
<div class="icon is-small is-left">
diff --git a/src/components/notifications/Notifications.stories.tsx
b/src/components/notifications/Notifications.stories.tsx
index 7062700..8d27427 100644
--- a/src/components/notifications/Notifications.stories.tsx
+++ b/src/components/notifications/Notifications.stories.tsx
@@ -14,24 +14,24 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
/* eslint-disable @typescript-eslint/camelcase */
import { h, VNode } from 'preact';
-import Notification from './index'
+import { Notifications } from './index'
export default {
title: 'Components/Notification',
- component: Notification,
+ component: Notifications,
};
export const NotificationInfo = (): VNode => {
return <div>
- <Notification notifications={[{
+ <Notifications notifications={[{
messageId: 'unauthorized',
type: 'INFO',
}]} />
@@ -40,7 +40,7 @@ export const NotificationInfo = (): VNode => {
export const NotificationWarn = (): VNode => {
return <div>
- <Notification notifications={[{
+ <Notifications notifications={[{
messageId: 'unauthorized',
type: 'WARN',
}]} />
@@ -49,7 +49,7 @@ export const NotificationWarn = (): VNode => {
export const NotificationError = (): VNode => {
return <div>
- <Notification notifications={[{
+ <Notifications notifications={[{
messageId: 'unauthorized',
type: 'ERROR',
}]} />
@@ -58,7 +58,7 @@ export const NotificationError = (): VNode => {
export const NotificationSuccess = (): VNode => {
return <div>
- <Notification notifications={[{
+ <Notifications notifications={[{
messageId: 'unauthorized',
type: 'SUCCESS',
}]} />
diff --git a/src/components/notifications/index.tsx
b/src/components/notifications/index.tsx
index a24105c..7c32ed2 100644
--- a/src/components/notifications/index.tsx
+++ b/src/components/notifications/index.tsx
@@ -37,7 +37,7 @@ function messageStyle(type: MessageType): string {
}
}
-export default function Notifications({ notifications }: Props): VNode {
+export function Notifications({ notifications }: Props): VNode {
return <div class="toast">
{notifications.map(n => <article class={messageStyle(n.type)}>
<div class="message-header">
diff --git a/src/components/sidebar/index.tsx b/src/components/sidebar/index.tsx
index f4edef5..42719de 100644
--- a/src/components/sidebar/index.tsx
+++ b/src/components/sidebar/index.tsx
@@ -21,7 +21,7 @@
import { h, VNode } from 'preact';
-export default function Sidebar(): VNode {
+export function Sidebar(): VNode {
return (
<aside class="aside is-placed-left is-expanded">
<div class="aside-tools">
diff --git a/src/components/yup/YupField.tsx b/src/components/yup/YupField.tsx
index a78f800..7c08cda 100644
--- a/src/components/yup/YupField.tsx
+++ b/src/components/yup/YupField.tsx
@@ -14,16 +14,16 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
import { h, VNode } from "preact";
import { Text, useText } from "preact-i18n";
import { useState } from "preact/hooks";
import { useBackendConfig } from "../hooks/backend";
-import useBackend from "../hooks/useBackend";
+import { useBackend } from "../hooks";
import { intervalToDuration, formatDuration } from 'date-fns'
function readableDuration(duration: number): string {
@@ -50,7 +50,7 @@ interface Props2 {
}
-export default function YupField(name: string, field: string, errors: any,
object: any, valueHandler: any, info: any): VNode {
+export function YupField(name: string, field: string, errors: any, object:
any, valueHandler: any, info: any): VNode {
const updateField = (f: string) => (v: string): void => valueHandler((prev:
any) => ({ ...prev, [f]: v }))
const values = {
name, errors,
@@ -202,9 +202,9 @@ function YupInputWithAddon({ name, readonly, value, errors,
onChange, addon, atT
<div class="field-body">
<div class="field">
<div class="field has-addons">
- { !atTheEnd && <div class="control">
+ {!atTheEnd && <div class="control">
<a class="button is-static">{addon}</a>
- </div> }
+ </div>}
<p class="control is-expanded">
<input class={errors[name] ? "input is-danger" : "input"}
type="text"
placeholder={dict.placeholder} readonly={readonly}
@@ -212,9 +212,9 @@ function YupInputWithAddon({ name, readonly, value, errors,
onChange, addon, atT
onChange={(e): void => onChange(e.currentTarget.value)} />
<Text id={`fields.instance.${name}.help`} />
</p>
- { atTheEnd && <div class="control">
+ {atTheEnd && <div class="control">
<a class="button is-static">{addon}</a>
- </div> }
+ </div>}
</div>
{errors[name] ? <p class="help is-danger"><Text
id={`validation.${errors[name].type}`}
fields={errors[name].params}>{errors[name].message}</Text></p> : null}
</div>
diff --git a/src/declaration.d.ts b/src/declaration.d.ts
index 761fcc9..59523f4 100644
--- a/src/declaration.d.ts
+++ b/src/declaration.d.ts
@@ -26,8 +26,8 @@ declare module "*.css" {
export default mapping;
}
declare module "*.jpeg" {
- const value: any;
- export = value;
+ const mapping: Record<string, string>;
+ export default mapping;
}
declare module "*.scss" {
diff --git a/src/i18n/index.ts b/src/i18n/index.ts
index cfca08a..27b9f72 100644
--- a/src/i18n/index.ts
+++ b/src/i18n/index.ts
@@ -19,7 +19,7 @@
* @author Sebastian Javier Marchano (sebasjm)
*/
-export default {
+export const translations = {
es: {
confirm_modal: {
title: 'confirmar accion',
diff --git a/src/index.ts b/src/index.ts
index eb72715..ba2bcac 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -21,6 +21,9 @@
import "./scss/main.scss"
-import App from './routes/index';
+// Automatic code splitting only supports default exports, not named exports:
+// https://github.com/preactjs/preact-cli#route-based-code-splitting
-export default App;
+import PageRouter from './routes/index';
+
+export default PageRouter;
diff --git a/src/routes/dashboard/index.tsx b/src/routes/dashboard/index.tsx
deleted file mode 100644
index 6660006..0000000
--- a/src/routes/dashboard/index.tsx
+++ /dev/null
@@ -1,482 +0,0 @@
-/*
- This file is part of GNU Taler
- (C) 2021 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/>
- */
-
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
-
-import { h, VNode } from 'preact';
-
-export default function BulmaIndex({}): VNode {
- return <div id="page">
- <section class="section is-title-bar">
- <div class="level">
- <div class="level-left">
- <div class="level-item">
- <ul>
- <li>Admin</li>
- <li>Dashboard</li>
- </ul>
- </div>
- </div>
- </div>
- </section>
- <section class="hero is-hero-bar">
- <div class="hero-body">
- <div class="level">
- <div class="level-left">
- <div class="level-item"><h1 class="title">
- Dashboard
- </h1></div>
- </div>
- <div class="level-right" style="display: none;">
- <div class="level-item" />
- </div>
- </div>
- </div>
- </section>
- <section class="section is-main-section">
- <div class="tile is-ancestor">
- <div class="tile is-parent">
- <div class="card tile is-child">
- <div class="card-content">
- <div class="level is-mobile">
- <div class="level-item">
- <div class="is-widget-label"><h3 class="subtitle is-spaced">
- Clients
- </h3>
- <h1 class="title">
- 512
- </h1>
- </div>
- </div>
- <div class="level-item has-widget-icon">
- <div class="is-widget-icon"><span class="icon has-text-primary
is-large"><i
- class="mdi mdi-account-multiple mdi-48px" /></span>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="tile is-parent">
- <div class="card tile is-child">
- <div class="card-content">
- <div class="level is-mobile">
- <div class="level-item">
- <div class="is-widget-label"><h3 class="subtitle is-spaced">
- Sales
- </h3>
- <h1 class="title">
- $7,770
- </h1>
- </div>
- </div>
- <div class="level-item has-widget-icon">
- <div class="is-widget-icon"><span class="icon has-text-info
is-large"><i
- class="mdi mdi-cart-outline mdi-48px" /></span>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="tile is-parent">
- <div class="card tile is-child">
- <div class="card-content">
- <div class="level is-mobile">
- <div class="level-item">
- <div class="is-widget-label"><h3 class="subtitle is-spaced">
- Performance
- </h3>
- <h1 class="title">
- 256%
- </h1>
- </div>
- </div>
- <div class="level-item has-widget-icon">
- <div class="is-widget-icon"><span class="icon has-text-success
is-large"><i
- class="mdi mdi-finance mdi-48px" /></span>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="card">
- <header class="card-header">
- <p class="card-header-title">
- <span class="icon"><i class="mdi mdi-finance" /></span>
- Performance
- </p>
- <a href="#" class="card-header-icon">
- <span class="icon"><i class="mdi mdi-reload" /></span>
- </a>
- </header>
- <div class="card-content">
- <div class="chart-area">
- <div style="height: 100%;">
- <div class="chartjs-size-monitor">
- <div class="chartjs-size-monitor-expand">
- <div />
- </div>
- <div class="chartjs-size-monitor-shrink">
- <div />
- </div>
- </div>
- <canvas id="big-line-chart" width="2992" height="1000"
class="chartjs-render-monitor" style="display: block; height: 400px; width:
1197px;" />
- </div>
- </div>
- </div>
- </div>
- <div class="card has-table has-mobile-sort-spaced">
- <header class="card-header">
- <p class="card-header-title">
- <span class="icon"><i class="mdi mdi-account-multiple" /></span>
- Clients
- </p>
- <a href="#" class="card-header-icon">
- <span class="icon"><i class="mdi mdi-reload" /></span>
- </a>
- </header>
- <div class="card-content">
- <div class="b-table has-pagination">
- <div class="table-wrapper has-mobile-cards">
- <table class="table is-fullwidth is-striped is-hoverable
is-sortable is-fullwidth">
- <thead>
- <tr>
- <th />
- <th>Name</th>
- <th>Company</th>
- <th>City</th>
- <th>Progress</th>
- <th>Created</th>
- <th />
- </tr>
- </thead>
- <tbody>
- <tr>
- <td class="is-image-cell">
- <div class="image">
- <img
src="https://avatars.dicebear.com/4.5/api/male/rebecca-bauch.svg"
class="is-rounded" />
- </div>
- </td>
- <td>Rebecca Bauch</td>
- <td>Daugherty-Daniel</td>
- <td>South Cory</td>
- <td class="is-progress-cell">
- <progress max="100" class="progress is-small is-primary"
value="79">79</progress>
- </td>
- <td>
- <small class="has-text-grey is-abbr-like" title="Oct 25,
2020">Oct 25, 2020</small>
- </td>
- <td class="is-actions-cell">
- <div class="buttons is-right">
- <button class="button is-small is-primary" type="button">
- <span class="icon"><i class="mdi mdi-eye" /></span>
- </button>
- <button class="button is-small is-danger jb-modal"
type="button">
- <span class="icon"><i class="mdi mdi-trash-can" /></span>
- </button>
- </div>
- </td>
- </tr>
- <tr>
- <td class="is-image-cell">
- <div class="image">
- <img
src="https://avatars.dicebear.com/4.5/api/male/felicita-yundt.svg"
class="is-rounded" />
- </div>
- </td>
- <td>Felicita Yundt</td>
- <td>Johns-Weissnat</td>
- <td>East Ariel</td>
- <td class="is-progress-cell">
- <progress max="100" class="progress is-small is-primary"
value="67">67</progress>
- </td>
- <td>
- <small class="has-text-grey is-abbr-like" title="Jan 8,
2020">Jan 8, 2020</small>
- </td>
- <td class="is-actions-cell">
- <div class="buttons is-right">
- <button class="button is-small is-primary" type="button">
- <span class="icon"><i class="mdi mdi-eye" /></span>
- </button>
- <button class="button is-small is-danger jb-modal"
type="button">
- <span class="icon"><i class="mdi mdi-trash-can" /></span>
- </button>
- </div>
- </td>
- </tr>
- <tr>
- <td class="is-image-cell">
- <div class="image">
- <img
src="https://avatars.dicebear.com/4.5/api/male/mr-larry-satterfield-v.svg"
class="is-rounded" />
- </div>
- </td>
- <td>Mr. Larry Satterfield V</td>
- <td>Hyatt Ltd</td>
- <td>Windlerburgh</td>
- <td class="is-progress-cell">
- <progress max="100" class="progress is-small is-primary"
value="16">16</progress>
- </td>
- <td>
- <small class="has-text-grey is-abbr-like" title="Dec 18,
2020">Dec 18, 2020</small>
- </td>
- <td class="is-actions-cell">
- <div class="buttons is-right">
- <button class="button is-small is-primary" type="button">
- <span class="icon"><i class="mdi mdi-eye" /></span>
- </button>
- <button class="button is-small is-danger jb-modal"
type="button">
- <span class="icon"><i class="mdi mdi-trash-can" /></span>
- </button>
- </div>
- </td>
- </tr>
- <tr>
- <td class="is-image-cell">
- <div class="image">
- <img
src="https://avatars.dicebear.com/4.5/api/male/mr-broderick-kub.svg"
class="is-rounded" />
- </div>
- </td>
- <td>Mr. Broderick Kub</td>
- <td>Kshlerin, Bauch and Ernser</td>
- <td>New Kirstenport</td>
- <td class="is-progress-cell">
- <progress max="100" class="progress is-small is-primary"
value="71">71</progress>
- </td>
- <td>
- <small class="has-text-grey is-abbr-like" title="Sep 13,
2020">Sep 13, 2020</small>
- </td>
- <td class="is-actions-cell">
- <div class="buttons is-right">
- <button class="button is-small is-primary" type="button">
- <span class="icon"><i class="mdi mdi-eye" /></span>
- </button>
- <button class="button is-small is-danger jb-modal"
type="button">
- <span class="icon"><i class="mdi mdi-trash-can" /></span>
- </button>
- </div>
- </td>
- </tr>
- <tr>
- <td class="is-image-cell">
- <div class="image">
- <img
src="https://avatars.dicebear.com/4.5/api/male/barry-weber.svg"
class="is-rounded" />
- </div>
- </td>
- <td>Barry Weber</td>
- <td>Schulist, Mosciski and Heidenreich</td>
- <td>East Violettestad</td>
- <td class="is-progress-cell">
- <progress max="100" class="progress is-small is-primary"
value="80">80</progress>
- </td>
- <td>
- <small class="has-text-grey is-abbr-like" title="Jul 24,
2020">Jul 24, 2020</small>
- </td>
- <td class="is-actions-cell">
- <div class="buttons is-right">
- <button class="button is-small is-primary" type="button">
- <span class="icon"><i class="mdi mdi-eye" /></span>
- </button>
- <button class="button is-small is-danger jb-modal"
type="button">
- <span class="icon"><i class="mdi mdi-trash-can" /></span>
- </button>
- </div>
- </td>
- </tr>
- <tr>
- <td class="is-image-cell">
- <div class="image">
- <img
src="https://avatars.dicebear.com/4.5/api/male/bert-kautzer-md.svg"
class="is-rounded" />
- </div>
- </td>
- <td>Bert Kautzer MD</td>
- <td>Gerhold and Sons</td>
- <td>Mayeport</td>
- <td class="is-progress-cell">
- <progress max="100" class="progress is-small is-primary"
value="62">62</progress>
- </td>
- <td>
- <small class="has-text-grey is-abbr-like" title="Mar 30,
2020">Mar 30, 2020</small>
- </td>
- <td class="is-actions-cell">
- <div class="buttons is-right">
- <button class="button is-small is-primary" type="button">
- <span class="icon"><i class="mdi mdi-eye" /></span>
- </button>
- <button class="button is-small is-danger jb-modal"
type="button">
- <span class="icon"><i class="mdi mdi-trash-can" /></span>
- </button>
- </div>
- </td>
- </tr>
- <tr>
- <td class="is-image-cell">
- <div class="image">
- <img
src="https://avatars.dicebear.com/4.5/api/male/lonzo-steuber.svg"
class="is-rounded" />
- </div>
- </td>
- <td>Lonzo Steuber</td>
- <td>Skiles Ltd</td>
- <td>Marilouville</td>
- <td class="is-progress-cell">
- <progress max="100" class="progress is-small is-primary"
value="17">17</progress>
- </td>
- <td>
- <small class="has-text-grey is-abbr-like" title="Feb 12,
2020">Feb 12, 2020</small>
- </td>
- <td class="is-actions-cell">
- <div class="buttons is-right">
- <button class="button is-small is-primary" type="button">
- <span class="icon"><i class="mdi mdi-eye" /></span>
- </button>
- <button class="button is-small is-danger jb-modal"
type="button">
- <span class="icon"><i class="mdi mdi-trash-can" /></span>
- </button>
- </div>
- </td>
- </tr>
- <tr>
- <td class="is-image-cell">
- <div class="image">
- <img
src="https://avatars.dicebear.com/4.5/api/male/jonathon-hahn.svg"
class="is-rounded" />
- </div>
- </td>
- <td>Jonathon Hahn</td>
- <td>Flatley Ltd</td>
- <td>Billiemouth</td>
- <td class="is-progress-cell">
- <progress max="100" class="progress is-small is-primary"
value="74">74</progress>
- </td>
- <td>
- <small class="has-text-grey is-abbr-like" title="Dec 30,
2020">Dec 30, 2020</small>
- </td>
- <td class="is-actions-cell">
- <div class="buttons is-right">
- <button class="button is-small is-primary" type="button">
- <span class="icon"><i class="mdi mdi-eye" /></span>
- </button>
- <button class="button is-small is-danger jb-modal"
type="button">
- <span class="icon"><i class="mdi mdi-trash-can" /></span>
- </button>
- </div>
- </td>
- </tr>
- <tr>
- <td class="is-image-cell">
- <div class="image">
- <img
src="https://avatars.dicebear.com/4.5/api/male/ryley-wuckert.svg"
class="is-rounded" />
- </div>
- </td>
- <td>Ryley Wuckert</td>
- <td>Heller-Little</td>
- <td>Emeraldtown</td>
- <td class="is-progress-cell">
- <progress max="100" class="progress is-small is-primary"
value="54">54</progress>
- </td>
- <td>
- <small class="has-text-grey is-abbr-like" title="Jun 28,
2020">Jun 28, 2020</small>
- </td>
- <td class="is-actions-cell">
- <div class="buttons is-right">
- <button class="button is-small is-primary" type="button">
- <span class="icon"><i class="mdi mdi-eye" /></span>
- </button>
- <button class="button is-small is-danger jb-modal"
type="button">
- <span class="icon"><i class="mdi mdi-trash-can" /></span>
- </button>
- </div>
- </td>
- </tr>
- <tr>
- <td class="is-image-cell">
- <div class="image">
- <img
src="https://avatars.dicebear.com/4.5/api/male/sienna-hayes.svg"
class="is-rounded" />
- </div>
- </td>
- <td>Sienna Hayes</td>
- <td>Conn, Jerde and Douglas</td>
- <td>Jonathanfort</td>
- <td class="is-progress-cell">
- <progress max="100" class="progress is-small is-primary"
value="55">55</progress>
- </td>
- <td>
- <small class="has-text-grey is-abbr-like" title="Mar 7,
2020">Mar 7, 2020</small>
- </td>
- <td class="is-actions-cell">
- <div class="buttons is-right">
- <button class="button is-small is-primary" type="button">
- <span class="icon"><i class="mdi mdi-eye" /></span>
- </button>
- <button class="button is-small is-danger jb-modal"
type="button">
- <span class="icon"><i class="mdi mdi-trash-can" /></span>
- </button>
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- </div>
- <div class="notification">
- <div class="level">
- <div class="level-left">
- <div class="level-item">
- <div class="buttons has-addons">
- <button type="button" class="button is-active">1</button>
- <button type="button" class="button">2</button>
- <button type="button" class="button">3</button>
- </div>
- </div>
- </div>
- <div class="level-right">
- <div class="level-item">
- <small>Page 1 of 3</small>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </section>
-</div>
-
-}
-
-/**
- * <div id="sample-modal" class="modal">
- <div class="modal-background jb-modal-close"></div>
- <div class="modal-card">
- <header class="modal-card-head">
- <p class="modal-card-title">Confirm action</p>
- <button class="delete jb-modal-close" aria-label="close"></button>
- </header>
- <section class="modal-card-body">
- <p>This will permanently delete <b>Some Object</b></p>
- <p>This is sample modal</p>
- </section>
- <footer class="modal-card-foot">
- <button class="button jb-modal-close">Cancel</button>
- <button class="button is-danger jb-modal-close">Delete</button>
- </footer>
- </div>
- <button class="modal-close is-large jb-modal-close"
aria-label="close"></button>
-</div>
-
- */
\ No newline at end of file
diff --git a/src/routes/forms/index.tsx b/src/routes/forms/index.tsx
deleted file mode 100644
index a93cb16..0000000
--- a/src/routes/forms/index.tsx
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- This file is part of GNU Taler
- (C) 2021 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/>
- */
-
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
-
-import { h, VNode } from 'preact';
-
-export default function BulmaForms({}): VNode {
- return <div id="page">
- <section class="section is-title-bar">
- <div class="level">
- <div class="level-left">
- <div class="level-item">
- <ul>
- <li>Admin</li>
- <li>Forms</li>
- </ul>
- </div>
- </div>
- </div>
- </section>
- <section class="hero is-hero-bar">
- <div class="hero-body">
- <div class="level">
- <div class="level-left">
- <div class="level-item"><h1 class="title">
- Forms
- </h1></div>
- </div>
- <div class="level-right" style="display: none;">
- <div class="level-item" />
- </div>
- </div>
- </div>
- </section>
- <section class="section is-main-section">
- <div class="card">
- <header class="card-header">
- <p class="card-header-title">
- <span class="icon"><i class="mdi mdi-ballot" /></span>
- Forms
- </p>
- </header>
- <div class="card-content">
- <form method="get">
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">From</label>
- </div>
- <div class="field-body">
- <div class="field">
- <p class="control is-expanded has-icons-left">
- <input class="input" type="text" placeholder="Name" />
- <span class="icon is-small is-left"><i class="mdi
mdi-account" /></span>
- </p>
- </div>
- <div class="field">
- <p class="control is-expanded has-icons-left has-icons-right">
- <input class="input is-success" type="email"
placeholder="Email" value="alex@smith.com" />
- <span class="icon is-small is-left"><i class="mdi mdi-mail"
/></span>
- <span class="icon is-small is-right"><i class="mdi
mdi-check" /></span>
- </p>
- </div>
- </div>
- </div>
- <div class="field is-horizontal">
- <div class="field-label" />
- <div class="field-body">
- <div class="field is-expanded">
- <div class="field has-addons">
- <p class="control">
- <a class="button is-static">
- +44
- </a>
- </p>
- <p class="control is-expanded">
- <input class="input" type="tel" placeholder="Your phone
number" />
- </p>
- </div>
- <p class="help">Do not enter the first zero</p>
- </div>
- </div>
- </div>
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">Department</label>
- </div>
- <div class="field-body">
- <div class="field is-narrow">
- <div class="control">
- <div class="select is-fullwidth">
- <select>
- <option>Business development</option>
- <option>Marketing</option>
- <option>Sales</option>
- </select>
- </div>
- </div>
- </div>
- </div>
- </div>
- <hr />
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">Subject</label>
- </div>
- <div class="field-body">
- <div class="field">
- <div class="control">
- <input class="input is-danger" type="text" placeholder="e.g.
Partnership opportunity" />
- </div>
- <p class="help is-danger">
- This field is required
- </p>
- </div>
- </div>
- </div>
-
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">Question</label>
- </div>
- <div class="field-body">
- <div class="field">
- <div class="control">
- <textarea class="textarea" placeholder="Explain how we can
help you" />
- </div>
- </div>
- </div>
- </div>
- <hr />
- <div class="field is-horizontal">
- <div class="field-label">
- {/* Left empty for spacing */}
- </div>
- <div class="field-body">
- <div class="field">
- <div class="field is-grouped">
- <div class="control">
- <button type="submit" class="button is-primary">
- <span>Submit</span>
- </button>
- </div>
- <div class="control">
- <button type="button" class="button is-primary
is-outlined">
- <span>Reset</span>
- </button>
- </div>
- </div>
- </div>
- </div>
- </div>
- </form>
- </div>
- </div>
- <div class="card">
- <header class="card-header">
- <p class="card-header-title">
- <span class="icon"><i class="mdi mdi-ballot-outline default"
/></span>
- Custom elements
- </p>
- </header>
- <div class="card-content">
- <div class="field has-check is-horizontal">
- <div class="field-label"><label class="label">Checkbox</label></div>
- <div class="field-body">
- <div class="field">
- <div class="field is-grouped-multiline is-grouped">
- <div class="control">
- <label class="b-checkbox checkbox"><input type="checkbox"
value="lorem" />
- <span class="check is-primary" />
- <span class="control-label">Lorem</span>
- </label>
- </div>
- <div class="control">
- <label class="b-checkbox checkbox"><input type="checkbox"
value="ipsum" />
- <span class="check is-primary" />
- <span class="control-label">Ipsum</span>
- </label>
- </div>
- <div class="control">
- <label class="b-checkbox checkbox"><input type="checkbox"
value="dolore" />
- <span class="check is-primary" />
- <span class="control-label">Dolore</span>
- </label>
- </div>
- </div>
- </div>
- </div>
- </div>
- <hr />
- <div class="field has-check is-horizontal">
- <div class="field-label"><label class="label">Radio</label></div>
- <div class="field-body">
- <div class="field">
- <div class="field is-grouped-multiline is-grouped">
- <div class="control"><label class="b-radio radio"><input
type="radio" name="sample-radio" value="one" />
- <span class="check" />
- <span class="control-label">One</span>
- </label></div>
- <div class="control"><label class="b-radio radio"><input
type="radio" name="sample-radio" value="two" />
- <span class="check" />
- <span class="control-label">Two</span>
- </label>
- </div>
- </div>
- </div>
- </div>
- </div>
- <hr />
- <div class="field is-horizontal">
- <div class="field-label"><label class="label">Switch</label></div>
- <div class="field-body">
- <div class="field">
- <label class="switch is-rounded"><input type="checkbox"
value="false" />
- <span class="check" />
- <span class="control-label">Default</span>
- </label>
- </div>
- </div>
- </div>
- <hr />
- <div class="field is-horizontal">
- <div class="field-label is-normal"><label
class="label">File</label></div>
- <div class="field-body">
- <div class="field">
- <div class="field file">
- <label class="upload control">
- <a class="button is-primary">
- <span class="icon"><i class="mdi mdi-upload" /></span>
- <span>Pick a file</span>
- </a>
- <input type="file" />
- </label>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </section>
-
-
- {/* <div id="sample-modal" class="modal">
- <div class="modal-background jb-modal-close" />
- <div class="modal-card">
- <header class="modal-card-head">
- <p class="modal-card-title">Confirm action</p>
- <button class="delete jb-modal-close" aria-label="close" />
- </header>
- <section class="modal-card-body">
- <p>This will permanently delete <b>Some Object</b></p>
- <p>This is sample modal</p>
- </section>
- <footer class="modal-card-foot">
- <button class="button jb-modal-close">Cancel</button>
- <button class="button is-danger jb-modal-close">Delete</button>
- </footer>
- </div>
- <button class="modal-close is-large jb-modal-close" aria-label="close" />
- </div> */}
-</div>
-}
\ No newline at end of file
diff --git a/src/routes/home/index.tsx b/src/routes/home/index.tsx
deleted file mode 100644
index 06d387b..0000000
--- a/src/routes/home/index.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- This file is part of GNU Taler
- (C) 2021 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/>
- */
-
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
-
-import { FunctionalComponent, h } from 'preact';
-const Home: FunctionalComponent = () => {
- return (
- <div>
- <h1 class="title">Bulma</h1>
-
- <p class="subtitle">
- Modern CSS framework based on <a
href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox">Flexbox</a>
- </p>
-
- <div class="field">
- <div class="control">
- <input class="input" type="text" placeholder="Input" />
- </div>
- </div>
-
- <div class="field">
- <p class="control">
- <span class="select">
- <select>
- <option>Select dropdown</option>
- </select>
- </span>
- </p>
- </div>
-
- <div class="container">
- <div class="notification is-primary">
- This container is <strong>centered</strong> on desktop and
larger viewports.
- </div>
- </div>
- <div class="buttons">
- <a class="button is-primary">Primary</a>
- <a class="button is-link">Link</a>
- </div>
- </div>
- );
-};
-
-export default Home;
diff --git a/src/routes/index.tsx b/src/routes/index.tsx
index f9f398d..1919888 100644
--- a/src/routes/index.tsx
+++ b/src/routes/index.tsx
@@ -14,38 +14,37 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
import { h, VNode } from 'preact';
import { Route, Router } from 'preact-router';
import { IntlProvider } from 'preact-i18n';
-
+import { Footer } from '../components/footer';
+import { Sidebar } from '../components/sidebar';
import NotFoundPage from './notfound';
import Instances from './instances';
-import Footer from '../components/footer';
-import Sidebar from '../components/sidebar';
-import NavigationBar from '../components/navbar';
-import Notifications from '../components/notifications';
+import { NavigationBar } from '../components/navbar';
+import { Notifications } from '../components/notifications';
import { useNotifications } from '../hooks/notifications';
-import i18n from '../i18n';
-import useLang from '../components/hooks/useLang';
+import { translations } from '../i18n';
+import { useLang } from '../components/hooks';
export default function PageRouter(): VNode {
const { notifications, pushNotification } = useNotifications()
const [lang, setLang] = useLang()
return (
- <IntlProvider definition={(i18n as any)[lang] || i18n.en }>
+ <IntlProvider definition={(translations as any)[lang] || translations.en}>
<div id="app">
<NavigationBar lang={lang} setLang={setLang} />
<Sidebar />
<Notifications notifications={notifications} />
<Router>
<Route path="/" component={Instances}
pushNotification={pushNotification} />
- <NotFoundPage default />
+ <NotFoundPage />
</Router>
<Footer />
</div>
diff --git a/src/routes/instances/CardTable.tsx
b/src/routes/instances/CardTable.tsx
index db7b0eb..2a4e9d5 100644
--- a/src/routes/instances/CardTable.tsx
+++ b/src/routes/instances/CardTable.tsx
@@ -14,17 +14,17 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
import { h, VNode } from "preact";
import { Text } from "preact-i18n";
import { useEffect, useState } from "preact/hooks";
import { MerchantBackend, WidthId as WithId } from "../../declaration";
-import EmptyTable from "./EmptyTable";
-import Table from "./Table";
+import { EmptyTable } from "./EmptyTable";
+import { Table } from "./Table";
interface Props {
instances: MerchantBackend.Instances.Instance[];
@@ -48,7 +48,7 @@ function buildActions(intances:
MerchantBackend.Instances.Instance[], selected:
.map(id => ({ element: id, type: action }))
}
-export default function CardTable({ instances, onCreate, onSelect, selected }:
Props): VNode {
+export function CardTable({ instances, onCreate, onSelect, selected }: Props):
VNode {
const [actionQueue, actionQueueHandler] = useState<Actions[]>([]);
const [rowSelection, rowSelectionHandler] = useState<string[]>([])
diff --git a/src/routes/instances/Create.stories.tsx
b/src/routes/instances/Create.stories.tsx
index 2fcd25d..78de2f2 100644
--- a/src/routes/instances/Create.stories.tsx
+++ b/src/routes/instances/Create.stories.tsx
@@ -21,12 +21,12 @@
/* eslint-disable @typescript-eslint/camelcase */
import { h, VNode } from 'preact';
-import Create from './Create'
+import {CreatePage} from './CreatePage'
export default {
title: 'Instances/CreateModal',
- component: Create,
+ component: CreatePage,
argTypes: {
element: { control: 'object' },
onCancel: { action: 'onCancel' },
@@ -34,4 +34,4 @@ export default {
}
};
-export const Example = (a: any): VNode => <Create {...a} />;
+export const Example = (a: any): VNode => <CreatePage {...a} />;
diff --git a/src/routes/instances/Create.tsx
b/src/routes/instances/CreatePage.tsx
similarity index 94%
rename from src/routes/instances/Create.tsx
rename to src/routes/instances/CreatePage.tsx
index 801ce43..ba32100 100644
--- a/src/routes/instances/Create.tsx
+++ b/src/routes/instances/CreatePage.tsx
@@ -14,16 +14,16 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
import { h, VNode } from "preact";
import { useState } from "preact/hooks";
import { MerchantBackend } from "../../declaration";
import * as yup from 'yup';
-import YupField from "../../components/yup/YupField"
+import { YupField } from "../../components/yup/YupField"
import { InstanceCreateSchema as schema } from '../../schemas'
import { Text } from "preact-i18n";
@@ -38,14 +38,14 @@ interface KeyValue {
}
function with_defaults():
Partial<MerchantBackend.Instances.InstanceConfigurationMessage> {
- return {
+ return {
default_pay_delay: { d_ms: 1000 },
default_wire_fee_amortization: 10,
default_wire_transfer_delay: { d_ms: 2000 },
};
}
-export default function CreateModal({ onCreate, isLoading, goBack }: Props):
VNode {
+export function CreatePage({ onCreate, isLoading, goBack }: Props): VNode {
const [value, valueHandler] = useState(with_defaults())
const [errors, setErrors] = useState<KeyValue>({})
diff --git a/src/routes/instances/DeleteModal.tsx
b/src/routes/instances/DeleteModal.tsx
index af64922..a682d12 100644
--- a/src/routes/instances/DeleteModal.tsx
+++ b/src/routes/instances/DeleteModal.tsx
@@ -14,14 +14,14 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
import { h, VNode } from "preact";
import { MerchantBackend, WidthId } from "../../declaration";
-import ConfirmModal from "../../components/modal";
+import { ConfirmModal } from "../../components/modal";
interface Props {
element: MerchantBackend.Instances.QueryInstancesResponse & WidthId;
@@ -29,7 +29,7 @@ interface Props {
onConfirm: (i: MerchantBackend.Instances.QueryInstancesResponse & WidthId)
=> void;
}
-export default function DeleteModal({ element, onCancel, onConfirm }: Props):
VNode {
+export function DeleteModal({ element, onCancel, onConfirm }: Props): VNode {
return <ConfirmModal description="delete_instance" danger active
onCancel={onCancel} onConfirm={() => onConfirm(element)}>
<p>This will permanently delete instance "{element.name}" with id
<b>{element.id}</b></p>
<p>Please confirm this action</p>
diff --git a/src/routes/instances/EmptyTable.tsx
b/src/routes/instances/EmptyTable.tsx
index d7b7357..5a0af48 100644
--- a/src/routes/instances/EmptyTable.tsx
+++ b/src/routes/instances/EmptyTable.tsx
@@ -22,7 +22,7 @@
import { h, VNode } from "preact";
import { Text } from "preact-i18n";
-export default function EmptyTable(): VNode {
+export function EmptyTable(): VNode {
return <div class="content has-text-grey has-text-centered">
<p>
<span class="icon is-large"><i class="mdi mdi-emoticon-sad mdi-48px"
/></span>
diff --git a/src/routes/instances/Table.tsx b/src/routes/instances/Table.tsx
index 045ff17..4faf6b5 100644
--- a/src/routes/instances/Table.tsx
+++ b/src/routes/instances/Table.tsx
@@ -35,7 +35,7 @@ function toggleSelected<T>(id: T): (prev: T[]) => T[] {
return (prev: T[]): T[] => prev.indexOf(id) == -1 ? [...prev, id] :
prev.filter(e => e != id)
}
-export default function Table({ rowSelection, rowSelectionHandler, instances,
onSelect }: Props): VNode {
+export function Table({ rowSelection, rowSelectionHandler, instances, onSelect
}: Props): VNode {
return (
<table class="table is-fullwidth is-striped is-hoverable is-fullwidth">
<thead>
diff --git a/src/routes/instances/UpdateModal.stories.tsx
b/src/routes/instances/UpdateModal.stories.tsx
deleted file mode 100644
index 67d73b7..0000000
--- a/src/routes/instances/UpdateModal.stories.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- This file is part of GNU Taler
- (C) 2021 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/>
- */
-
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
-
-/* eslint-disable @typescript-eslint/camelcase */
-import { h, VNode } from 'preact';
-import UpdateModal from './UpdateModal'
-
-
-export default {
- title: 'Instances/UpdateModal',
- component: UpdateModal,
- argTypes: {
- element: { control: 'object' },
- onCancel: { action: 'onCancel' },
- onConfirm: { action: 'onConfirm' },
- }
-};
-
-export const WithDefaultInstance = (a: any): VNode => <UpdateModal {...a} />;
-WithDefaultInstance.args = {
- element: {
- id: 'default',
- name: 'update',
- merchant_pub: 'abcdef',
- payment_targets: ['qwe','asd']
- }
-}
diff --git a/src/routes/instances/UpdateModal.tsx
b/src/routes/instances/UpdateModal.tsx
deleted file mode 100644
index 458d224..0000000
--- a/src/routes/instances/UpdateModal.tsx
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- This file is part of GNU Taler
- (C) 2021 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/>
- */
-
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
-
-import { h, VNode } from "preact";
-import { useState } from "preact/hooks";
-import { KeyValue, MerchantBackend } from "../../declaration";
-import * as yup from 'yup';
-import ConfirmModal from '../../components/modal'
-import YupField from "../../components/yup/YupField";
-import { InstanceUpdateSchema as schema } from '../../schemas'
-
-interface Props {
- element: MerchantBackend.Instances.QueryInstancesResponse | null;
- onCancel: () => void;
- onConfirm: (i: MerchantBackend.Instances.InstanceReconfigurationMessage) =>
void;
-}
-
-export default function UpdateModal({ element, onCancel, onConfirm }: Props):
VNode {
- const copy: any = !element ? {} : Object.keys(schema.fields).reduce((prev,
cur) => ({ ...prev, [cur]: (element as any)[cur] }), {})
-
- const [value, valueHandler] = useState(copy)
- const [errors, setErrors] = useState<KeyValue>({})
-
- const submit = (): void => {
- try {
- schema.validateSync(value, { abortEarly: false })
-
- onConfirm(schema.cast(value) as
MerchantBackend.Instances.InstanceReconfigurationMessage);
- } catch (err) {
- const errors = err.inner as yup.ValidationError[]
- const pathMessages = errors.reduce((prev, cur) => !cur.path ? prev : ({
...prev, [cur.path]: { type: cur.type, params: cur.params, message: cur.message
} }), {})
- setErrors(pathMessages)
- }
- }
-
- return <ConfirmModal description="update_instance" active={element != null}
onConfirm={submit} onCancel={onCancel}>
- {Object.keys(schema.fields).map(f => YupField(f, f, errors, value,
valueHandler, schema.fields[f].describe()))}
- </ConfirmModal>
-}
\ No newline at end of file
diff --git a/src/routes/instances/Update.tsx
b/src/routes/instances/UpdatePage.tsx
similarity index 90%
rename from src/routes/instances/Update.tsx
rename to src/routes/instances/UpdatePage.tsx
index 8a64a89..fc62337 100644
--- a/src/routes/instances/Update.tsx
+++ b/src/routes/instances/UpdatePage.tsx
@@ -14,16 +14,16 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
import { h, VNode } from "preact";
import { useState } from "preact/hooks";
import { MerchantBackend, WidthId } from "../../declaration";
import * as yup from 'yup';
-import YupField from "../../components/yup/YupField"
+import { YupField } from "../../components/yup/YupField"
import { InstanceUpdateSchema as schema } from '../../schemas'
import { Text } from "preact-i18n";
@@ -39,17 +39,17 @@ interface KeyValue {
}
function convert(from: MerchantBackend.Instances.QueryInstancesResponse):
MerchantBackend.Instances.InstanceReconfigurationMessage {
- const { accounts, ...rest} = from
+ const { accounts, ...rest } = from
const payto_uris = accounts.filter(a => a.active).map(a => a.payto_uri)
- const defaults = {
+ const defaults = {
default_wire_fee_amortization: 1,
- default_pay_delay: { d_ms: 1000*60*60 }, //one hour
- default_wire_transfer_delay: { d_ms: 1000*60*60*2 }, //two hours
+ default_pay_delay: { d_ms: 1000 * 60 * 60 }, //one hour
+ default_wire_transfer_delay: { d_ms: 1000 * 60 * 60 * 2 }, //two hours
}
return { ...defaults, ...rest, payto_uris };
}
-export default function UpdateModal({ onUpdate, isLoading, selected, goBack }:
Props): VNode {
+export function UpdatePage({ onUpdate, isLoading, selected, goBack }: Props):
VNode {
const [value, valueHandler] = useState(convert(selected))
const [errors, setErrors] = useState<KeyValue>({})
diff --git a/src/routes/instances/View.stories.tsx
b/src/routes/instances/View.stories.tsx
index 9d3deef..7871464 100644
--- a/src/routes/instances/View.stories.tsx
+++ b/src/routes/instances/View.stories.tsx
@@ -14,14 +14,14 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
/* eslint-disable @typescript-eslint/camelcase */
import { h } from 'preact';
-import View from './View'
+import { View } from './View'
export default {
@@ -54,30 +54,30 @@ WithFiveInstance.args = {
name: 'the first instance',
merchant_pub: 'abcdefgh',
payment_targets: ['asd']
- },{
+ }, {
id: 'second',
name: 'the second instance',
merchant_pub: 'zxczxcz',
payment_targets: ['asd']
- },{
+ }, {
id: 'third',
name: 'the third instance',
merchant_pub: 'QWEQWEWQE',
payment_targets: ['asd']
- },{
+ }, {
id: 'other',
name: 'the other instance',
merchant_pub: 'FHJHGJGHJ',
payment_targets: ['asd']
- },{
+ }, {
id: 'another',
name: 'the another instance',
merchant_pub: 'abcd3423423efgh',
payment_targets: ['asd']
- },{
+ }, {
id: 'last',
name: 'last instance',
merchant_pub: 'zxcvvbnm',
- payment_targets: ['pay-to','asd']
+ payment_targets: ['pay-to', 'asd']
}]
}
diff --git a/src/routes/instances/View.tsx b/src/routes/instances/View.tsx
index 8c894dc..438e54f 100644
--- a/src/routes/instances/View.tsx
+++ b/src/routes/instances/View.tsx
@@ -14,16 +14,16 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
import { h, VNode } from "preact";
import { useState } from "preact/hooks";
import { MerchantBackend, WidthId } from "../../declaration";
-import Table from './CardTable';
-import DeleteModal from './DeleteModal'
+import { CardTable } from './CardTable';
+import { DeleteModal } from './DeleteModal'
import { Text } from "preact-i18n";
interface Props {
@@ -36,7 +36,7 @@ interface Props {
isLoading: boolean;
}
-export default function View({ instances, isLoading, onCreate, onDelete,
onSelect, onUpdate, selected }: Props): VNode {
+export function View({ instances, isLoading, onCreate, onDelete, onSelect,
onUpdate, selected }: Props): VNode {
const [action, setAction] = useState<'UPDATE' | 'DELETE' | null>(null)
const onSelectAction = (id: string | null, action?: 'UPDATE' | 'DELETE'):
void => {
@@ -77,7 +77,7 @@ export default function View({ instances, isLoading,
onCreate, onDelete, onSelec
</div>
</section>
<section class="section is-main-section">
- <Table instances={instances} onSelect={onSelectAction}
selected={selected} onCreate={(): void => onCreate(true)} />
+ <CardTable instances={instances} onSelect={onSelectAction}
selected={selected} onCreate={(): void => onCreate(true)} />
</section>
{selected && action === 'DELETE' ?
diff --git a/src/routes/instances/index.tsx b/src/routes/instances/index.tsx
index 8fdfa89..4715424 100644
--- a/src/routes/instances/index.tsx
+++ b/src/routes/instances/index.tsx
@@ -14,19 +14,19 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
import { h, VNode } from 'preact';
-import View from './View';
-import LoginPage from '../../components/auth/LoginPage';
+import { View } from './View';
+import { LoginPage } from '../../components/auth';
import { useBackendInstance, useBackendInstances } from
'../../components/hooks/backend';
import { useEffect, useState } from 'preact/hooks';
import { Notification } from '../../declaration';
-import CreatePage from './Create';
-import UpdatePage from './Update';
+import { CreatePage } from './CreatePage';
+import { UpdatePage } from './UpdatePage';
interface Props {
pushNotification: (n: Notification) => void;
@@ -50,7 +50,7 @@ export default function Instances({ pushNotification }:
Props): VNode {
if (requiresToken) {
pushNotification({ messageId: 'unauthorized', type: 'ERROR' })
} else if (genericError) {
- pushNotification({messageId: 'error', params: genericError, type:
'ERROR'})
+ pushNotification({ messageId: 'error', params: genericError, type:
'ERROR' })
}
}, [requiresToken, genericError])
@@ -60,8 +60,8 @@ export default function Instances({ pushNotification }:
Props): VNode {
}
if (create) {
- return <CreatePage
- goBack={() => setCreate(false)}
+ return <CreatePage
+ goBack={() => setCreate(false)}
isLoading={false}
onCreate={(d): Promise<void> => list.create(d)
@@ -72,8 +72,8 @@ export default function Instances({ pushNotification }:
Props): VNode {
}
if (update && details.data && selectedId) {
- return <UpdatePage
- goBack={() => setUpdate(false)}
+ return <UpdatePage
+ goBack={() => setUpdate(false)}
isLoading={false}
selected={{ ...details.data, id: selectedId }}
onUpdate={(id, d): Promise<void> => details.update(id, d)
diff --git a/src/routes/notfound/index.tsx b/src/routes/notfound/index.tsx
index cbf0e7c..10c3fac 100644
--- a/src/routes/notfound/index.tsx
+++ b/src/routes/notfound/index.tsx
@@ -19,10 +19,10 @@
* @author Sebastian Javier Marchano (sebasjm)
*/
-import { FunctionalComponent, h } from 'preact';
+import { h, VNode } from 'preact';
import { Link } from 'preact-router/match';
-const Notfound: FunctionalComponent = () => {
+export default function NotFoundPage(): VNode {
return (
<div>
<h1>Error 404</h1>
@@ -32,6 +32,5 @@ const Notfound: FunctionalComponent = () => {
</Link>
</div>
);
-};
+}
-export default Notfound;
diff --git a/src/routes/profile/index.tsx b/src/routes/profile/index.tsx
deleted file mode 100644
index 66f6d1d..0000000
--- a/src/routes/profile/index.tsx
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- This file is part of GNU Taler
- (C) 2021 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/>
- */
-
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
-
-import { h, VNode } from 'preact';
-
-export default function BulmaProfile({}): VNode {
- return <div id="app">
- <section class="section is-title-bar">
- <div class="level">
- <div class="level-left">
- <div class="level-item">
- <ul>
- <li>Admin</li>
- <li>Profile</li>
- </ul>
- </div>
- </div>
- </div>
- </section>
- <section class="hero is-hero-bar">
- <div class="hero-body">
- <div class="level">
- <div class="level-left">
- <div class="level-item"><h1 class="title">
- Profile
- </h1></div>
- </div>
- <div class="level-right" style="display: none;">
- <div class="level-item" />
- </div>
- </div>
- </div>
- </section>
- <section class="section is-main-section">
- <div class="tile is-ancestor">
- <div class="tile is-parent">
- <div class="card tile is-child">
- <header class="card-header">
- <p class="card-header-title">
- <span class="icon"><i class="mdi mdi-account-circle default"
/></span>
- Edit Profile
- </p>
- </header>
- <div class="card-content">
- <form>
- <div class="field is-horizontal">
- <div class="field-label is-normal"><label
class="label">Avatar</label></div>
- <div class="field-body">
- <div class="field">
- <div class="field file">
- <label class="upload control">
- <a class="button is-primary">
- <span class="icon"><i class="mdi mdi-upload default"
/></span>
- <span>Pick a file</span>
- </a>
- <input type="file" />
- </label>
- </div>
- </div>
- </div>
- </div>
- <hr />
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">Name</label>
- </div>
- <div class="field-body">
- <div class="field">
- <div class="control">
- <input type="text" autocomplete="on" name="name"
value="John Doe" class="input" required />
- </div>
- <p class="help">Required. Your name</p>
- </div>
- </div>
- </div>
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">E-mail</label>
- </div>
- <div class="field-body">
- <div class="field">
- <div class="control">
- <input type="email" autocomplete="on" name="email"
value="user@example.com" class="input" required />
- </div>
- <p class="help">Required. Your e-mail</p>
- </div>
- </div>
- </div>
- <hr />
- <div class="field is-horizontal">
- <div class="field-label is-normal" />
- <div class="field-body">
- <div class="field">
- <div class="control">
- <button type="submit" class="button is-primary">
- Submit
- </button>
- </div>
- </div>
- </div>
- </div>
- </form>
- </div>
- </div>
- </div>
- <div class="tile is-parent">
- <div class="card tile is-child">
- <header class="card-header">
- <p class="card-header-title">
- <span class="icon"><i class="mdi mdi-account default" /></span>
- Profile
- </p>
- </header>
- <div class="card-content">
- <div class="is-user-avatar image has-max-width is-aligned-center">
- <img
src="https://avatars.dicebear.com/4.5/api/male/john-doe.svg" alt="John Doe" />
- </div>
- <hr />
- <div class="field">
- <label class="label">Name</label>
- <div class="control is-clearfix">
- <input type="text" readonly value="John Doe" class="input
is-static" />
- </div>
- </div>
- <hr />
- <div class="field">
- <label class="label">E-mail</label>
- <div class="control is-clearfix">
- <input type="text" readonly value="user@example.com"
class="input is-static" />
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="card">
- <header class="card-header">
- <p class="card-header-title">
- <span class="icon"><i class="mdi mdi-lock default" /></span>
- Change Password
- </p>
- </header>
- <div class="card-content">
- <form>
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">Current password</label>
- </div>
- <div class="field-body">
- <div class="field">
- <div class="control">
- <input type="password" name="password_current"
autocomplete="current-password" class="input" required />
- </div>
- <p class="help">Required. Your current password</p></div>
- </div>
- </div>
- <hr />
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">New password</label>
- </div>
- <div class="field-body">
- <div class="field">
- <div class="control">
- <input type="password" autocomplete="new-password"
name="password" class="input" required />
- </div>
- <p class="help">Required. New password</p>
- </div>
- </div>
- </div>
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">Confirm password</label>
- </div>
- <div class="field-body">
- <div class="field">
- <div class="control">
- <input type="password" autocomplete="new-password"
name="password_confirmation" class="input" required />
- </div>
- <p class="help">Required. New password one more time</p>
- </div>
- </div>
- </div>
- <hr />
- <div class="field is-horizontal">
- <div class="field-label is-normal" />
- <div class="field-body">
- <div class="field">
- <div class="control">
- <button type="submit" class="button is-primary">
- Submit
- </button>
- </div>
- </div>
- </div>
- </div>
- </form>
- </div>
- </div>
- </section>
-
- <div id="sample-modal" class="modal">
- <div class="modal-background jb-modal-close" />
- <div class="modal-card">
- <header class="modal-card-head">
- <p class="modal-card-title">Confirm action</p>
- <button class="delete jb-modal-close" aria-label="close" />
- </header>
- <section class="modal-card-body">
- <p>This will permanently delete <b>Some Object</b></p>
- <p>This is sample modal</p>
- </section>
- <footer class="modal-card-foot">
- <button class="button jb-modal-close">Cancel</button>
- <button class="button is-danger jb-modal-close">Delete</button>
- </footer>
- </div>
- <button class="modal-close is-large jb-modal-close" aria-label="close" />
- </div>
-</div>
-}
diff --git a/tests/header.test.tsx b/tests/header.test.tsx
index 529a8a6..04932b7 100644
--- a/tests/header.test.tsx
+++ b/tests/header.test.tsx
@@ -14,13 +14,13 @@
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
+/**
+*
+* @author Sebastian Javier Marchano (sebasjm)
+*/
import { h } from 'preact';
-import Footer from '../src/components/footer';
+import { Footer } from '../src/components/footer';
// See: https://github.com/preactjs/enzyme-adapter-preact-pure
import { shallow } from 'enzyme';
diff --git a/tsconfig.json b/tsconfig.json
index fbf68f4..14d4d04 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,24 +1,3 @@
-/*
- This file is part of GNU Taler
- (C) 2021 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/>
- */
-
- /**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
-
{
"compilerOptions": {
/* Basic Options */
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [taler-merchant-backoffice] branch master updated (d37369b -> 70bf89a), gnunet, 2021/02/18
- [taler-merchant-backoffice] 02/08: add duration as human readable, gnunet, 2021/02/18
- [taler-merchant-backoffice] 05/08: refactoring route, gnunet, 2021/02/18
- [taler-merchant-backoffice] 01/08: payto as array, gnunet, 2021/02/18
- [taler-merchant-backoffice] 07/08: record wont compile, gnunet, 2021/02/18
- [taler-merchant-backoffice] 08/08: rever sass-loader since it doesnt work with webpack 4 https://github.com/preactjs/preact-cli/issues/880, gnunet, 2021/02/18
- [taler-merchant-backoffice] 04/08: added copyright and replace default import,
gnunet <=
- [taler-merchant-backoffice] 03/08: adding copyright to source files, gnunet, 2021/02/18
- [taler-merchant-backoffice] 06/08: implemented pnpm, gnunet, 2021/02/18