aboutsummaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2024-08-27 02:03:13 +0200
committerFlorian Dold <florian@dold.me>2024-08-27 02:03:13 +0200
commitf5dd32d1cfc1f363ba0f68b1c7dad29610253edd (patch)
treeee4493aaca67a0bd2a0538acd7115eaca42ee4ef /packages
parentc5b383417d887d3918ead8f612ad051da57faee9 (diff)
formatting
Diffstat (limited to 'packages')
-rw-r--r--packages/auditor-backoffice-ui/src/components/menu/index.tsx374
-rw-r--r--packages/auditor-backoffice-ui/src/paths/login/index.tsx213
2 files changed, 292 insertions, 295 deletions
diff --git a/packages/auditor-backoffice-ui/src/components/menu/index.tsx b/packages/auditor-backoffice-ui/src/components/menu/index.tsx
index e411939c7..214b6bd3b 100644
--- a/packages/auditor-backoffice-ui/src/components/menu/index.tsx
+++ b/packages/auditor-backoffice-ui/src/components/menu/index.tsx
@@ -22,221 +22,219 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
* @author Nic Eigel
*/
-import {ComponentChildren, Fragment, h, VNode} from "preact";
-import {useEffect, useState} from "preact/hooks";
-import {Paths} from "../../InstanceRoutes.js";
-import {Notification} from "../../utils/types.js";
-import {NavigationBar} from "./NavigationBar.js";
-import {Sidebar} from "./SideBar.js";
+import { ComponentChildren, Fragment, h, VNode } from "preact";
+import { useEffect, useState } from "preact/hooks";
+import { Paths } from "../../InstanceRoutes.js";
+import { Notification } from "../../utils/types.js";
+import { NavigationBar } from "./NavigationBar.js";
+import { Sidebar } from "./SideBar.js";
function getInstanceTitle(path: string): string {
- switch (path) {
- case Paths.key_figures:
- return 'Key figures';
- case Paths.critical_errors:
- return 'Critical errors';
- case Paths.operating_status:
- return 'Operating status';
- case Paths.detail_view:
- return 'Inconsistencies';
- case Paths.amount_arithmethic_inconsistency_list:
- return `Amount arithmetic inconsistencies`;
- case Paths.bad_sig_losses_list:
- return `Bad sig losses`;
- case Paths.balance_list:
- return `Balances`;
- case Paths.closure_lag_list:
- return `Closure Lags`;
- case Paths.coin_inconsistency_list:
- return `Coin inconsistencies`;
- case Paths.denomination_key_validity_withdraw_inconsistency_list:
- return `Denomination key validity withdraw inconsistency`;
- case Paths.denomination_pending_list:
- return `Denominations pending`;
- case Paths.denomination_without_sig_list:
- return `Denominations without sigs`;
- case Paths.deposit_confirmation_list:
- return `Deposit confirmations`;
- case Paths.deposit_confirmation_update:
- return `Update deposit confirmation`;
- case Paths.emergency_list:
- return `Emergencies`;
- case Paths.emergency_by_count_list:
- return `Emergencies by count`;
- case Paths.exchange_signkey_list:
- return `Exchange signkeys`;
- case Paths.fee_time_inconsistency_list:
- return `Fee time inconsistencies`;
- case Paths.historic_denomination_revenue_list:
- return `Historic denomination revenue`;
- case Paths.misattribution_in_inconsistency_list:
- return `Misattribution in inconsistencies`;
- case Paths.progress_list:
- return `Progress`;
- case Paths.purse_not_closed_inconsistency_list:
- return `Purse not closed inconsistencies`;
- case Paths.purse_list:
- return `Purses`;
- case Paths.refresh_hanging_list:
- return `Refreshes hanging`;
- case Paths.reserve_balance_insufficient_inconsistency_list:
- return `Reserve balance insufficient inconsistencies`;
- case Paths.reserve_balance_summary_wrong_inconsistency_list:
- return `Reserve balance summary wrong inconsistencies`;
- case Paths.reserve_in_inconsistency_list:
- return `Reserves in inconsistencies`;
- case Paths.reserve_not_closed_inconsistency_list:
- return `Reserves not closed inconsistencies`;
- case Paths.row_inconsistency_list:
- return `Row inconsistencies`;
- case Paths.row_minor_inconsistency_list:
- return `Row minor inconsistencies`;
- case Paths.wire_format_inconsistency_list:
- return `Wire format inconsistencies`;
- case Paths.wire_out_inconsistency_list:
- return `Wire out inconsistencies`;
- case Paths.settings:
- return `Settings`;
- default:
- return "";
- }
+ switch (path) {
+ case Paths.key_figures:
+ return "Key figures";
+ case Paths.critical_errors:
+ return "Critical errors";
+ case Paths.operating_status:
+ return "Operating status";
+ case Paths.detail_view:
+ return "Inconsistencies";
+ case Paths.amount_arithmethic_inconsistency_list:
+ return `Amount arithmetic inconsistencies`;
+ case Paths.bad_sig_losses_list:
+ return `Bad sig losses`;
+ case Paths.balance_list:
+ return `Balances`;
+ case Paths.closure_lag_list:
+ return `Closure Lags`;
+ case Paths.coin_inconsistency_list:
+ return `Coin inconsistencies`;
+ case Paths.denomination_key_validity_withdraw_inconsistency_list:
+ return `Denomination key validity withdraw inconsistency`;
+ case Paths.denomination_pending_list:
+ return `Denominations pending`;
+ case Paths.denomination_without_sig_list:
+ return `Denominations without sigs`;
+ case Paths.deposit_confirmation_list:
+ return `Deposit confirmations`;
+ case Paths.deposit_confirmation_update:
+ return `Update deposit confirmation`;
+ case Paths.emergency_list:
+ return `Emergencies`;
+ case Paths.emergency_by_count_list:
+ return `Emergencies by count`;
+ case Paths.exchange_signkey_list:
+ return `Exchange signkeys`;
+ case Paths.fee_time_inconsistency_list:
+ return `Fee time inconsistencies`;
+ case Paths.historic_denomination_revenue_list:
+ return `Historic denomination revenue`;
+ case Paths.misattribution_in_inconsistency_list:
+ return `Misattribution in inconsistencies`;
+ case Paths.progress_list:
+ return `Progress`;
+ case Paths.purse_not_closed_inconsistency_list:
+ return `Purse not closed inconsistencies`;
+ case Paths.purse_list:
+ return `Purses`;
+ case Paths.refresh_hanging_list:
+ return `Refreshes hanging`;
+ case Paths.reserve_balance_insufficient_inconsistency_list:
+ return `Reserve balance insufficient inconsistencies`;
+ case Paths.reserve_balance_summary_wrong_inconsistency_list:
+ return `Reserve balance summary wrong inconsistencies`;
+ case Paths.reserve_in_inconsistency_list:
+ return `Reserves in inconsistencies`;
+ case Paths.reserve_not_closed_inconsistency_list:
+ return `Reserves not closed inconsistencies`;
+ case Paths.row_inconsistency_list:
+ return `Row inconsistencies`;
+ case Paths.row_minor_inconsistency_list:
+ return `Row minor inconsistencies`;
+ case Paths.wire_format_inconsistency_list:
+ return `Wire format inconsistencies`;
+ case Paths.wire_out_inconsistency_list:
+ return `Wire out inconsistencies`;
+ case Paths.settings:
+ return `Settings`;
+ default:
+ return "";
+ }
}
interface MenuProps {
- title?: string;
- path: string;
- onShowSettings: () => void;
+ title?: string;
+ path: string;
+ onShowSettings: () => void;
}
function WithTitle({
- title,
- children,
- }: {
- title: string;
- children: ComponentChildren;
+ title,
+ children,
+}: {
+ title: string;
+ children: ComponentChildren;
}): VNode {
- useEffect(() => {
- document.title = `Taler Backoffice: ${title}`;
- }, [title]);
- return <Fragment>{children}</Fragment>;
+ useEffect(() => {
+ document.title = `Taler Backoffice: ${title}`;
+ }, [title]);
+ return <Fragment>{children}</Fragment>;
}
-export function Menu({
- onShowSettings,
- title,
- path,
- }: MenuProps): VNode {
- const [mobileOpen, setMobileOpen] = useState(false);
- const titleWithSubtitle = getInstanceTitle(path.replace("app/#", ""));
- return (
- <WithTitle title={titleWithSubtitle}>
- <div
- class={mobileOpen ? "has-aside-mobile-expanded" : ""}
- onClick={() => setMobileOpen(false)}
- >
- <NavigationBar
- onMobileMenu={() => setMobileOpen(!mobileOpen)}
- title={titleWithSubtitle}
- />
-
- <Sidebar
- onShowSettings={onShowSettings}
- mobile={mobileOpen}
- />
- </div>
- </WithTitle>
- );
+export function Menu({ onShowSettings, title, path }: MenuProps): VNode {
+ const [mobileOpen, setMobileOpen] = useState(false);
+ const titleWithSubtitle = getInstanceTitle(path.replace("app/#", ""));
+ return (
+ <WithTitle title={titleWithSubtitle}>
+ <div
+ class={mobileOpen ? "has-aside-mobile-expanded" : ""}
+ onClick={() => setMobileOpen(false)}
+ >
+ <NavigationBar
+ onMobileMenu={() => setMobileOpen(!mobileOpen)}
+ title={titleWithSubtitle}
+ />
+
+ <Sidebar onShowSettings={onShowSettings} mobile={mobileOpen} />
+ </div>
+ </WithTitle>
+ );
}
interface NotYetReadyAppMenuProps {
- title: string;
- onShowSettings: () => void;
+ title: string;
+ onShowSettings: () => void;
}
interface NotifProps {
- notification?: Notification;
+ notification?: Notification;
}
-export function NotificationCard({notification: n}: NotifProps): VNode | null {
- if (!n) return null;
- return (
- <div class="notification">
- <div class="columns is-vcentered">
- <div class="column is-12">
- <article
- class={
- n.type === "ERROR"
- ? "message is-danger"
- : n.type === "WARN"
- ? "message is-warning"
- : "message is-info"
- }
- >
- <div class="message-header">
- <p>{n.message}</p>
- </div>
- {n.description && (
- <div class="message-body">
- <div>{n.description}</div>
- {n.details && <pre>{n.details}</pre>}
- </div>
- )}
- </article>
- </div>
+export function NotificationCard({
+ notification: n,
+}: NotifProps): VNode | null {
+ if (!n) return null;
+ return (
+ <div class="notification">
+ <div class="columns is-vcentered">
+ <div class="column is-12">
+ <article
+ class={
+ n.type === "ERROR"
+ ? "message is-danger"
+ : n.type === "WARN"
+ ? "message is-warning"
+ : "message is-info"
+ }
+ >
+ <div class="message-header">
+ <p>{n.message}</p>
</div>
+ {n.description && (
+ <div class="message-body">
+ <div>{n.description}</div>
+ {n.details && <pre>{n.details}</pre>}
+ </div>
+ )}
+ </article>
</div>
- );
+ </div>
+ </div>
+ );
}
interface NotConnectedAppMenuProps {
- title: string;
+ title: string;
}
export function NotConnectedAppMenu({
- title,
- }: NotConnectedAppMenuProps): VNode {
- const [mobileOpen, setMobileOpen] = useState(false);
-
- useEffect(() => {
- document.title = `Taler Backoffice: ${title}`;
- }, [title]);
-
- return (
- <div
- class={mobileOpen ? "has-aside-mobile-expanded" : ""}
- onClick={() => setMobileOpen(false)}
- >
- <NavigationBar
- onMobileMenu={() => setMobileOpen(!mobileOpen)}
- title={title}
- />
- </div>
- );
+ title,
+}: NotConnectedAppMenuProps): VNode {
+ const [mobileOpen, setMobileOpen] = useState(false);
+
+ useEffect(() => {
+ document.title = `Taler Backoffice: ${title}`;
+ }, [title]);
+
+ return (
+ <div
+ class={mobileOpen ? "has-aside-mobile-expanded" : ""}
+ onClick={() => setMobileOpen(false)}
+ >
+ <NavigationBar
+ onMobileMenu={() => setMobileOpen(!mobileOpen)}
+ title={title}
+ />
+ </div>
+ );
}
-
export function NotYetReadyAppMenu({
- onShowSettings,
- title
- }: NotYetReadyAppMenuProps): VNode {
- const [mobileOpen, setMobileOpen] = useState(false);
-
- useEffect(() => {
- document.title = `Taler Backoffice: ${title}`;
- }, [title]);
-
- return (
- <div
- class={mobileOpen ? "has-aside-mobile-expanded" : ""}
- onClick={() => setMobileOpen(false)}
- >
- <NavigationBar
- onMobileMenu={() => setMobileOpen(!mobileOpen)}
- title={title}
- />
- (
- <Sidebar onShowSettings={onShowSettings} instance="" mobile={mobileOpen}/>
- )
- </div>
- );
-} \ No newline at end of file
+ onShowSettings,
+ title,
+}: NotYetReadyAppMenuProps): VNode {
+ const [mobileOpen, setMobileOpen] = useState(false);
+
+ useEffect(() => {
+ document.title = `Taler Backoffice: ${title}`;
+ }, [title]);
+
+ return (
+ <div
+ class={mobileOpen ? "has-aside-mobile-expanded" : ""}
+ onClick={() => setMobileOpen(false)}
+ >
+ <NavigationBar
+ onMobileMenu={() => setMobileOpen(!mobileOpen)}
+ title={title}
+ />
+ (
+ <Sidebar
+ onShowSettings={onShowSettings}
+ instance=""
+ mobile={mobileOpen}
+ />
+ )
+ </div>
+ );
+}
diff --git a/packages/auditor-backoffice-ui/src/paths/login/index.tsx b/packages/auditor-backoffice-ui/src/paths/login/index.tsx
index c99dc6050..16fb18fdf 100644
--- a/packages/auditor-backoffice-ui/src/paths/login/index.tsx
+++ b/packages/auditor-backoffice-ui/src/paths/login/index.tsx
@@ -22,106 +22,102 @@
import { useTranslationContext } from "@gnu-taler/web-util/browser";
import { ComponentChildren, Fragment, h, VNode } from "preact";
-import { useCallback, useState } from "preact/hooks";
-import { useBackendContext, useBackendTokenContext } from "../../context/backend.js";
+import { Route } from "preact-router";
+import { useCallback, useState } from "preact/hooks";
import { NotificationCard } from "../../components/menu/index.js";
-import { Notification } from "../../utils/types.js";
+import { useBackendTokenContext } from "../../context/backend.js";
import { useBackendToken } from "../../hooks/backend.js";
-import { Route } from "preact-router";
import { Paths, Redirect } from "../../InstanceRoutes.js";
+import { Notification } from "../../utils/types.js";
export function LoginPage(): VNode {
const [token, setToken] = useState("");
const [notif, setNotif] = useState<Notification | undefined>(undefined);
const { i18n } = useTranslationContext();
- const doLogin = useCallback(async function doLoginImpl() {
-
- const result = useBackendToken();
- if (!result.ok) {
- }
- if (result.ok) {
- //TODO fixme
- const { token } = useBackendTokenContext();
- /* return (
+ const doLogin = useCallback(
+ async function doLoginImpl() {
+ const result = useBackendToken();
+ if (!result.ok) {
+ }
+ if (result.ok) {
+ //TODO fixme
+ const { token } = useBackendTokenContext();
+ /* return (
<Route path="/" component={Redirect} to={Paths.key_figures}/>
);*/
- } else {
- setNotif({
- message: "Your password is incorrect",
- type: "ERROR",
- });
- }
- }, [token]);
-
- return (
- <Route path="/" component={Redirect} to={Paths.key_figures}/>
+ } else {
+ setNotif({
+ message: "Your password is incorrect",
+ type: "ERROR",
+ });
+ }
+ },
+ [token],
);
+ return <Route path="/" component={Redirect} to={Paths.key_figures} />;
+
return (
<div class="columns is-centered" style={{ margin: "auto" }}>
- <div class="column is-two-thirds ">
- <div class="modal-card" style={{ width: "100%", margin: 0 }}>
- <header
- class="modal-card-head"
- style={{ border: "1px solid", borderBottom: 0 }}
- >
- <p class="modal-card-title">{i18n.str`Token required`}</p>
- </header>
- <section
- class="modal-card-body"
- style={{ border: "1px solid", borderTop: 0, borderBottom: 0 }}
- >
-
- <p>
- <i18n.Translate>Need the access token for the API.</i18n.Translate>
- </p>
- <div class="field is-horizontal">
- <div class="field-label is-normal">
- <label class="label">
- <i18n.Translate>Access Token</i18n.Translate>
- </label>
- </div>
- <div class="field-body">
- <div class="field">
- <p class="control is-expanded">
- <input
- class="input"
- type="password"
- placeholder={"current access token"}
- name="token"
- onKeyPress={(e) =>
- e.keyCode === 13
- ? doLogin()
- : null
- }
- value={token}
- onInput={(e): void => setToken(e?.currentTarget.value)}
- />
- </p>
+ <div class="column is-two-thirds ">
+ <div class="modal-card" style={{ width: "100%", margin: 0 }}>
+ <header
+ class="modal-card-head"
+ style={{ border: "1px solid", borderBottom: 0 }}
+ >
+ <p class="modal-card-title">{i18n.str`Token required`}</p>
+ </header>
+ <section
+ class="modal-card-body"
+ style={{ border: "1px solid", borderTop: 0, borderBottom: 0 }}
+ >
+ <p>
+ <i18n.Translate>
+ Need the access token for the API.
+ </i18n.Translate>
+ </p>
+ <div class="field is-horizontal">
+ <div class="field-label is-normal">
+ <label class="label">
+ <i18n.Translate>Access Token</i18n.Translate>
+ </label>
+ </div>
+ <div class="field-body">
+ <div class="field">
+ <p class="control is-expanded">
+ <input
+ class="input"
+ type="password"
+ placeholder={"current access token"}
+ name="token"
+ onKeyPress={(e) => (e.keyCode === 13 ? doLogin() : null)}
+ value={token}
+ onInput={(e): void => setToken(e?.currentTarget.value)}
+ />
+ </p>
+ </div>
</div>
</div>
- </div>
- </section>
- <footer
- class="modal-card-foot "
- style={{
- justifyContent: "flex-end",
- border: "1px solid",
- borderTop: 0,
- }}
- >
- <AsyncButton
- onClick={() => doLogin()}
+ </section>
+ <footer
+ class="modal-card-foot "
+ style={{
+ justifyContent: "flex-end",
+ border: "1px solid",
+ borderTop: 0,
+ }}
>
- <i18n.Translate>Confirm</i18n.Translate>
- </AsyncButton>
- </footer>
+ <AsyncButton onClick={() => doLogin()}>
+ <i18n.Translate>Confirm</i18n.Translate>
+ </AsyncButton>
+ </footer>
+ </div>
</div>
</div>
- </div>);
-
+ );
- return (<Fragment>
+ return (
+ <Fragment>
<NotificationCard notification={notif} />
<div class="columns is-centered" style={{ margin: "auto" }}>
<div class="column is-two-thirds ">
@@ -145,7 +141,6 @@ export function LoginPage(): VNode {
</label>
</div>
<div class="field-body">
-
<div class="field">
<p class="control is-expanded">
<input
@@ -154,9 +149,7 @@ export function LoginPage(): VNode {
placeholder={"current access token"}
name="token"
onKeyPress={(e) =>
- e.keyCode === 13
- ? doLogin()
- : null
+ e.keyCode === 13 ? doLogin() : null
}
value={token}
onInput={(e): void => setToken(e?.currentTarget.value)}
@@ -175,39 +168,45 @@ export function LoginPage(): VNode {
}}
>
<div />
- <AsyncButton
- type="is-info"
- onClick={doLogin}
- >
+ <AsyncButton type="is-info" onClick={doLogin}>
<i18n.Translate>Confirm</i18n.Translate>
</AsyncButton>
-
</footer>
</div>
</div>
</div>
</Fragment>
-
);
}
-function AsyncButton({ onClick, disabled, type = "", children }: {
- type?: string,
- disabled?: boolean,
- onClick: () => Promise<void>,
- children: ComponentChildren
+function AsyncButton({
+ onClick,
+ disabled,
+ type = "",
+ children,
+}: {
+ type?: string;
+ disabled?: boolean;
+ onClick: () => Promise<void>;
+ children: ComponentChildren;
}): VNode {
const [running, setRunning] = useState(false);
- return <button class={"button " + type} disabled={disabled || running} onClick={() => {
- setRunning(true);
- onClick().then(() => {
- setRunning(false);
- }).catch(() => {
- setRunning(false);
- });
- }}>
- {children}
- </button>;
+ return (
+ <button
+ class={"button " + type}
+ disabled={disabled || running}
+ onClick={() => {
+ setRunning(true);
+ onClick()
+ .then(() => {
+ setRunning(false);
+ })
+ .catch(() => {
+ setRunning(false);
+ });
+ }}
+ >
+ {children}
+ </button>
+ );
}
-
-