/* This file is part of GNU Taler (C) 2021-2023 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 */ import { ComponentChildren, Fragment, h, VNode } from "preact"; import { useEffect, useState } from "preact/hooks"; import { AdminPaths } from "../../AdminRoutes.js"; import { InstancePaths } from "../../InstanceRoutes.js"; import { Notification } from "../../utils/types.js"; import { NavigationBar } from "./NavigationBar.js"; import { Sidebar } from "./SideBar.js"; function getInstanceTitle(path: string, id: string): string { switch (path) { case InstancePaths.settings: return `${id}: Settings`; case InstancePaths.order_list: return `${id}: Orders`; case InstancePaths.order_new: return `${id}: New order`; case InstancePaths.inventory_list: return `${id}: Inventory`; case InstancePaths.inventory_new: return `${id}: New product`; case InstancePaths.inventory_update: return `${id}: Update product`; case InstancePaths.reserves_new: return `${id}: New reserve`; case InstancePaths.reserves_list: return `${id}: Reserves`; case InstancePaths.transfers_list: return `${id}: Transfers`; case InstancePaths.transfers_new: return `${id}: New transfer`; case InstancePaths.webhooks_list: return `${id}: Webhooks`; case InstancePaths.webhooks_new: return `${id}: New webhook`; case InstancePaths.webhooks_update: return `${id}: Update webhook`; case InstancePaths.otp_devices_list: return `${id}: otp devices`; case InstancePaths.otp_devices_new: return `${id}: New otp devices`; case InstancePaths.otp_devices_update: return `${id}: Update otp devices`; case InstancePaths.templates_new: return `${id}: New template`; case InstancePaths.templates_update: return `${id}: Update template`; case InstancePaths.templates_list: return `${id}: Templates`; case InstancePaths.templates_use: return `${id}: Use template`; case InstancePaths.interface: return `${id}: Interface`; default: return ""; } } function getAdminTitle(path: string, instance: string) { if (path === AdminPaths.new_instance) return `New instance`; if (path === AdminPaths.list_instances) return `Instances`; return getInstanceTitle(path, instance); } interface MenuProps { title?: string; path: string; instance: string; admin?: boolean; onLogout?: () => void; onShowSettings: () => void; setInstanceName: (s: string) => void; isPasswordOk: boolean; } function WithTitle({ title, children, }: { title: string; children: ComponentChildren; }): VNode { useEffect(() => { document.title = `Taler Backoffice: ${title}`; }, [title]); return {children}; } export function Menu({ onLogout, onShowSettings, title, instance, path, admin, setInstanceName, isPasswordOk }: MenuProps): VNode { const [mobileOpen, setMobileOpen] = useState(false); const titleWithSubtitle = title ? title : !admin ? getInstanceTitle(path, instance) : getAdminTitle(path, instance); const adminInstance = instance === "default"; const mimic = admin && !adminInstance; return (
setMobileOpen(false)} > setMobileOpen(!mobileOpen)} title={titleWithSubtitle} /> {onLogout && ( )} {mimic && ( )}
); } interface NotYetReadyAppMenuProps { title: string; onShowSettings: () => void; onLogout?: () => void; isPasswordOk: boolean; } interface NotifProps { notification?: Notification; } export function NotificationCard({ notification: n, }: NotifProps): VNode | null { if (!n) return null; return (

{n.message}

{n.description && (
{n.description}
{n.details &&
{n.details}
}
)}
); } interface NotConnectedAppMenuProps { title: string; } export function NotConnectedAppMenu({ title, }: NotConnectedAppMenuProps): VNode { const [mobileOpen, setMobileOpen] = useState(false); useEffect(() => { document.title = `Taler Backoffice: ${title}`; }, [title]); return (
setMobileOpen(false)} > setMobileOpen(!mobileOpen)} title={title} />
); } export function NotYetReadyAppMenu({ onLogout, onShowSettings, title, isPasswordOk }: NotYetReadyAppMenuProps): VNode { const [mobileOpen, setMobileOpen] = useState(false); useEffect(() => { document.title = `Taler Backoffice: ${title}`; }, [title]); return (
setMobileOpen(false)} > setMobileOpen(!mobileOpen)} title={title} /> {onLogout && ( )}
); }