commit 2efd2e6806ccb1953e9510f9a8edc63d8d0a7eb0
parent 1ef89f3a7b718fa433af2095a62a271206a6bbaa
Author: Florian Dold <dold@taler.net>
Date: Fri, 21 Aug 2026 13:03:47 +0200
merchant-backend-ui: remove obsolete package
Diffstat:
47 files changed, 24 insertions(+), 6804 deletions(-)
diff --git a/packages/merchant-backend-ui/.gitignore b/packages/merchant-backend-ui/.gitignore
@@ -1,8 +0,0 @@
-/build
-/size-plugin.json
-/storybook-static
-/docs
-/single
-/coverage
-/dist
-/.rollup.cache
diff --git a/packages/merchant-backend-ui/README.md b/packages/merchant-backend-ui/README.md
@@ -1,34 +0,0 @@
-Taler Merchant Backend pages
-
-# Description
-
-This project generates templates for the Taler Merchant backend:
-
-- OfferRefund
-- RequestPayment
-- ShowOrderDetails
-
-These pages are provided by the merchant-backend service and will be queried for browsers
-that either may or may not have enabled JavaScript.
-The merchant-backend service is currently supporting a mustache library for server-side rendering.
-If the browser have JavaScript enabled will still want to use some dynamic content behavior like polling the status or re-render after timeout.
-
-Given this scenario we have:
-
-1) a build process from source to mustache template. These are html files in the `dist/pages` folder.
-2) a server side render process from mustache template to HTML for the browser.
-3) a client side render process that uses preact
-
-The process (1) is
-
-# Building
-
-The building process can be executed with `pnpm build`
-
-# Testing
-
-This project is using a JavaScript implementation of mustache that can be executed with the command `pnpm render-examples`.
-The script will take the pages previously built in the `dist/pages` directory and the examples definition
-in the `src/pages/[exampleName].examples.ts` files and renders a page to be sent to the user like the Taler Merchant Backend would do.
-This example will be saved individually into the directory `dist/examples` and can be opened in your test browser.
-Testing should be done with JavaScript enabled and disabled, in both cases the result should look OK.
diff --git a/packages/merchant-backend-ui/build.mjs b/packages/merchant-backend-ui/build.mjs
@@ -1,177 +0,0 @@
-#!/usr/bin/env node
-/*
- 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 <http://www.gnu.org/licenses/>
- */
-
-import esbuild from "esbuild";
-import path from "node:path";
-import fs from "node:fs";
-import { execSync } from 'node:child_process';
-
-const BASE = process.cwd();
-
-const preact = path.join(
- BASE,
- "node_modules",
- "preact",
- "compat",
- "dist",
- "compat.module.js",
-);
-
-const preactCompatPlugin = {
- name: "preact-compat",
- setup(build) {
- build.onResolve({ filter: /^(react-dom|react)$/ }, (args) => {
- //console.log("onresolve", JSON.stringify(args, undefined, 2));
- return {
- path: preact,
- };
- });
- },
-};
-
-const pages = ["OfferRefund", "RequestPayment", "ShowOrderDetails"]
-const langs = ["en", "de", "es"]
-const entryPoints = pages.map(p => `src/pages/${p}.tsx`);
-
-let GIT_ROOT = BASE;
-while (!fs.existsSync(path.join(GIT_ROOT, ".git")) && GIT_ROOT !== "/") {
- GIT_ROOT = path.join(GIT_ROOT, "../");
-}
-const GIT_HASH = GIT_ROOT === "/" ? 'not defined' : git_hash();
-
-let PACKAGE_VERSION = get_version()
-function get_version() {
- try {
- return JSON.parse(fs.readFileSync(path.join(BASE, "package.json"))).version;
- } catch {
- return 'not defined'
- }
-}
-
-function git_hash() {
- return execSync(`git rev-parse HEAD`, { encoding: 'utf-8' }).trim();
-}
-
-function toCamelCaseName(name, lang) {
- return name
- .replace(/^[A-Z]/, letter => `${letter.toLowerCase()}`) //first letter lowercase
- .replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`) //snake case
- .concat(`.${lang}.html`); //extension
-}
-
-function templatePlugin(options) {
- return {
- name: "template-backend",
- setup(build) {
- build.onEnd(() => {
- for (const pageName of options.pages) {
- for (const langName of options.langs) {
- const css = fs.readFileSync(path.join(build.initialOptions.outdir, `${pageName}.css`), "utf8").toString()
- const js = fs.readFileSync(path.join(build.initialOptions.outdir, `${pageName}.js`), "utf8").toString()
- const location = path.join(build.initialOptions.outdir, toCamelCaseName(pageName, langName))
- const render = new Function(`${js}; return page.buildTimeRendering("${langName}");`)()
- const html = `
- <!doctype html>
- <html lang="${langName}">
- <head>
- ${render.head}
- <style>${css}</style>
- </head>
- <script id="built_time_data">
- </script>
- <body>
- ${render.body}
- <script>${js}</script>
- <script>page.mount("${langName}")</script>
- </body>
- </html>`
- fs.writeFileSync(location, html);
- }
- }
- });
- },
- };
-}
-
-export const buildConfig = {
- entryPoints: [...entryPoints],
- bundle: true,
- outdir: "dist/pages",
- /*
- * Doing a minified version will replace templatestring to common strings
- * This app is building mustache template with placeholders that will be replaced
- * with string in runtime by the merchant-backend
- *
- * To the date, merchant backend is replacing with multiline string so
- * doing minified version will brake at runtime
- * */
- minify: false,
- loader: {
- ".svg": "file",
- ".png": "dataurl",
- ".jpeg": "dataurl",
- '.ttf': 'file',
- '.woff': 'file',
- '.woff2': 'file',
- '.eot': 'file',
- },
- target: ["es2023"],
- format: "iife",
- platform: "browser",
- sourcemap: false,
- globalName: "page",
- jsxFactory: "h",
- jsxFragment: "Fragment",
- define: {
- __VERSION__: `"${PACKAGE_VERSION}"`,
- __GIT_HASH__: `"${GIT_HASH}"`,
- },
- plugins: [
- preactCompatPlugin,
- templatePlugin({ pages, langs })
- ],
-};
-
-await esbuild.build(buildConfig)
-
-export const testingConfig = {
- entryPoints: ["src/render-examples.ts"],
- bundle: true,
- outdir: "dist/test",
- minify: false,
- loader: {
- ".svg": "file",
- ".png": "dataurl",
- ".jpeg": "dataurl",
- '.ttf': 'file',
- '.woff': 'file',
- '.woff2': 'file',
- '.eot': 'file',
- },
- target: ["es2023"],
- format: "iife",
- platform: "node",
- sourcemap: true,
- define: {
- __VERSION__: `"${PACKAGE_VERSION}"`,
- __GIT_HASH__: `"${GIT_HASH}"`,
- },
- plugins: [
- ],
-};
-
-await esbuild.build(testingConfig)
diff --git a/packages/merchant-backend-ui/copyleft-header.js b/packages/merchant-backend-ui/copyleft-header.js
@@ -1,15 +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/>
- */
diff --git a/packages/merchant-backend-ui/package.json b/packages/merchant-backend-ui/package.json
@@ -1,40 +0,0 @@
-{
- "private": true,
- "name": "@gnu-taler/merchant-backend-ui",
- "version": "1.6.31",
- "license": "AGPL-3.0-or-later",
- "scripts": {
- "build": "tsc && ./build.mjs",
- "build:with-deps": "pnpm --filter \"{.}...\" run build",
- "render-examples": "node dist/test/render-examples.js dist/pages dist/examples",
- "lint-check": "eslint '{src,tests}/**/*.{js,jsx,ts,tsx}'",
- "i18n:source2po": "pogen extract && pogen merge",
- "i18n:po2strings": "pogen emit",
- "lint-fix": "eslint --fix '{src,tests}/**/*.{js,jsx,ts,tsx}'",
- "clean": "rm -rf dist lib tsconfig.tsbuildinfo",
- "serve-dist": "pnpm dlx sirv --port ${PORT:=8080} --cors --single dist"
- },
- "engines": {
- "node": ">=12",
- "pnpm": ">=5"
- },
- "dependencies": {
- "date-fns": "^2.21.1",
- "jed": "1.1.1",
- "preact": "10.11.3",
- "qrcode-generator": "^1.4.4"
- },
- "devDependencies": {
- "@gnu-taler/pogen": "workspace:*",
- "@types/mustache": "^4.1.2",
- "@types/node": "^20.19.41",
- "mustache": "^4.2.0",
- "preact-render-to-string": "^5.1.19",
- "ts-node": "^10.9.1",
- "tslib": "2.6.2",
- "typescript": "7.0.2"
- },
- "pogen": {
- "domain": "taler-merchant-backend-ui"
- }
-}
diff --git a/packages/merchant-backend-ui/src/assets/empty.png b/packages/merchant-backend-ui/src/assets/empty.png
Binary files differ.
diff --git a/packages/merchant-backend-ui/src/assets/icons/android-chrome-192x192.png b/packages/merchant-backend-ui/src/assets/icons/android-chrome-192x192.png
Binary files differ.
diff --git a/packages/merchant-backend-ui/src/assets/icons/android-chrome-512x512.png b/packages/merchant-backend-ui/src/assets/icons/android-chrome-512x512.png
Binary files differ.
diff --git a/packages/merchant-backend-ui/src/assets/icons/apple-touch-icon.png b/packages/merchant-backend-ui/src/assets/icons/apple-touch-icon.png
Binary files differ.
diff --git a/packages/merchant-backend-ui/src/assets/icons/favicon-16x16.png b/packages/merchant-backend-ui/src/assets/icons/favicon-16x16.png
Binary files differ.
diff --git a/packages/merchant-backend-ui/src/assets/icons/favicon-32x32.png b/packages/merchant-backend-ui/src/assets/icons/favicon-32x32.png
Binary files differ.
diff --git a/packages/merchant-backend-ui/src/assets/icons/languageicon.svg b/packages/merchant-backend-ui/src/assets/icons/languageicon.svg
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- viewBox="0 0 2411.2 2794" style="enable-background:new 0 0 2411.2 2794;" xml:space="preserve">
-<style type="text/css">
- .st0{fill:#FFFFFF;}
- .st1{fill-rule:evenodd;clip-rule:evenodd;}
- .st2{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
-</style>
-<g id="Layer_2">
-</g>
-<g id="Layer_x5F_1_x5F_1">
- <g>
- <polygon points="1204.6,359.2 271.8,30 271.8,2060.1 1204.6,1758.3 "/>
- <polygon class="st0" points="1182.2,358.1 2150.6,29 2150.6,2059 1182.2,1757.3 "/>
- <polygon class="st0" points="30,2415.4 1182.2,2031.4 1182.2,357.9 30,742 "/>
- <polygon points="1707.2,2440.7 1870.5,2709.4 1956.6,2459.8 "/>
- <g>
- <path d="M421.7,934.8c-6.1-6,8,49.1,27.6,68.9c34.8,35.1,61.9,39.6,76.4,40.2c32,1.3,71.5-8,94.9-17.8
- c22.7-9.7,62.4-30,77.5-59.6c3.2-6.3,11.9-17,6.4-43.2c-4.2-20.2-17-27.3-32.7-26.2c-15.7,1.1-63.2,13.7-86.1,20.8
- c-23,7-70.3,21.4-90.9,25.8C474.3,948.2,429,941.7,421.7,934.8z"/>
- <path d="M1003.1,1593.7c-9.1-3.3-196.9-81.1-223.6-93.9c-21.8-10.5-75.2-33.1-100.4-43.3c70.8-109.2,115.5-191.6,121.5-204.1
- c11-23,86-169.6,87.7-178.7c1.7-9.1,3.8-42.9,2.2-51c-1.7-8.2-29.1,7.6-66.4,20.2c-37.4,12.6-108.4,58.8-135.8,64.6
- c-27.5,5.7-115.5,39.1-160.5,54c-45,14.9-130.2,40.9-165.2,50.4c-35.1,9.5-65.7,10.2-85.3,16.2c0,0,2.6,27.5,7.8,35.7
- c5.2,8.2,23.7,28.4,45.3,34.1c21.6,5.7,57.3,3.4,73.6-0.3c16.3-3.8,44.4-17.5,48.2-23.6c3.8-6.1-2-24.9,4.5-30.6
- c6.5-5.6,92.2-25.7,124.6-35.4c32.4-10,156.3-52.6,173.1-50.5c-5.3,17.7-105,215.1-137.1,274c-32.1,58.9-218.6,318-258.3,363.6
- c-30.1,34.7-103.2,123.5-128.5,143.6c6.4,1.8,51.6-2.1,59.9-7.2c51.3-31.6,136.9-138.1,164.4-170.5
- c81.9-96,153.8-196.8,210.8-283.4h0.1c11.1,4.6,100.9,77.8,124.4,94c23.4,16.2,115.9,67.8,136,76.4c20,8.7,97.1,44.2,100.3,32.2
- C1029.4,1668,1012.2,1597.1,1003.1,1593.7z"/>
- </g>
- <path class="st1" d="M569,2572c18,11,35,20,54,29c38,19,81,39,122,54c56,21,112,38,168,51c31,7,65,13,98,18c3,0,92,11,110,11h90
- c35-3,68-5,103-10c28-4,59-9,89-16c22-5,45-10,67-17c21-6,45-14,68-22c15-5,31-12,47-18c13-6,29-13,44-19c18-8,39-19,59-29
- c16-8,34-18,51-28c13-7,43-30,59-30c18,0,30,16,30,30c0,29-39,38-57,51c-19,13-42,23-62,34c-40,21-81,39-120,54
- c-51,19-107,37-157,49c-19,4-38,9-57,12c-10,2-114,18-143,18h-132c-35-3-72-7-107-12c-31-5-64-11-95-18c-24-5-50-12-73-19
- c-40-11-79-25-117-40c-69-26-141-60-209-105c-12-8-13-16-13-25c0-15,11-29,29-29C531,2546,563,2569,569,2572z"/>
- <path class="st1" d="M1151,2009L61,2372V764l1090-363V2009z M1212,354v1680c-1,5-3,10-7,15c-2,3-6,7-9,8c-25,10-1151,388-1166,388
- c-12,0-23-8-29-21c0-1-1-2-1-4V739c2-5,3-12,7-16c8-11,22-13,31-16c17-6,1126-378,1142-378C1190,329,1212,336,1212,354z"/>
- <path class="st1" d="M2120,2017l-907-282V380l907-308V2017z M2181,32v2023c-1,23-17,33-32,33c-13,0-107-32-123-37
- c-126-39-253-78-378-117c-28-9-57-18-84-27c-24-7-50-15-74-23c-107-33-216-66-323-102c-4-1-14-15-14-18V351c2-5,4-11,9-15
- c8-9,351-123,486-168c36-13,487-168,501-168C2167,0,2181,13,2181,32z"/>
- <polygon points="2411.2,2440.7 1199.5,2054.5 1204.6,373.2 2411.2,757.2 "/>
- <g>
- <path class="st2" d="M1800.3,1124.6L1681.4,1412l218.6,66.3L1800.3,1124.6z M1729,853.2l156.1,47.3l284.4,1025l-160.3-48.7
- l-57.6-210.4L1620.2,1566l-71.3,171.4l-160.4-48.7L1729,853.2z"/>
- </g>
- </g>
-</g>
-</svg>
diff --git a/packages/merchant-backend-ui/src/assets/icons/mstile-150x150.png b/packages/merchant-backend-ui/src/assets/icons/mstile-150x150.png
Binary files differ.
diff --git a/packages/merchant-backend-ui/src/components/Application.tsx b/packages/merchant-backend-ui/src/components/Application.tsx
@@ -1,42 +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 { ComponentChildren, h, VNode } from "preact";
-import { TranslationProvider } from "../context/translations.js";
-import { strings } from "../i18n/strings.js";
-
-interface Props {
- children: ComponentChildren;
- lang: string;
-}
-export function Application({ children, lang }: Props): VNode {
- return (
- <TranslationProvider
- source={strings}
- lang={lang}
- completeness={{
- es: strings["es"].completeness,
- de: strings["de"].completeness,
- }}
- >
- {children}
- </TranslationProvider>
- );
-}
diff --git a/packages/merchant-backend-ui/src/components/Footer.tsx b/packages/merchant-backend-ui/src/components/Footer.tsx
@@ -1,35 +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 { FooterBar } from "../styled/index.js";
-
-export function Footer(): VNode {
- return (
- <FooterBar>
- <p>
- <a href="https://taler.net/">
- Learn more about GNU Taler on our website.
- </a>
- <p>Copyright © 2014—2021 Taler Systems SA</p>
- </p>
- </FooterBar>
- );
-}
diff --git a/packages/merchant-backend-ui/src/components/QR.tsx b/packages/merchant-backend-ui/src/components/QR.tsx
@@ -1,54 +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/>
- */
-
-import { h, VNode } from "preact";
-import { useEffect, useRef } from "preact/hooks";
-import qrcode from "qrcode-generator";
-
-export function createSVG(text: string): string {
- const qr = qrcode(0, "L");
- qr.addData(text);
- qr.make();
- return qr.createSvgTag({
- scalable: true,
- margin: 0,
- });
-}
-
-export function QR({ text }: { text: string }): VNode {
- const divRef = useRef<HTMLDivElement>(null);
- useEffect(() => {
- if (divRef.current) {
- divRef.current.innerHTML = createSVG(text);
- }
- });
-
- return (
- <div
- style={{
- width: "100%",
- display: "flex",
- flexDirection: "column",
- alignItems: "center",
- }}
- >
- <div
- style={{ width: "50%", minWidth: 200, maxWidth: 300 }}
- ref={divRef}
- />
- </div>
- );
-}
diff --git a/packages/merchant-backend-ui/src/context/translations.ts b/packages/merchant-backend-ui/src/context/translations.ts
@@ -1,155 +0,0 @@
-/*
- This file is part of GNU Taler
- (C) 2022 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/>
- */
-
-import { i18n, setupI18n } from "../utils/i18n.js";
-import { ComponentChildren, createContext, h, VNode } from "preact";
-import { useContext } from "preact/hooks";
-import { Locale } from "date-fns";
-import {
- es as esLocale,
- enGB as enLocale,
- fr as frLocale,
- de as deLocale,
-} from "date-fns/locale";
-
-export type InternationalizationAPI = typeof i18n;
-
-interface Type {
- lang: string;
- supportedLang: { [id in keyof typeof supportedLang]: string };
- i18n: InternationalizationAPI;
- dateLocale: Locale;
- completeness: { [id in keyof typeof supportedLang]: number };
-}
-
-const supportedLang = {
- es: "Espanol [es]",
- en: "English [en]",
- fr: "Francais [fr]",
- de: "Deutsch [de]",
- sv: "Svenska [sv]",
- it: "Italiane [it]",
-};
-
-const initial: Type = {
- lang: "en",
- supportedLang,
- i18n,
- dateLocale: enLocale,
- completeness: {
- de: 0,
- en: 0,
- es: 0,
- fr: 0,
- it: 0,
- sv: 0,
- },
-};
-const Context = createContext<Type>(initial);
-
-interface Props {
- children: ComponentChildren;
- lang: string;
- source: Record<string, any>;
- completeness?: Record<string, number>;
-}
-
-// Outmost UI wrapper.
-export const TranslationProvider = ({
- children,
- lang,
- source,
- completeness: completenessProp,
-}: Props): VNode => {
- const completeness = {
- en: 100,
- de:
- !completenessProp || !completenessProp["de"] ? 0 : completenessProp["de"],
- es:
- !completenessProp || !completenessProp["es"] ? 0 : completenessProp["es"],
- fr:
- !completenessProp || !completenessProp["fr"] ? 0 : completenessProp["fr"],
- it:
- !completenessProp || !completenessProp["it"] ? 0 : completenessProp["it"],
- sv:
- !completenessProp || !completenessProp["sv"] ? 0 : completenessProp["sv"],
- };
-
- setupI18n(lang, source);
-
- const dateLocale =
- lang === "es"
- ? esLocale
- : lang === "fr"
- ? frLocale
- : lang === "de"
- ? deLocale
- : enLocale;
-
- return h(Context.Provider, {
- value: {
- lang,
- supportedLang,
- i18n,
- dateLocale,
- completeness,
- },
- children,
- });
-};
-
-export const useTranslationContext = (): Type => useContext(Context);
-
-const MIN_LANG_COVERAGE_THRESHOLD = 90;
-/**
- * choose the best from the browser config based on the completeness
- * on the translation
- */
-function getBrowserLang(
- completeness: Record<string, number>,
-): string | undefined {
- if (typeof window === "undefined") return undefined;
-
- if (window.navigator.language) {
- if (
- completeness[window.navigator.language] >= MIN_LANG_COVERAGE_THRESHOLD
- ) {
- return window.navigator.language;
- }
- }
- if (window.navigator.languages) {
- const match = Object.entries(completeness)
- .filter(([code, value]) => {
- if (value < MIN_LANG_COVERAGE_THRESHOLD) return false; //do not consider langs below 90%
- return (
- window.navigator.languages.findIndex((l) => l.startsWith(code)) !== -1
- );
- })
- .map(([code, value]) => ({ code, value }));
-
- if (match.length > 0) {
- let max = match[0];
- match.forEach((v) => {
- if (v.value > max.value) {
- max = v;
- }
- });
- return max.code;
- }
- }
-
- return undefined;
-}
diff --git a/packages/merchant-backend-ui/src/css/pure-min.css b/packages/merchant-backend-ui/src/css/pure-min.css
@@ -1,973 +0,0 @@
-/*!
- Pure v2.0.3
- Copyright 2013 Yahoo!
- Licensed under the BSD License.
- https://github.com/pure-cs s/pure/blob/master/LICENSE.md
-*/
-/*!
- normalize.cs s v | MIT License | git.io/normalize
- Copyright (c) Nicolas Gallagher and Jonathan Neal
-*/
-/*! normalize.cs s v8.0.1 | MIT License | github.com/necolas/normalize.cs s */
-
-.talerbar {
- text-align: center;
-}
-
-html {
- line-height: 1.15;
- -webkit-text-size-adjust: 100%;
-}
-body {
- margin: 0;
-}
-main {
- display: block;
-}
-h1 {
- font-size: 2em;
- margin: 0.67em 0;
-}
-hr {
- -webkit-box-sizing: content-box;
- box-sizing: content-box;
- height: 0;
- overflow: visible;
-}
-pre {
- font-family: monospace, monospace;
- font-size: 1em;
-}
-a {
- background-color: transparent;
-}
-abbr[title] {
- border-bottom: none;
- text-decoration: underline;
- -webkit-text-decoration: underline dotted;
- text-decoration: underline dotted;
-}
-b,
-strong {
- font-weight: bolder;
-}
-code,
-kbd,
-samp {
- font-family: monospace, monospace;
- font-size: 1em;
-}
-small {
- font-size: 80%;
-}
-sub,
-sup {
- font-size: 75%;
- line-height: 0;
- position: relative;
- vertical-align: baseline;
-}
-sub {
- bottom: -0.25em;
-}
-sup {
- top: -0.5em;
-}
-img {
- border-style: none;
-}
-button,
-input,
-optgroup,
-select,
-textarea {
- font-family: inherit;
- font-size: 100%;
- line-height: 1.15;
- margin: 0;
-}
-button,
-input {
- overflow: visible;
-}
-button,
-select {
- text-transform: none;
-}
-[type="button"],
-[type="reset"],
-[type="submit"],
-button {
- -webkit-appearance: button;
-}
-[type="button"]::-moz-focus-inner,
-[type="reset"]::-moz-focus-inner,
-[type="submit"]::-moz-focus-inner,
-button::-moz-focus-inner {
- border-style: none;
- padding: 0;
-}
-[type="button"]:-moz-focusring,
-[type="reset"]:-moz-focusring,
-[type="submit"]:-moz-focusring,
-button:-moz-focusring {
- outline: 1px dotted ButtonText;
-}
-fieldset {
- padding: 0.35em 0.75em 0.625em;
-}
-legend {
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
- color: inherit;
- display: table;
- max-width: 100%;
- padding: 0;
- white-space: normal;
-}
-progress {
- vertical-align: baseline;
-}
-textarea {
- overflow: auto;
-}
-[type="checkbox"],
-[type="radio"] {
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
- padding: 0;
-}
-[type="number"]::-webkit-inner-spin-button,
-[type="number"]::-webkit-outer-spin-button {
- height: auto;
-}
-[type="search"] {
- -webkit-appearance: textfield;
- outline-offset: -2px;
-}
-[type="search"]::-webkit-search-decoration {
- -webkit-appearance: none;
-}
-::-webkit-file-upload-button {
- -webkit-appearance: button;
- font: inherit;
-}
-details {
- display: block;
-}
-summary {
- display: list-item;
-}
-template {
- display: none;
-}
-[hidden] {
- display: none;
-}
-html {
- font-family: sans-serif;
-}
-.hidden,
-[hidden] {
- display: none !important;
-}
-.pure-img {
- max-width: 100%;
- height: auto;
- display: block;
-}
-.pure-g {
- letter-spacing: -0.31em;
- text-rendering: optimizespeed;
- font-family: FreeSans, Arimo, "Droid Sans", Helvetica, Arial, sans-serif;
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-flow: row wrap;
- flex-flow: row wrap;
- -ms-flex-line-pack: start;
- align-content: flex-start;
-}
-@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
- table .pure-g {
- display: block;
- }
-}
-.opera-only :-o-prefocus,
-.pure-g {
- word-spacing: -0.43em;
-}
-.pure-u {
- display: inline-block;
- letter-spacing: normal;
- word-spacing: normal;
- vertical-align: top;
- text-rendering: auto;
-}
-.pure-g [class*="pure-u"] {
- font-family: sans-serif;
-}
-.pure-u-1,
-.pure-u-1-1,
-.pure-u-1-12,
-.pure-u-1-2,
-.pure-u-1-24,
-.pure-u-1-3,
-.pure-u-1-4,
-.pure-u-1-5,
-.pure-u-1-6,
-.pure-u-1-8,
-.pure-u-10-24,
-.pure-u-11-12,
-.pure-u-11-24,
-.pure-u-12-24,
-.pure-u-13-24,
-.pure-u-14-24,
-.pure-u-15-24,
-.pure-u-16-24,
-.pure-u-17-24,
-.pure-u-18-24,
-.pure-u-19-24,
-.pure-u-2-24,
-.pure-u-2-3,
-.pure-u-2-5,
-.pure-u-20-24,
-.pure-u-21-24,
-.pure-u-22-24,
-.pure-u-23-24,
-.pure-u-24-24,
-.pure-u-3-24,
-.pure-u-3-4,
-.pure-u-3-5,
-.pure-u-3-8,
-.pure-u-4-24,
-.pure-u-4-5,
-.pure-u-5-12,
-.pure-u-5-24,
-.pure-u-5-5,
-.pure-u-5-6,
-.pure-u-5-8,
-.pure-u-6-24,
-.pure-u-7-12,
-.pure-u-7-24,
-.pure-u-7-8,
-.pure-u-8-24,
-.pure-u-9-24 {
- display: inline-block;
- letter-spacing: normal;
- word-spacing: normal;
- vertical-align: top;
- text-rendering: auto;
-}
-.pure-u-1-24 {
- width: 4.1667%;
-}
-.pure-u-1-12,
-.pure-u-2-24 {
- width: 8.3333%;
-}
-.pure-u-1-8,
-.pure-u-3-24 {
- width: 12.5%;
-}
-.pure-u-1-6,
-.pure-u-4-24 {
- width: 16.6667%;
-}
-.pure-u-1-5 {
- width: 20%;
-}
-.pure-u-5-24 {
- width: 20.8333%;
-}
-.pure-u-1-4,
-.pure-u-6-24 {
- width: 25%;
-}
-.pure-u-7-24 {
- width: 29.1667%;
-}
-.pure-u-1-3,
-.pure-u-8-24 {
- width: 33.3333%;
-}
-.pure-u-3-8,
-.pure-u-9-24 {
- width: 37.5%;
-}
-.pure-u-2-5 {
- width: 40%;
-}
-.pure-u-10-24,
-.pure-u-5-12 {
- width: 41.6667%;
-}
-.pure-u-11-24 {
- width: 45.8333%;
-}
-.pure-u-1-2,
-.pure-u-12-24 {
- width: 50%;
-}
-.pure-u-13-24 {
- width: 54.1667%;
-}
-.pure-u-14-24,
-.pure-u-7-12 {
- width: 58.3333%;
-}
-.pure-u-3-5 {
- width: 60%;
-}
-.pure-u-15-24,
-.pure-u-5-8 {
- width: 62.5%;
-}
-.pure-u-16-24,
-.pure-u-2-3 {
- width: 66.6667%;
-}
-.pure-u-17-24 {
- width: 70.8333%;
-}
-.pure-u-18-24,
-.pure-u-3-4 {
- width: 75%;
-}
-.pure-u-19-24 {
- width: 79.1667%;
-}
-.pure-u-4-5 {
- width: 80%;
-}
-.pure-u-20-24,
-.pure-u-5-6 {
- width: 83.3333%;
-}
-.pure-u-21-24,
-.pure-u-7-8 {
- width: 87.5%;
-}
-.pure-u-11-12,
-.pure-u-22-24 {
- width: 91.6667%;
-}
-.pure-u-23-24 {
- width: 95.8333%;
-}
-.pure-u-1,
-.pure-u-1-1,
-.pure-u-24-24,
-.pure-u-5-5 {
- width: 100%;
-}
-.pure-button {
- display: inline-block;
- line-height: normal;
- white-space: nowrap;
- vertical-align: middle;
- text-align: center;
- cursor: pointer;
- -webkit-user-drag: none;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
-}
-.pure-button::-moz-focus-inner {
- padding: 0;
- border: 0;
-}
-.pure-button-group {
- letter-spacing: -0.31em;
- text-rendering: optimizespeed;
-}
-.opera-only :-o-prefocus,
-.pure-button-group {
- word-spacing: -0.43em;
-}
-.pure-button-group .pure-button {
- letter-spacing: normal;
- word-spacing: normal;
- vertical-align: top;
- text-rendering: auto;
-}
-.pure-button {
- font-family: inherit;
- font-size: 100%;
- padding: 0.5em 1em;
- color: rgba(0, 0, 0, 0.8);
- border: none transparent;
- background-color: #e6e6e6;
- text-decoration: none;
- border-radius: 2px;
-}
-.pure-button-hover,
-.pure-button:focus,
-.pure-button:hover {
- background-image: -webkit-gradient(
- linear,
- left top,
- left bottom,
- from(transparent),
- color-stop(40%, rgba(0, 0, 0, 0.05)),
- to(rgba(0, 0, 0, 0.1))
- );
- background-image: linear-gradient(
- transparent,
- rgba(0, 0, 0, 0.05) 40%,
- rgba(0, 0, 0, 0.1)
- );
-}
-.pure-button:focus {
- outline: 0;
-}
-.pure-button-active,
-.pure-button:active {
- -webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.15) inset,
- 0 0 6px rgba(0, 0, 0, 0.2) inset;
- box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.15) inset,
- 0 0 6px rgba(0, 0, 0, 0.2) inset;
- border-color: #000;
-}
-.pure-button-disabled,
-.pure-button-disabled:active,
-.pure-button-disabled:focus,
-.pure-button-disabled:hover,
-.pure-button[disabled] {
- border: none;
- background-image: none;
- opacity: 0.4;
- cursor: not-allowed;
- -webkit-box-shadow: none;
- box-shadow: none;
- pointer-events: none;
-}
-.pure-button-hidden {
- display: none;
-}
-.pure-button-primary,
-.pure-button-selected,
-a.pure-button-primary,
-a.pure-button-selected {
- background-color: #0078e7;
- color: #fff;
-}
-.pure-button-group .pure-button {
- margin: 0;
- border-radius: 0;
- border-right: 1px solid rgba(0, 0, 0, 0.2);
-}
-.pure-button-group .pure-button:first-child {
- border-top-left-radius: 2px;
- border-bottom-left-radius: 2px;
-}
-.pure-button-group .pure-button:last-child {
- border-top-right-radius: 2px;
- border-bottom-right-radius: 2px;
- border-right: none;
-}
-.pure-form input[type="color"],
-.pure-form input[type="date"],
-.pure-form input[type="datetime-local"],
-.pure-form input[type="datetime"],
-.pure-form input[type="email"],
-.pure-form input[type="month"],
-.pure-form input[type="number"],
-.pure-form input[type="password"],
-.pure-form input[type="search"],
-.pure-form input[type="tel"],
-.pure-form input[type="text"],
-.pure-form input[type="time"],
-.pure-form input[type="url"],
-.pure-form input[type="week"],
-.pure-form select,
-.pure-form textarea {
- padding: 0.5em 0.6em;
- display: inline-block;
- border: 1px solid #ccc;
- -webkit-box-shadow: inset 0 1px 3px #ddd;
- box-shadow: inset 0 1px 3px #ddd;
- border-radius: 4px;
- vertical-align: middle;
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
-}
-.pure-form input:not([type]) {
- padding: 0.5em 0.6em;
- display: inline-block;
- border: 1px solid #ccc;
- -webkit-box-shadow: inset 0 1px 3px #ddd;
- box-shadow: inset 0 1px 3px #ddd;
- border-radius: 4px;
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
-}
-.pure-form input[type="color"] {
- padding: 0.2em 0.5em;
-}
-.pure-form input[type="color"]:focus,
-.pure-form input[type="date"]:focus,
-.pure-form input[type="datetime-local"]:focus,
-.pure-form input[type="datetime"]:focus,
-.pure-form input[type="email"]:focus,
-.pure-form input[type="month"]:focus,
-.pure-form input[type="number"]:focus,
-.pure-form input[type="password"]:focus,
-.pure-form input[type="search"]:focus,
-.pure-form input[type="tel"]:focus,
-.pure-form input[type="text"]:focus,
-.pure-form input[type="time"]:focus,
-.pure-form input[type="url"]:focus,
-.pure-form input[type="week"]:focus,
-.pure-form select:focus,
-.pure-form textarea:focus {
- outline: 0;
- border-color: #129fea;
-}
-.pure-form input:not([type]):focus {
- outline: 0;
- border-color: #129fea;
-}
-.pure-form input[type="checkbox"]:focus,
-.pure-form input[type="file"]:focus,
-.pure-form input[type="radio"]:focus {
- outline: thin solid #129fea;
- outline: 1px auto #129fea;
-}
-.pure-form .pure-checkbox,
-.pure-form .pure-radio {
- margin: 0.5em 0;
- display: block;
-}
-.pure-form input[type="color"][disabled],
-.pure-form input[type="date"][disabled],
-.pure-form input[type="datetime-local"][disabled],
-.pure-form input[type="datetime"][disabled],
-.pure-form input[type="email"][disabled],
-.pure-form input[type="month"][disabled],
-.pure-form input[type="number"][disabled],
-.pure-form input[type="password"][disabled],
-.pure-form input[type="search"][disabled],
-.pure-form input[type="tel"][disabled],
-.pure-form input[type="text"][disabled],
-.pure-form input[type="time"][disabled],
-.pure-form input[type="url"][disabled],
-.pure-form input[type="week"][disabled],
-.pure-form select[disabled],
-.pure-form textarea[disabled] {
- cursor: not-allowed;
- background-color: #eaeded;
- color: #cad2d3;
-}
-.pure-form input:not([type])[disabled] {
- cursor: not-allowed;
- background-color: #eaeded;
- color: #cad2d3;
-}
-.pure-form input[readonly],
-.pure-form select[readonly],
-.pure-form textarea[readonly] {
- background-color: #eee;
- color: #777;
- border-color: #ccc;
-}
-.pure-form input:focus:invalid,
-.pure-form select:focus:invalid,
-.pure-form textarea:focus:invalid {
- color: #b94a48;
- border-color: #e9322d;
-}
-.pure-form input[type="checkbox"]:focus:invalid:focus,
-.pure-form input[type="file"]:focus:invalid:focus,
-.pure-form input[type="radio"]:focus:invalid:focus {
- outline-color: #e9322d;
-}
-.pure-form select {
- height: 2.25em;
- border: 1px solid #ccc;
- background-color: #fff;
-}
-.pure-form select[multiple] {
- height: auto;
-}
-.pure-form label {
- margin: 0.5em 0 0.2em;
-}
-.pure-form fieldset {
- margin: 0;
- padding: 0.35em 0 0.75em;
- border: 0;
-}
-.pure-form legend {
- display: block;
- width: 100%;
- padding: 0.3em 0;
- margin-bottom: 0.3em;
- color: #333;
- border-bottom: 1px solid #e5e5e5;
-}
-.pure-form-stacked input[type="color"],
-.pure-form-stacked input[type="date"],
-.pure-form-stacked input[type="datetime-local"],
-.pure-form-stacked input[type="datetime"],
-.pure-form-stacked input[type="email"],
-.pure-form-stacked input[type="file"],
-.pure-form-stacked input[type="month"],
-.pure-form-stacked input[type="number"],
-.pure-form-stacked input[type="password"],
-.pure-form-stacked input[type="search"],
-.pure-form-stacked input[type="tel"],
-.pure-form-stacked input[type="text"],
-.pure-form-stacked input[type="time"],
-.pure-form-stacked input[type="url"],
-.pure-form-stacked input[type="week"],
-.pure-form-stacked label,
-.pure-form-stacked select,
-.pure-form-stacked textarea {
- display: block;
- margin: 0.25em 0;
-}
-.pure-form-stacked input:not([type]) {
- display: block;
- margin: 0.25em 0;
-}
-.pure-form-aligned input,
-.pure-form-aligned select,
-.pure-form-aligned textarea,
-.pure-form-message-inline {
- display: inline-block;
- vertical-align: middle;
-}
-.pure-form-aligned textarea {
- vertical-align: top;
-}
-.pure-form-aligned .pure-control-group {
- margin-bottom: 0.5em;
-}
-.pure-form-aligned .pure-control-group label {
- text-align: right;
- display: inline-block;
- vertical-align: middle;
- width: 10em;
- margin: 0 1em 0 0;
-}
-.pure-form-aligned .pure-controls {
- margin: 1.5em 0 0 11em;
-}
-.pure-form .pure-input-rounded,
-.pure-form input.pure-input-rounded {
- border-radius: 2em;
- padding: 0.5em 1em;
-}
-.pure-form .pure-group fieldset {
- margin-bottom: 10px;
-}
-.pure-form .pure-group input,
-.pure-form .pure-group textarea {
- display: block;
- padding: 10px;
- margin: 0 0 -1px;
- border-radius: 0;
- position: relative;
- top: -1px;
-}
-.pure-form .pure-group input:focus,
-.pure-form .pure-group textarea:focus {
- z-index: 3;
-}
-.pure-form .pure-group input:first-child,
-.pure-form .pure-group textarea:first-child {
- top: 1px;
- border-radius: 4px 4px 0 0;
- margin: 0;
-}
-.pure-form .pure-group input:first-child:last-child,
-.pure-form .pure-group textarea:first-child:last-child {
- top: 1px;
- border-radius: 4px;
- margin: 0;
-}
-.pure-form .pure-group input:last-child,
-.pure-form .pure-group textarea:last-child {
- top: -2px;
- border-radius: 0 0 4px 4px;
- margin: 0;
-}
-.pure-form .pure-group button {
- margin: 0.35em 0;
-}
-.pure-form .pure-input-1 {
- width: 100%;
-}
-.pure-form .pure-input-3-4 {
- width: 75%;
-}
-.pure-form .pure-input-2-3 {
- width: 66%;
-}
-.pure-form .pure-input-1-2 {
- width: 50%;
-}
-.pure-form .pure-input-1-3 {
- width: 33%;
-}
-.pure-form .pure-input-1-4 {
- width: 25%;
-}
-.pure-form-message-inline {
- display: inline-block;
- padding-left: 0.3em;
- color: #666;
- vertical-align: middle;
- font-size: 0.875em;
-}
-.pure-form-message {
- display: block;
- color: #666;
- font-size: 0.875em;
-}
-@media only screen and (max-width: 480px) {
- .pure-form button[type="submit"] {
- margin: 0.7em 0 0;
- }
- .pure-form input:not([type]),
- .pure-form input[type="color"],
- .pure-form input[type="date"],
- .pure-form input[type="datetime-local"],
- .pure-form input[type="datetime"],
- .pure-form input[type="email"],
- .pure-form input[type="month"],
- .pure-form input[type="number"],
- .pure-form input[type="password"],
- .pure-form input[type="search"],
- .pure-form input[type="tel"],
- .pure-form input[type="text"],
- .pure-form input[type="time"],
- .pure-form input[type="url"],
- .pure-form input[type="week"],
- .pure-form label {
- margin-bottom: 0.3em;
- display: block;
- }
- .pure-group input:not([type]),
- .pure-group input[type="color"],
- .pure-group input[type="date"],
- .pure-group input[type="datetime-local"],
- .pure-group input[type="datetime"],
- .pure-group input[type="email"],
- .pure-group input[type="month"],
- .pure-group input[type="number"],
- .pure-group input[type="password"],
- .pure-group input[type="search"],
- .pure-group input[type="tel"],
- .pure-group input[type="text"],
- .pure-group input[type="time"],
- .pure-group input[type="url"],
- .pure-group input[type="week"] {
- margin-bottom: 0;
- }
- .pure-form-aligned .pure-control-group label {
- margin-bottom: 0.3em;
- text-align: left;
- display: block;
- width: 100%;
- }
- .pure-form-aligned .pure-controls {
- margin: 1.5em 0 0 0;
- }
- .pure-form-message,
- .pure-form-message-inline {
- display: block;
- font-size: 0.75em;
- padding: 0.2em 0 0.8em;
- }
-}
-.pure-menu {
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
-}
-.pure-menu-fixed {
- position: fixed;
- left: 0;
- top: 0;
- z-index: 3;
-}
-.pure-menu-item,
-.pure-menu-list {
- position: relative;
-}
-.pure-menu-list {
- list-style: none;
- margin: 0;
- padding: 0;
-}
-.pure-menu-item {
- padding: 0;
- margin: 0;
- height: 100%;
-}
-.pure-menu-heading,
-.pure-menu-link {
- display: block;
- text-decoration: none;
- white-space: nowrap;
-}
-.pure-menu-horizontal {
- width: 100%;
- white-space: nowrap;
-}
-.pure-menu-horizontal .pure-menu-list {
- display: inline-block;
-}
-.pure-menu-horizontal .pure-menu-heading,
-.pure-menu-horizontal .pure-menu-item,
-.pure-menu-horizontal .pure-menu-separator {
- display: inline-block;
- vertical-align: middle;
-}
-.pure-menu-item .pure-menu-item {
- display: block;
-}
-.pure-menu-children {
- display: none;
- position: absolute;
- left: 100%;
- top: 0;
- margin: 0;
- padding: 0;
- z-index: 3;
-}
-.pure-menu-horizontal .pure-menu-children {
- left: 0;
- top: auto;
- width: inherit;
-}
-.pure-menu-active > .pure-menu-children,
-.pure-menu-allow-hover:hover > .pure-menu-children {
- display: block;
- position: absolute;
-}
-.pure-menu-has-children > .pure-menu-link:after {
- padding-left: 0.5em;
- content: "\25B8";
- font-size: small;
-}
-.pure-menu-horizontal .pure-menu-has-children > .pure-menu-link:after {
- content: "\25BE";
-}
-.pure-menu-scrollable {
- overflow-y: scroll;
- overflow-x: hidden;
-}
-.pure-menu-scrollable .pure-menu-list {
- display: block;
-}
-.pure-menu-horizontal.pure-menu-scrollable .pure-menu-list {
- display: inline-block;
-}
-.pure-menu-horizontal.pure-menu-scrollable {
- white-space: nowrap;
- overflow-y: hidden;
- overflow-x: auto;
- padding: 0.5em 0;
-}
-.pure-menu-horizontal .pure-menu-children .pure-menu-separator,
-.pure-menu-separator {
- background-color: #ccc;
- height: 1px;
- margin: 0.3em 0;
-}
-.pure-menu-horizontal .pure-menu-separator {
- width: 1px;
- height: 1.3em;
- margin: 0 0.3em;
-}
-.pure-menu-horizontal .pure-menu-children .pure-menu-separator {
- display: block;
- width: auto;
-}
-.pure-menu-heading {
- text-transform: uppercase;
- color: #565d64;
-}
-.pure-menu-link {
- color: #777;
-}
-.pure-menu-children {
- background-color: #fff;
-}
-.pure-menu-disabled,
-.pure-menu-heading,
-.pure-menu-link {
- padding: 0.5em 1em;
-}
-.pure-menu-disabled {
- opacity: 0.5;
-}
-.pure-menu-disabled .pure-menu-link:hover {
- background-color: transparent;
-}
-.pure-menu-active > .pure-menu-link,
-.pure-menu-link:focus,
-.pure-menu-link:hover {
- background-color: #eee;
-}
-.pure-menu-selected > .pure-menu-link,
-.pure-menu-selected > .pure-menu-link:visited {
- color: #000;
-}
-.pure-table {
- border-collapse: collapse;
- border-spacing: 0;
- empty-cells: show;
- border: 1px solid #cbcbcb;
-}
-.pure-table caption {
- color: #000;
- font: italic 85%/1 arial, sans-serif;
- padding: 1em 0;
- text-align: center;
-}
-.pure-table td,
-.pure-table th {
- border-left: 1px solid #cbcbcb;
- border-width: 0 0 0 1px;
- font-size: inherit;
- margin: 0;
- overflow: visible;
- padding: 0.5em 1em;
-}
-.pure-table thead {
- background-color: #e0e0e0;
- color: #000;
- text-align: left;
- vertical-align: bottom;
-}
-.pure-table td {
- background-color: transparent;
-}
-.pure-table-odd td {
- background-color: #f2f2f2;
-}
-.pure-table-striped tr:nth-child(2n-1) td {
- background-color: #f2f2f2;
-}
-.pure-table-bordered td {
- border-bottom: 1px solid #cbcbcb;
-}
-.pure-table-bordered tbody > tr:last-child > td {
- border-bottom-width: 0;
-}
-.pure-table-horizontal td,
-.pure-table-horizontal th {
- border-width: 0 0 1px 0;
- border-bottom: 1px solid #cbcbcb;
-}
-.pure-table-horizontal tbody > tr:last-child > td {
- border-bottom-width: 0;
-}
diff --git a/packages/merchant-backend-ui/src/css/style.css b/packages/merchant-backend-ui/src/css/style.css
@@ -1,61 +0,0 @@
-/*!
- Pure v2.0.3
- Copyright 2013 Yahoo!
- Licensed under the BSD License.
- https://github.com/pure-ss/pure/blob/master/LICENSE.md
-*/
-/*!
- normalize.cs v | MIT License | git.io/normalize
- Copyright (c) Nicolas Gallagher and Jonathan Neal
-*/
-/*! normalize.ss v8.0.1 | MIT License | github.com/necolas/normalize.cs */
-
-.talerbar {
- text-align: center;
-}
-.tt {
- font-family: "Lucida Console", Monaco, monospace;
-}
-.content {
- overflow-x: auto;
- padding-left: 15%;
- padding-right: 15%;
-}
-.qr {
- margin: auto;
- text-align: center;
-}
-.qrtext {
- width: max-content;
- margin: auto;
- transition: font-size 0.2s;
- font-family: "Lucida Console", Monaco, monospace;
- font-size: 0.5em;
-}
-.qrtext:hover {
- font-size: 1em;
-}
-.talerbar {
- margin: 0;
- bottom: 0;
- background-color: #033;
- color: white;
- width: 100%;
- padding: 1em;
- overflow: auto;
-}
-body {
- overflow-y: scroll;
-}
-@media (min-width: 500px) {
- .content {
- padding-bottom: 2em;
- overflow-y: auto;
- }
-}
-#main a:link,
-#main a:visited,
-#main a:hover,
-#main a:active {
- color: black;
-}
-\ No newline at end of file
diff --git a/packages/merchant-backend-ui/src/custom.d.ts b/packages/merchant-backend-ui/src/custom.d.ts
@@ -1,55 +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/>
- */
-
-declare module '*.po' {
- const content: any;
- export default content;
-}
-
-declare module 'jed' {
- const x: any;
- export = x;
-}
-
-declare module "*.jpeg" {
- const content: any;
- export default content;
-}
-
-declare module "*.png" {
- const content: any;
- export default content;
-}
-
-declare module '*.svg' {
- const content: any;
- export default content;
-}
-
-declare module '*.scss' {
- const content: Record<string, string>;
- export default content;
-}
-
-declare module '*.css' {
- const content: Record<string, string>;
- export default content;
-}
-
-declare module '*.module.css' {
- const classes: { [key: string]: string };
- export default classes;
-}
diff --git a/packages/merchant-backend-ui/src/declaration.d.ts b/packages/merchant-backend-ui/src/declaration.d.ts
@@ -1,1387 +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)
-*/
-
-
-type HashCode = string;
-type EddsaPublicKey = string;
-type EddsaSignature = string;
-type WireTransferIdentifierRawP = string;
-type RelativeTime = Duration;
-type ImageDataUrl = string;
-
-export interface WithId {
- id: string
-}
-
-interface Timestamp {
- // Milliseconds since epoch, or the special
- // value "forever" to represent an event that will
- // never happen.
- t_s: number | "never";
-}
-interface Duration {
- // Duration in milliseconds or "forever"
- // to represent an infinite duration.
- d_us: number | "forever";
-}
-
-interface WithId {
- id: string;
-}
-
-type Amount = string;
-type UUID = string;
-type Integer = number;
-type TalerProtocolTimestamp = {
- t_s: number | "never"
-}
-export namespace ExchangeBackend {
- interface WireResponse {
-
- // Master public key of the exchange, must match the key returned in /keys.
- master_public_key: EddsaPublicKey;
-
- // Array of wire accounts operated by the exchange for
- // incoming wire transfers.
- accounts: WireAccount[];
-
- // Object mapping names of wire methods (i.e. "sepa" or "x-taler-bank")
- // to wire fees.
- fees: { method: AggregateTransferFee };
- }
- interface WireAccount {
- // payto:// URI identifying the account and wire method
- payto_uri: string;
-
- // Signature using the exchange's offline key
- // with purpose TALER_SIGNATURE_MASTER_WIRE_DETAILS.
- master_sig: EddsaSignature;
- }
- interface AggregateTransferFee {
- // Per transfer wire transfer fee.
- wire_fee: Amount;
-
- // Per transfer closing fee.
- closing_fee: Amount;
-
- // What date (inclusive) does this fee go into effect?
- // The different fees must cover the full time period in which
- // any of the denomination keys are valid without overlap.
- start_date: TalerProtocolTimestamp;
-
- // What date (exclusive) does this fee stop going into effect?
- // The different fees must cover the full time period in which
- // any of the denomination keys are valid without overlap.
- end_date: TalerProtocolTimestamp;
-
- // Signature of TALER_MasterWireFeePS with
- // purpose TALER_SIGNATURE_MASTER_WIRE_FEES.
- sig: EddsaSignature;
- }
-
-}
-export namespace MerchantBackend {
- interface ErrorDetail {
-
- // Numeric error code unique to the condition.
- // The other arguments are specific to the error value reported here.
- code: number;
-
- // Human-readable description of the error, i.e. "missing parameter", "commitment violation", ...
- // Should give a human-readable hint about the error's nature. Optional, may change without notice!
- hint?: string;
-
- // Optional detail about the specific input value that failed. May change without notice!
- detail?: string;
-
- // Name of the parameter that was bogus (if applicable).
- parameter?: string;
-
- // Path to the argument that was bogus (if applicable).
- path?: string;
-
- // Offset of the argument that was bogus (if applicable).
- offset?: string;
-
- // Index of the argument that was bogus (if applicable).
- index?: string;
-
- // Name of the object that was bogus (if applicable).
- object?: string;
-
- // Name of the currency than was problematic (if applicable).
- currency?: string;
-
- // Expected type (if applicable).
- type_expected?: string;
-
- // Type that was provided instead (if applicable).
- type_actual?: string;
- }
-
-
- // Delivery location, loosely modeled as a subset of
- // ISO20022's PostalAddress25.
- interface Tax {
- // the name of the tax
- name: string;
-
- // amount paid in tax
- tax: Amount;
- }
-
- interface Auditor {
- // official name
- name: string;
-
- // Auditor's public key
- auditor_pub: EddsaPublicKey;
-
- // Base URL of the auditor
- url: string;
- }
- interface Exchange {
- // the exchange's base URL
- url: string;
-
- // master public key of the exchange
- master_pub: EddsaPublicKey;
- }
-
- interface Product {
- // merchant-internal identifier for the product.
- product_id?: string;
-
- // Human-readable product description.
- description: string;
-
- // Map from IETF BCP 47 language tags to localized descriptions
- description_i18n?: { [lang_tag: string]: string };
-
- // The number of units of the product to deliver to the customer.
- quantity: Integer;
-
- // The unit in which the product is measured (liters, kilograms, packages, etc.)
- unit: string;
-
- // The price of the product; this is the total price for quantity times unit of this product.
- price: Amount;
-
- // An optional base64-encoded product image
- image: ImageDataUrl;
-
- // a list of taxes paid by the merchant for this product. Can be empty.
- taxes: Tax[];
-
- // time indicating when this product should be delivered
- delivery_date?: Timestamp;
- }
- interface Merchant {
- // label for a location with the business address of the merchant
- address: Location;
-
- // the merchant's legal name of business
- name: string;
-
- // label for a location that denotes the jurisdiction for disputes.
- // Some of the typical fields for a location (such as a street address) may be absent.
- jurisdiction: Location;
- }
-
- interface VersionResponse {
- // libtool-style representation of the Merchant protocol version, see
- // https://www.gnu.org/software/libtool/manual/html_node/Versioning.html#Versioning
- // The format is "current:revision:age".
- version: string;
-
- // Name of the protocol.
- name: "taler-merchant";
-
- // Currency supported by this backend.
- currency: string;
-
- }
- interface Location {
- // Nation with its own government.
- country?: string;
-
- // Identifies a subdivision of a country such as state, region, county.
- country_subdivision?: string;
-
- // Identifies a subdivision within a country sub-division.
- district?: string;
-
- // Name of a built-up area, with defined boundaries, and a local government.
- town?: string;
-
- // Specific location name within the town.
- town_location?: string;
-
- // Identifier consisting of a group of letters and/or numbers that
- // is added to a postal address to assist the sorting of mail.
- post_code?: string;
-
- // Name of a street or thoroughfare.
- street?: string;
-
- // Name of the building or house.
- building_name?: string;
-
- // Number that identifies the position of a building on a street.
- building_number?: string;
-
- // Free-form address lines, should not exceed 7 elements.
- address_lines?: string[];
- }
- namespace Instances {
-
- //POST /private/instances/$INSTANCE/auth
- interface InstanceAuthConfigurationMessage {
- // Type of authentication.
- // "external": The mechant backend does not do
- // any authentication checks. Instead an API
- // gateway must do the authentication.
- // "token": The merchant checks an auth token.
- // See "token" for details.
- method: "external" | "token";
-
- // For method "external", this field is mandatory.
- // The token MUST begin with the string "secret-token:".
- // After the auth token has been set (with method "token"),
- // the value must be provided in a "Authorization: Bearer $token"
- // header.
- token?: string;
-
- }
- //POST /private/instances
- interface InstanceConfigurationMessage {
- // The URI where the wallet will send coins. A merchant may have
- // multiple accounts, thus this is an array. Note that by
- // removing URIs from this list the respective account is set to
- // inactive and thus unavailable for new contracts, but preserved
- // in the database as existing offers and contracts may still refer
- // to it.
- payto_uris: string[];
-
- // Name of the merchant instance to create (will become $INSTANCE).
- id: string;
-
- // Merchant name corresponding to this instance.
- name: string;
-
- // "Authentication" header required to authorize management access the instance.
- // Optional, if not given authentication will be disabled for
- // this instance (hopefully authentication checks are still
- // done by some reverse proxy).
- auth: InstanceAuthConfigurationMessage;
-
- // The merchant's physical address (to be put into contracts).
- address: Location;
-
- // The jurisdiction under which the merchant conducts its business
- // (to be put into contracts).
- jurisdiction: Location;
-
- // Maximum wire fee this instance is willing to pay.
- // Can be overridden by the frontend on a per-order basis.
- default_max_wire_fee: Amount;
-
- // Default factor for wire fee amortization calculations.
- // Can be overridden by the frontend on a per-order basis.
- default_wire_fee_amortization: Integer;
-
- // Maximum deposit fee (sum over all coins) this instance is willing to pay.
- // Can be overridden by the frontend on a per-order basis.
- default_max_deposit_fee: Amount;
-
- // If the frontend does NOT specify an execution date, how long should
- // we tell the exchange to wait to aggregate transactions before
- // executing the wire transfer? This delay is added to the current
- // time when we generate the advisory execution time for the exchange.
- default_wire_transfer_delay: RelativeTime;
-
- // If the frontend does NOT specify a payment deadline, how long should
- // offers we make be valid by default?
- default_pay_delay: RelativeTime;
-
- }
-
- // PATCH /private/instances/$INSTANCE
- interface InstanceReconfigurationMessage {
- // The URI where the wallet will send coins. A merchant may have
- // multiple accounts, thus this is an array. Note that by
- // removing URIs from this list
- payto_uris: string[];
-
- // Merchant name corresponding to this instance.
- name: string;
-
- // The merchant's physical address (to be put into contracts).
- address: Location;
-
- // The jurisdiction under which the merchant conducts its business
- // (to be put into contracts).
- jurisdiction: Location;
-
- // Maximum wire fee this instance is willing to pay.
- // Can be overridden by the frontend on a per-order basis.
- default_max_wire_fee: Amount;
-
- // Default factor for wire fee amortization calculations.
- // Can be overridden by the frontend on a per-order basis.
- default_wire_fee_amortization: Integer;
-
- // Maximum deposit fee (sum over all coins) this instance is willing to pay.
- // Can be overridden by the frontend on a per-order basis.
- default_max_deposit_fee: Amount;
-
- // If the frontend does NOT specify an execution date, how long should
- // we tell the exchange to wait to aggregate transactions before
- // executing the wire transfer? This delay is added to the current
- // time when we generate the advisory execution time for the exchange.
- default_wire_transfer_delay: RelativeTime;
-
- // If the frontend does NOT specify a payment deadline, how long should
- // offers we make be valid by default?
- default_pay_delay: RelativeTime;
-
- }
-
- // GET /private/instances
- interface InstancesResponse {
- // List of instances that are present in the backend (see Instance)
- instances: Instance[];
- }
-
- interface Instance {
- // Merchant name corresponding to this instance.
- name: string;
-
- deleted?: boolean;
-
- // Merchant instance this response is about ($INSTANCE)
- id: string;
-
- // Public key of the merchant/instance, in Crockford Base32 encoding.
- merchant_pub: EddsaPublicKey;
-
- // List of the payment targets supported by this instance. Clients can
- // specify the desired payment target in /order requests. Note that
- // front-ends do not have to support wallets selecting payment targets.
- payment_targets: string[];
-
- }
-
- //GET /private/instances/$INSTANCE
- interface QueryInstancesResponse {
- // The URI where the wallet will send coins. A merchant may have
- // multiple accounts, thus this is an array.
- accounts: MerchantAccount[];
-
- // Merchant name corresponding to this instance.
- name: string;
-
- // Public key of the merchant/instance, in Crockford Base32 encoding.
- merchant_pub: EddsaPublicKey;
-
- // The merchant's physical address (to be put into contracts).
- address: Location;
-
- // The jurisdiction under which the merchant conducts its business
- // (to be put into contracts).
- jurisdiction: Location;
-
- // Maximum wire fee this instance is willing to pay.
- // Can be overridden by the frontend on a per-order basis.
- default_max_wire_fee: Amount;
-
- // Default factor for wire fee amortization calculations.
- // Can be overridden by the frontend on a per-order basis.
- default_wire_fee_amortization: Integer;
-
- // Maximum deposit fee (sum over all coins) this instance is willing to pay.
- // Can be overridden by the frontend on a per-order basis.
- default_max_deposit_fee: Amount;
-
- // If the frontend does NOT specify an execution date, how long should
- // we tell the exchange to wait to aggregate transactions before
- // executing the wire transfer? This delay is added to the current
- // time when we generate the advisory execution time for the exchange.
- default_wire_transfer_delay: RelativeTime;
-
- // If the frontend does NOT specify a payment deadline, how long should
- // offers we make be valid by default?
- default_pay_delay: RelativeTime;
-
- // Authentication configuration.
- // Does not contain the token when token auth is configured.
- auth: {
- method: "external" | "token";
- };
- }
-
- interface MerchantAccount {
-
- // payto:// URI of the account.
- payto_uri: string;
-
- // Hash over the wire details (including over the salt)
- h_wire: HashCode;
-
- // salt used to compute h_wire
- salt: HashCode;
-
- // true if this account is active,
- // false if it is historic.
- active: boolean;
- }
-
- // DELETE /private/instances/$INSTANCE
-
-
- }
-
- namespace Products {
- // POST /private/products
- interface ProductAddDetail {
-
- // product ID to use.
- product_id: string;
-
- // Human-readable product description.
- description: string;
-
- // Map from IETF BCP 47 language tags to localized descriptions
- description_i18n: { [lang_tag: string]: string };
-
- // unit in which the product is measured (liters, kilograms, packages, etc.)
- unit: string;
-
- // The price for one unit of the product. Zero is used
- // to imply that this product is not sold separately, or
- // that the price is not fixed, and must be supplied by the
- // front-end. If non-zero, this price MUST include applicable
- // taxes.
- price: Amount;
-
- // An optional base64-encoded product image
- image: ImageDataUrl;
-
- // a list of taxes paid by the merchant for one unit of this product
- taxes: Tax[];
-
- // Number of units of the product in stock in sum in total,
- // including all existing sales ever. Given in product-specific
- // units.
- // A value of -1 indicates "infinite" (i.e. for "electronic" books).
- total_stock: Integer;
-
- // Identifies where the product is in stock.
- address: Location;
-
- // Identifies when we expect the next restocking to happen.
- next_restock?: Timestamp;
-
- }
- // PATCH /private/products/$PRODUCT_ID
- interface ProductPatchDetail {
-
- // Human-readable product description.
- description: string;
-
- // Map from IETF BCP 47 language tags to localized descriptions
- description_i18n: { [lang_tag: string]: string };
-
- // unit in which the product is measured (liters, kilograms, packages, etc.)
- unit: string;
-
- // The price for one unit of the product. Zero is used
- // to imply that this product is not sold separately, or
- // that the price is not fixed, and must be supplied by the
- // front-end. If non-zero, this price MUST include applicable
- // taxes.
- price: Amount;
-
- // An optional base64-encoded product image
- image: ImageDataUrl;
-
- // a list of taxes paid by the merchant for one unit of this product
- taxes: Tax[];
-
- // Number of units of the product in stock in sum in total,
- // including all existing sales ever. Given in product-specific
- // units.
- // A value of -1 indicates "infinite" (i.e. for "electronic" books).
- total_stock: Integer;
-
- // Number of units of the product that were lost (spoiled, stolen, etc.)
- total_lost: Integer;
-
- // Identifies where the product is in stock.
- address: Location;
-
- // Identifies when we expect the next restocking to happen.
- next_restock?: Timestamp;
-
- }
-
- // GET /private/products
- interface InventorySummaryResponse {
- // List of products that are present in the inventory
- products: InventoryEntry[];
- }
- interface InventoryEntry {
- // Product identifier, as found in the product.
- product_id: string;
-
- }
-
- // GET /private/products/$PRODUCT_ID
- interface ProductDetail {
-
- // Human-readable product description.
- description: string;
-
- // Map from IETF BCP 47 language tags to localized descriptions
- description_i18n: { [lang_tag: string]: string };
-
- // unit in which the product is measured (liters, kilograms, packages, etc.)
- unit: string;
-
- // The price for one unit of the product. Zero is used
- // to imply that this product is not sold separately, or
- // that the price is not fixed, and must be supplied by the
- // front-end. If non-zero, this price MUST include applicable
- // taxes.
- price: Amount;
-
- // An optional base64-encoded product image
- image: ImageDataUrl;
-
- // a list of taxes paid by the merchant for one unit of this product
- taxes: Tax[];
-
- // Number of units of the product in stock in sum in total,
- // including all existing sales ever. Given in product-specific
- // units.
- // A value of -1 indicates "infinite" (i.e. for "electronic" books).
- total_stock: Integer;
-
- // Number of units of the product that have already been sold.
- total_sold: Integer;
-
- // Number of units of the product that were lost (spoiled, stolen, etc.)
- total_lost: Integer;
-
- // Identifies where the product is in stock.
- address: Location;
-
- // Identifies when we expect the next restocking to happen.
- next_restock?: Timestamp;
-
- }
-
- // POST /private/products/$PRODUCT_ID/lock
- interface LockRequest {
-
- // UUID that identifies the frontend performing the lock
- // It is suggested that clients use a timeflake for this,
- // see https://github.com/anthonynsimon/timeflake
- lock_uuid: UUID;
-
- // How long does the frontend intend to hold the lock
- duration: RelativeTime;
-
- // How many units should be locked?
- quantity: Integer;
-
- }
-
- // DELETE /private/products/$PRODUCT_ID
-
- }
-
- namespace Orders {
-
- type MerchantOrderStatusResponse = CheckPaymentPaidResponse |
- CheckPaymentClaimedResponse |
- CheckPaymentUnpaidResponse;
- interface CheckPaymentPaidResponse {
- // The customer paid for this contract.
- order_status: "paid";
-
- // Was the payment refunded (even partially)?
- refunded: boolean;
-
- // True if there are any approved refunds that the wallet has
- // not yet obtained.
- refund_pending: boolean;
-
- // Did the exchange wire us the funds?
- wired: boolean;
-
- // Total amount the exchange deposited into our bank account
- // for this contract, excluding fees.
- deposit_total: Amount;
-
- // Numeric error code indicating errors the exchange
- // encountered tracking the wire transfer for this purchase (before
- // we even got to specific coin issues).
- // 0 if there were no issues.
- exchange_ec: number;
-
- // HTTP status code returned by the exchange when we asked for
- // information to track the wire transfer for this purchase.
- // 0 if there were no issues.
- exchange_hc: number;
-
- // Total amount that was refunded, 0 if refunded is false.
- refund_amount: Amount;
-
- // Contract terms.
- contract_terms: ContractTerms;
-
- // The wire transfer status from the exchange for this order if
- // available, otherwise empty array.
- wire_details: TransactionWireTransfer[];
-
- // Reports about trouble obtaining wire transfer details,
- // empty array if no trouble were encountered.
- wire_reports: TransactionWireReport[];
-
- // The refund details for this order. One entry per
- // refunded coin; empty array if there are no refunds.
- refund_details: RefundDetails[];
-
- // Status URL, can be used as a redirect target for the browser
- // to show the order QR code / trigger the wallet.
- order_status_url: string;
- }
- interface CheckPaymentClaimedResponse {
- // A wallet claimed the order, but did not yet pay for the contract.
- order_status: "claimed";
-
- // Contract terms.
- contract_terms: ContractTerms;
-
- }
- interface CheckPaymentUnpaidResponse {
- // The order was neither claimed nor paid.
- order_status: "unpaid";
-
- // when was the order created
- creation_time: Timestamp;
-
- // Order summary text.
- summary: string;
-
- // Total amount of the order (to be paid by the customer).
- total_amount: Amount;
-
- // URI that the wallet must process to complete the payment.
- taler_pay_uri: string;
-
- // Alternative order ID which was paid for already in the same session.
- // Only given if the same product was purchased before in the same session.
- already_paid_order_id?: string;
-
- // Fulfillment URL of an already paid order. Only given if under this
- // session an already paid order with a fulfillment URL exists.
- already_paid_fulfillment_url?: string;
-
- // Status URL, can be used as a redirect target for the browser
- // to show the order QR code / trigger the wallet.
- order_status_url: string;
-
- // We do we NOT return the contract terms here because they may not
- // exist in case the wallet did not yet claim them.
- }
- interface RefundDetails {
- // Reason given for the refund.
- reason: string;
-
- // When was the refund approved.
- timestamp: Timestamp;
-
- // Total amount that was refunded (minus a refund fee).
- amount: Amount;
- }
- interface TransactionWireTransfer {
- // Responsible exchange.
- exchange_url: string;
-
- // 32-byte wire transfer identifier.
- wtid: Base32;
-
- // Execution time of the wire transfer.
- execution_time: Timestamp;
-
- // Total amount that has been wire transferred
- // to the merchant.
- amount: Amount;
-
- // Was this transfer confirmed by the merchant via the
- // POST /transfers API, or is it merely claimed by the exchange?
- confirmed: boolean;
- }
- interface TransactionWireReport {
- // Numerical error code.
- code: number;
-
- // Human-readable error description.
- hint: string;
-
- // Numerical error code from the exchange.
- exchange_ec: number;
-
- // HTTP status code received from the exchange.
- exchange_hc: number;
-
- // Public key of the coin for which we got the exchange error.
- coin_pub: CoinPublicKey;
- }
-
- interface OrderHistory {
- // timestamp-sorted array of all orders matching the query.
- // The order of the sorting depends on the sign of delta.
- orders: OrderHistoryEntry[];
- }
- interface OrderHistoryEntry {
-
- // order ID of the transaction related to this entry.
- order_id: string;
-
- // row ID of the order in the database
- row_id: number;
-
- // when the order was created
- timestamp: Timestamp;
-
- // the amount of money the order is for
- amount: Amount;
-
- // the summary of the order
- summary: string;
-
- // whether some part of the order is refundable,
- // that is the refund deadline has not yet expired
- // and the total amount refunded so far is below
- // the value of the original transaction.
- refundable: boolean;
-
- // whether the order has been paid or not
- paid: boolean;
- }
-
- interface PostOrderRequest {
- // The order must at least contain the minimal
- // order detail, but can override all
- order: Order;
-
- // if set, the backend will then set the refund deadline to the current
- // time plus the specified delay. If it's not set, refunds will not be
- // possible.
- refund_delay?: RelativeTime;
-
- // specifies the payment target preferred by the client. Can be used
- // to select among the various (active) wire methods supported by the instance.
- payment_target?: string;
-
- // specifies that some products are to be included in the
- // order from the inventory. For these inventory management
- // is performed (so the products must be in stock) and
- // details are completed from the product data of the backend.
- inventory_products?: MinimalInventoryProduct[];
-
- // Specifies a lock identifier that was used to
- // lock a product in the inventory. Only useful if
- // manage_inventory is set. Used in case a frontend
- // reserved quantities of the individual products while
- // the shopping card was being built. Multiple UUIDs can
- // be used in case different UUIDs were used for different
- // products (i.e. in case the user started with multiple
- // shopping sessions that were combined during checkout).
- lock_uuids?: UUID[];
-
- // Should a token for claiming the order be generated?
- // False can make sense if the ORDER_ID is sufficiently
- // high entropy to prevent adversarial claims (like it is
- // if the backend auto-generates one). Default is 'true'.
- create_token?: boolean;
-
- }
- type Order = MinimalOrderDetail | ContractTerms;
-
- interface MinimalOrderDetail {
- // Amount to be paid by the customer
- amount: Amount;
-
- // Short summary of the order
- summary: string;
-
- // URL that will show that the order was successful after
- // it has been paid for. Optional. When POSTing to the
- // merchant, the placeholder "${ORDER_ID}" will be
- // replaced with the actual order ID (useful if the
- // order ID is generated server-side and needs to be
- // in the URL).
- fulfillment_url?: string;
- }
-
- interface MinimalInventoryProduct {
- // Which product is requested (here mandatory!)
- product_id: string;
-
- // How many units of the product are requested
- quantity: Integer;
- }
- interface PostOrderResponse {
- // Order ID of the response that was just created
- order_id: string;
-
- // Token that authorizes the wallet to claim the order.
- // Provided only if "create_token" was set to 'true'
- // in the request.
- token?: ClaimToken;
- }
- interface OutOfStockResponse {
-
- // Product ID of an out-of-stock item
- product_id: string;
-
- // Requested quantity
- requested_quantity: Integer;
-
- // Available quantity (must be below requested_quanitity)
- available_quantity: Integer;
-
- // When do we expect the product to be again in stock?
- // Optional, not given if unknown.
- restock_expected?: Timestamp;
- }
-
- interface ForgetRequest {
-
- // Array of valid JSON paths to forgettable fields in the order's
- // contract terms.
- fields: string[];
- }
- interface RefundRequest {
- // Amount to be refunded
- refund: Amount;
-
- // Human-readable refund justification
- reason: string;
- }
- interface MerchantRefundResponse {
-
- // URL (handled by the backend) that the wallet should access to
- // trigger refund processing.
- // taler://refund/...
- taler_refund_uri: string;
-
- // Contract hash that a client may need to authenticate an
- // HTTP request to obtain the above URI in a wallet-friendly way.
- h_contract: HashCode;
- }
-
- }
-
- namespace Tips {
-
- // GET /private/reserves
- interface TippingReserveStatus {
- // Array of all known reserves (possibly empty!)
- reserves: ReserveStatusEntry[];
- }
- interface ReserveStatusEntry {
- // Public key of the reserve
- reserve_pub: EddsaPublicKey;
-
- // Timestamp when it was established
- creation_time: Timestamp;
-
- // Timestamp when it expires
- expiration_time: Timestamp;
-
- // Initial amount as per reserve creation call
- merchant_initial_amount: Amount;
-
- // Initial amount as per exchange, 0 if exchange did
- // not confirm reserve creation yet.
- exchange_initial_amount: Amount;
-
- // Amount picked up so far.
- pickup_amount: Amount;
-
- // Amount approved for tips that exceeds the pickup_amount.
- committed_amount: Amount;
-
- // Is this reserve active (false if it was deleted but not purged)
- active: boolean;
- }
-
- interface ReserveCreateRequest {
- // Amount that the merchant promises to put into the reserve
- initial_balance: Amount;
-
- // Exchange the merchant intends to use for tipping
- exchange_url: string;
-
- // Desired wire method, for example "iban" or "x-taler-bank"
- wire_method: string;
- }
- interface ReserveCreateConfirmation {
- // Public key identifying the reserve
- reserve_pub: EddsaPublicKey;
-
- // Wire account of the exchange where to transfer the funds
- payto_uri: string;
- }
- interface TipCreateRequest {
- // Amount that the customer should be tipped
- amount: Amount;
-
- // Justification for giving the tip
- justification: string;
-
- // URL that the user should be directed to after tipping,
- // will be included in the tip_token.
- next_url: string;
- }
- interface TipCreateConfirmation {
- // Unique tip identifier for the tip that was created.
- tip_id: HashCode;
-
- // taler://tip URI for the tip
- taler_tip_uri: string;
-
- // URL that will directly trigger processing
- // the tip when the browser is redirected to it
- tip_status_url: string;
-
- // when does the tip expire
- tip_expiration: Timestamp;
- }
-
- interface ReserveDetail {
- // Timestamp when it was established.
- creation_time: Timestamp;
-
- // Timestamp when it expires.
- expiration_time: Timestamp;
-
- // Initial amount as per reserve creation call.
- merchant_initial_amount: Amount;
-
- // Initial amount as per exchange, 0 if exchange did
- // not confirm reserve creation yet.
- exchange_initial_amount: Amount;
-
- // Amount picked up so far.
- pickup_amount: Amount;
-
- // Amount approved for tips that exceeds the pickup_amount.
- committed_amount: Amount;
-
- // Array of all tips created by this reserves (possibly empty!).
- // Only present if asked for explicitly.
- tips?: TipStatusEntry[];
-
- // Is this reserve active (false if it was deleted but not purged)?
- active: boolean;
-
- // URI to use to fill the reserve, can be NULL
- // if the reserve is inactive or was already filled
- payto_uri: string;
-
- // URL of the exchange hosting the reserve,
- // NULL if the reserve is inactive
- exchange_url: string;
-
- }
-
- interface TipStatusEntry {
-
- // Unique identifier for the tip.
- tip_id: HashCode;
-
- // Total amount of the tip that can be withdrawn.
- total_amount: Amount;
-
- // Human-readable reason for why the tip was granted.
- reason: string;
- }
-
- interface TipDetails {
- // Amount that we authorized for this tip.
- total_authorized: Amount;
-
- // Amount that was picked up by the user already.
- total_picked_up: Amount;
-
- // Human-readable reason given when authorizing the tip.
- reason: string;
-
- // Timestamp indicating when the tip is set to expire (may be in the past).
- expiration: TalerProtocolTimestamp;
-
- // Reserve public key from which the tip is funded.
- reserve_pub: EddsaPublicKey;
-
- // Array showing the pickup operations of the wallet (possibly empty!).
- // Only present if asked for explicitly.
- pickups?: PickupDetail[];
- }
- interface PickupDetail {
- // Unique identifier for the pickup operation.
- pickup_id: HashCode;
-
- // Number of planchets involved.
- num_planchets: Integer;
-
- // Total amount requested for this pickup_id.
- requested_amount: Amount;
- }
-
- }
-
- namespace Transfers {
-
- interface TransferList {
- // list of all the transfers that fit the filter that we know
- transfers: TransferDetails[];
- }
- interface TransferDetails {
- // how much was wired to the merchant (minus fees)
- credit_amount: Amount;
-
- // raw wire transfer identifier identifying the wire transfer (a base32-encoded value)
- wtid: string;
-
- // target account that received the wire transfer
- payto_uri: string;
-
- // base URL of the exchange that made the wire transfer
- exchange_url: string;
-
- // Serial number identifying the transfer in the merchant backend.
- // Used for filgering via offset.
- transfer_serial_id: number;
-
- // Time of the execution of the wire transfer by the exchange, according to the exchange
- // Only provided if we did get an answer from the exchange.
- execution_time?: Timestamp;
-
- // True if we checked the exchange's answer and are happy with it.
- // False if we have an answer and are unhappy, missing if we
- // do not have an answer from the exchange.
- verified?: boolean;
-
- // True if the merchant uses the POST /transfers API to confirm
- // that this wire transfer took place (and it is thus not
- // something merely claimed by the exchange).
- confirmed?: boolean;
- }
-
- interface TransferInformation {
- // how much was wired to the merchant (minus fees)
- credit_amount: Amount;
-
- // raw wire transfer identifier identifying the wire transfer (a base32-encoded value)
- wtid: WireTransferIdentifierRawP;
-
- // target account that received the wire transfer
- payto_uri: string;
-
- // base URL of the exchange that made the wire transfer
- exchange_url: string;
- }
- interface MerchantTrackTransferResponse {
- // Total amount transferred
- total: Amount;
-
- // Applicable wire fee that was charged
- wire_fee: Amount;
-
- // Time of the execution of the wire transfer by the exchange, according to the exchange
- execution_time: Timestamp;
-
- // details about the deposits
- deposits_sums: MerchantTrackTransferDetail[];
- }
- interface MerchantTrackTransferDetail {
- // Business activity associated with the wire transferred amount
- // deposit_value.
- order_id: string;
-
- // The total amount the exchange paid back for order_id.
- deposit_value: Amount;
-
- // applicable fees for the deposit
- deposit_fee: Amount;
- }
-
- type ExchangeConflictDetails = WireFeeConflictDetails | TrackTransferConflictDetails
- // Note: this is not the full 'proof' of missbehavior, as
- // the bogus message from the exchange with a signature
- // over the 'different' wire fee is missing.
- //
- // This information is NOT provided by the current implementation,
- // because this would be quite expensive to generate and is
- // hardly needed _here_. Once we add automated reports for
- // the Taler auditor, we need to generate this data anyway
- // and should probably return it here as well.
- interface WireFeeConflictDetails {
- // Numerical error code:
- code: "TALER_EC_MERCHANT_PRIVATE_POST_TRANSFERS_BAD_WIRE_FEE";
-
- // Text describing the issue for humans.
- hint: string;
-
-
- // Wire fee (wrongly) charged by the exchange, breaking the
- // contract affirmed by the exchange_sig.
- wire_fee: Amount;
-
- // Timestamp of the wire transfer
- execution_time: Timestamp;
-
- // The expected wire fee (as signed by the exchange)
- expected_wire_fee: Amount;
-
- // Expected closing fee (needed to verify signature)
- expected_closing_fee: Amount;
-
- // Start date of the expected fee structure
- start_date: Timestamp;
-
- // End date of the expected fee structure
- end_date: Timestamp;
-
- // Signature of the exchange affirming the expected fee structure
- master_sig: EddsaSignature;
-
- // Master public key of the exchange
- master_pub: EddsaPublicKey;
- }
- interface TrackTransferConflictDetails {
- // Numerical error code
- code: "TALER_EC_MERCHANT_PRIVATE_POST_TRANSFERS_CONFLICTING_REPORTS";
-
- // Text describing the issue for humans.
- hint: string;
-
- // Offset in the exchange_transfer where the
- // exchange's response fails to match the exchange_deposit_proof.
- conflict_offset: number;
-
- // The response from the exchange which tells us when the
- // coin was returned to us, except that it does not match
- // the expected value of the coin.
- //
- // This field is NOT provided by the current implementation,
- // because this would be quite expensive to generate and is
- // hardly needed _here_. Once we add automated reports for
- // the Taler auditor, we need to generate this data anyway
- // and should probably return it here as well.
- // exchange_transfer?: TrackTransferResponse;
-
- // Public key of the exchange used to sign the response to
- // our deposit request.
- deposit_exchange_pub: EddsaPublicKey;
-
- // Signature of the exchange signing the (conflicting) response.
- // Signs over a struct TALER_DepositConfirmationPS.
- deposit_exchange_sig: EddsaSignature;
-
- // Hash of the merchant's bank account the wire transfer went to
- h_wire: HashCode;
-
- // Hash of the contract terms with the conflicting deposit.
- h_contract_terms: HashCode;
-
- // At what time the exchange received the deposit. Needed
- // to verify the \exchange_sig\.
- deposit_timestamp: Timestamp;
-
- // At what time the refund possibility expired (needed to verify exchange_sig).
- refund_deadline: Timestamp;
-
- // Public key of the coin for which we have conflicting information.
- coin_pub: EddsaPublicKey;
-
- // Amount the exchange counted the coin for in the transfer.
- amount_with_fee: Amount;
-
- // Expected value of the coin.
- coin_value: Amount;
-
- // Expected deposit fee of the coin.
- coin_fee: Amount;
-
- // Expected deposit fee of the coin.
- deposit_fee: Amount;
-
- }
-
- // interface TrackTransferProof {
- // // signature from the exchange made with purpose
- // // TALER_SIGNATURE_EXCHANGE_CONFIRM_WIRE_DEPOSIT
- // exchange_sig: EddsaSignature;
-
- // // public EdDSA key of the exchange that was used to generate the signature.
- // // Should match one of the exchange's signing keys from /keys. Again given
- // // explicitly as the client might otherwise be confused by clock skew as to
- // // which signing key was used.
- // exchange_pub: EddsaSignature;
-
- // // hash of the wire details (identical for all deposits)
- // // Needed to check the exchange_sig
- // h_wire: HashCode;
- // }
-
- }
-
-
- interface ContractTerms {
- // Human-readable description of the whole purchase
- summary: string;
-
- // Map from IETF BCP 47 language tags to localized summaries
- summary_i18n?: { [lang_tag: string]: string };
-
- // Unique, free-form identifier for the proposal.
- // Must be unique within a merchant instance.
- // For merchants that do not store proposals in their DB
- // before the customer paid for them, the order_id can be used
- // by the frontend to restore a proposal from the information
- // encoded in it (such as a short product identifier and timestamp).
- order_id: string;
-
- // Total price for the transaction.
- // The exchange will subtract deposit fees from that amount
- // before transferring it to the merchant.
- amount: Amount;
-
- // The URL for this purchase. Every time is is visited, the merchant
- // will send back to the customer the same proposal. Clearly, this URL
- // can be bookmarked and shared by users.
- fulfillment_url?: string;
- fulfillment_message?: string;
-
- // Maximum total deposit fee accepted by the merchant for this contract
- max_fee: Amount;
-
- // Maximum wire fee accepted by the merchant (customer share to be
- // divided by the 'wire_fee_amortization' factor, and further reduced
- // if deposit fees are below 'max_fee'). Default if missing is zero.
- max_wire_fee: Amount;
-
- // Over how many customer transactions does the merchant expect to
- // amortize wire fees on average? If the exchange's wire fee is
- // above 'max_wire_fee', the difference is divided by this number
- // to compute the expected customer's contribution to the wire fee.
- // The customer's contribution may further be reduced by the difference
- // between the 'max_fee' and the sum of the actual deposit fees.
- // Optional, default value if missing is 1. 0 and negative values are
- // invalid and also interpreted as 1.
- wire_fee_amortization: number;
-
- // List of products that are part of the purchase (see Product).
- products: Product[];
-
- // Time when this contract was generated
- timestamp: TalerProtocolTimestamp;
-
- // After this deadline has passed, no refunds will be accepted.
- refund_deadline: TalerProtocolTimestamp;
-
- // After this deadline, the merchant won't accept payments for the contact
- pay_deadline: TalerProtocolTimestamp;
-
- // Transfer deadline for the exchange. Must be in the
- // deposit permissions of coins used to pay for this order.
- wire_transfer_deadline: TalerProtocolTimestamp;
-
- // Merchant's public key used to sign this proposal; this information
- // is typically added by the backend Note that this can be an ephemeral key.
- merchant_pub: EddsaPublicKey;
-
- // Base URL of the (public!) merchant backend API.
- // Must be an absolute URL that ends with a slash.
- merchant_base_url: string;
-
- // More info about the merchant, see below
- merchant: Merchant;
-
- // The hash of the merchant instance's wire details.
- h_wire: HashCode;
-
- // Wire transfer method identifier for the wire method associated with h_wire.
- // The wallet may only select exchanges via a matching auditor if the
- // exchange also supports this wire method.
- // The wire transfer fees must be added based on this wire transfer method.
- wire_method: string;
-
- // Any exchanges audited by these auditors are accepted by the merchant.
- auditors: Auditor[];
-
- // Exchanges that the merchant accepts even if it does not accept any auditors that audit them.
- exchanges: Exchange[];
-
- // Delivery location for (all!) products.
- delivery_location?: Location;
-
- // Time indicating when the order should be delivered.
- // May be overwritten by individual products.
- delivery_date?: TalerProtocolTimestamp;
-
- // Nonce generated by the wallet and echoed by the merchant
- // in this field when the proposal is generated.
- nonce: string;
-
- // Specifies for how long the wallet should try to get an
- // automatic refund for the purchase. If this field is
- // present, the wallet should wait for a few seconds after
- // the purchase and then automatically attempt to obtain
- // a refund. The wallet should probe until "delay"
- // after the payment was successful (i.e. via long polling
- // or via explicit requests with exponential back-off).
- //
- // In particular, if the wallet is offline
- // at that time, it MUST repeat the request until it gets
- // one response from the merchant after the delay has expired.
- // If the refund is granted, the wallet MUST automatically
- // recover the payment. This is used in case a merchant
- // knows that it might be unable to satisfy the contract and
- // desires for the wallet to attempt to get the refund without any
- // customer interaction. Note that it is NOT an error if the
- // merchant does not grant a refund.
- auto_refund?: RelativeTime;
-
- // Extra data that is only interpreted by the merchant frontend.
- // Useful when the merchant needs to store extra information on a
- // contract without storing it separately in their database.
- extra?: any;
- }
-
-}
diff --git a/packages/merchant-backend-ui/src/i18n/de.po b/packages/merchant-backend-ui/src/i18n/de.po
@@ -1,246 +0,0 @@
-# This file is part of TALER
-# (C) 2016 GNUnet e.V.
-#
-# 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.
-#
-# 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
-# TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: Taler Wallet\n"
-"Report-Msgid-Bugs-To: taler@gnu.org\n"
-"POT-Creation-Date: 2016-11-23 00:00+0100\n"
-"PO-Revision-Date: 2025-12-16 21:22+0000\n"
-"Last-Translator: Stefan Kügel <stefan.kuegel@taler.net>\n"
-"Language-Team: German <https://weblate.gnunet.org/projects/gnu-taler/"
-"merchant-backoffice/de/>\n"
-"Language: de\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.13.2\n"
-
-#: packages/merchant-backend-ui/src/pages/OfferRefund.tsx:65
-msgid "Refund available for"
-msgstr "Rückerstattung verfügbar für"
-
-#: packages/merchant-backend-ui/src/pages/OfferRefund.tsx:127
-msgid "Collect Taler refund"
-msgstr "Taler-Rückerstattung abholen"
-
-#: packages/merchant-backend-ui/src/pages/OfferRefund.tsx:128
-#: packages/merchant-backend-ui/src/pages/RequestPayment.tsx:156
-msgid "Scan this QR code with your Taler mobile wallet:"
-msgstr "Scannen Sie diesen QR-Code mit Ihrer mobilen Taler-Wallet:"
-
-#: packages/merchant-backend-ui/src/pages/OfferRefund.tsx:136
-#: packages/merchant-backend-ui/src/pages/RequestPayment.tsx:164
-msgid "Or open your Taler wallet"
-msgstr "Oder öffnen Sie Ihre Taler-Wallet"
-
-#: packages/merchant-backend-ui/src/pages/OfferRefund.tsx:141
-#: packages/merchant-backend-ui/src/pages/RequestPayment.tsx:169
-msgid "Don't have a Taler wallet yet? Install it!"
-msgstr "Noch keine Taler-Wallet? Installieren Sie sie!"
-
-#: packages/merchant-backend-ui/src/pages/RequestPayment.tsx:67
-msgid "Payment requested for"
-msgstr "Zahlung angefordert für"
-
-#: packages/merchant-backend-ui/src/pages/RequestPayment.tsx:155
-msgid "Pay with Taler"
-msgstr "Mit Taler bezahlen"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:68
-msgid "Status of your order for"
-msgstr "Status Ihrer Bestellung für"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:163
-msgid "Details of order"
-msgstr "Details der Bestellung"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:174
-msgid "Refunded:"
-msgstr "Rückerstattet:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:176
-msgid "The merchant refunded you"
-msgstr "Der Händler hat Ihnen eine Rückerstattung gewährt"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:199
-msgid "Order summary:"
-msgstr "Bestellübersicht:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:216
-msgid "Amount paid:"
-msgstr "Bezahlter Betrag:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:218
-msgid "Order date:"
-msgstr "Bestelldatum:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:229
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:455
-msgid "Merchant name:"
-msgstr "Name des Händlers:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:240
-msgid "Products purchased"
-msgstr "Gekaufte Produkte"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:252
-msgid "Quantity:"
-msgstr "Menge:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:255
-msgid "Price:"
-msgstr "Preis:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:278
-msgid "Delivered on:"
-msgstr "Geliefert am:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:293
-msgid "Product unit:"
-msgstr "Produkteinheit:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:302
-msgid "Product ID:"
-msgstr "Produkt-ID:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:320
-msgid "Delivery information"
-msgstr "Lieferinformationen"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:325
-msgid "Delivery date:"
-msgstr "Lieferdatum:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:333
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:405
-msgid "never"
-msgstr "nie"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:343
-msgid "Delivery address:"
-msgstr "Lieferadresse:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:358
-msgid "Full payment information"
-msgstr "Vollständige Zahlungsinformationen"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:360
-#, fuzzy
-#| msgid "Exchange transfer deadline:"
-msgid "Payment transfer deadline:"
-msgstr "Überweisungsfrist des Exchange:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:375
-msgid "Wire transfer settled."
-msgstr "Banküberweisung abgewickelt."
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:379
-msgid "Maximum deposit fee:"
-msgstr "Maximale Einzahlungsgebühr:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:384
-msgid "Maximum wire fee:"
-msgstr "Maximale Überweisungsgebühr:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:395
-msgid "Refund information"
-msgstr "Informationen zur Rückerstattung"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:397
-msgid "Refund deadline:"
-msgstr "Frist für Rückerstattung:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:412
-#, fuzzy
-#| msgid "Refund available for"
-msgid "Automatic refund available for:"
-msgstr "Rückerstattung verfügbar für"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:422
-msgid "forever"
-msgstr "für immer"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:432
-msgid "Additional order details"
-msgstr "Weitere Bestelldetails"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:434
-msgid "Public reorder URL:"
-msgstr "Öffentliche Nachbestell-URL:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:435
-msgid "Not defined."
-msgstr "Nicht definiert."
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:439
-msgid "Fulfillment URL:"
-msgstr "Fulfillment-URL:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:453
-msgid "Full merchant information"
-msgstr "Vollständige Händlerinformationen"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:460
-msgid "Merchant address:"
-msgstr "Adresse des Händlers:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:466
-msgid "Merchant jurisdiction:"
-msgstr "Gerichtsstand des Händlers:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:472
-msgid "Merchant URL:"
-msgstr "URL des Händlers:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:477
-msgid "Merchant public key:"
-msgstr "Öffentlicher Schlüssel des Händlers:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:490
-msgid "Auditors accepted by the merchant"
-msgstr "Vom Händler akzeptierte Auditoren"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:497
-msgid "Auditor public key:"
-msgstr "Öffentlicher Schlüssel des Auditors:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:499
-msgid "Auditor URL:"
-msgstr "URL des Auditors:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:513
-msgid "Exchanges accepted by the merchant"
-msgstr "Vom Händler akzeptierte Exchanges"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:519
-msgid "Exchange URL:"
-msgstr "Exchange-URL:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:521
-msgid "Exchange public key:"
-msgstr "Öffentlicher Schlüssel des Exchange:"
-
-#, c-format
-#~ msgid "Wire fee amortization:"
-#~ msgstr "Überweisungsgebühr-Amortisation:"
-
-#, c-format
-#~ msgid "Attempt autorefund for:"
-#~ msgstr "Automatische Rückerstattung versuchen für:"
-
-#, c-format
-#~ msgid "Scan this QR code with your mobile wallet:"
-#~ msgstr "Scannen Sie diesen QR-Code mit Ihrer mobilen Wallet:"
diff --git a/packages/merchant-backend-ui/src/i18n/en.po b/packages/merchant-backend-ui/src/i18n/en.po
@@ -1,229 +0,0 @@
-# This file is part of TALER
-# (C) 2016 GNUnet e.V.
-#
-# 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.
-#
-# 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
-# TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: Taler Wallet\n"
-"Report-Msgid-Bugs-To: taler@gnu.org\n"
-"POT-Creation-Date: 2016-11-23 00:00+0100\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"Language: en\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-#: packages/merchant-backend-ui/src/pages/OfferRefund.tsx:65
-msgid "Refund available for"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/OfferRefund.tsx:127
-msgid "Collect Taler refund"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/OfferRefund.tsx:128
-#: packages/merchant-backend-ui/src/pages/RequestPayment.tsx:156
-msgid "Scan this QR code with your Taler mobile wallet:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/OfferRefund.tsx:136
-#: packages/merchant-backend-ui/src/pages/RequestPayment.tsx:164
-msgid "Or open your Taler wallet"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/OfferRefund.tsx:141
-#: packages/merchant-backend-ui/src/pages/RequestPayment.tsx:169
-msgid "Don't have a Taler wallet yet? Install it!"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/RequestPayment.tsx:67
-msgid "Payment requested for"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/RequestPayment.tsx:155
-msgid "Pay with Taler"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:68
-msgid "Status of your order for"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:163
-msgid "Details of order"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:174
-msgid "Refunded:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:176
-msgid "The merchant refunded you"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:199
-msgid "Order summary:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:216
-msgid "Amount paid:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:218
-msgid "Order date:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:229
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:455
-msgid "Merchant name:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:240
-msgid "Products purchased"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:252
-msgid "Quantity:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:255
-msgid "Price:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:278
-msgid "Delivered on:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:293
-msgid "Product unit:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:302
-msgid "Product ID:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:320
-msgid "Delivery information"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:325
-msgid "Delivery date:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:333
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:405
-msgid "never"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:343
-msgid "Delivery address:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:358
-msgid "Full payment information"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:360
-msgid "Payment transfer deadline:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:375
-msgid "Wire transfer settled."
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:379
-msgid "Maximum deposit fee:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:384
-msgid "Maximum wire fee:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:395
-msgid "Refund information"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:397
-msgid "Refund deadline:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:412
-msgid "Automatic refund available for:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:422
-msgid "forever"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:432
-msgid "Additional order details"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:434
-msgid "Public reorder URL:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:435
-msgid "Not defined."
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:439
-msgid "Fulfillment URL:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:453
-msgid "Full merchant information"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:460
-msgid "Merchant address:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:466
-msgid "Merchant jurisdiction:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:472
-msgid "Merchant URL:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:477
-msgid "Merchant public key:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:490
-msgid "Auditors accepted by the merchant"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:497
-msgid "Auditor public key:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:499
-msgid "Auditor URL:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:513
-msgid "Exchanges accepted by the merchant"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:519
-msgid "Exchange URL:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:521
-msgid "Exchange public key:"
-msgstr ""
diff --git a/packages/merchant-backend-ui/src/i18n/es.po b/packages/merchant-backend-ui/src/i18n/es.po
@@ -1,246 +0,0 @@
-# This file is part of TALER
-# (C) 2016 GNUnet e.V.
-#
-# 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.
-#
-# 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
-# TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: Taler Wallet\n"
-"Report-Msgid-Bugs-To: taler@gnu.org\n"
-"POT-Creation-Date: 2016-11-23 00:00+0100\n"
-"PO-Revision-Date: 2025-12-11 17:06+0000\n"
-"Last-Translator: Stefan Kügel <stefan.kuegel@taler.net>\n"
-"Language-Team: Spanish <https://weblate.gnunet.org/projects/gnu-taler/"
-"merchant-backoffice/es/>\n"
-"Language: es\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 5.13.2\n"
-
-#: packages/merchant-backend-ui/src/pages/OfferRefund.tsx:65
-msgid "Refund available for"
-msgstr "Reembolso disponible durante"
-
-#: packages/merchant-backend-ui/src/pages/OfferRefund.tsx:127
-msgid "Collect Taler refund"
-msgstr "Recibir reembolso de Taler"
-
-#: packages/merchant-backend-ui/src/pages/OfferRefund.tsx:128
-#: packages/merchant-backend-ui/src/pages/RequestPayment.tsx:156
-msgid "Scan this QR code with your Taler mobile wallet:"
-msgstr "Escanea este código QR con tu cartera móvil de Taler:"
-
-#: packages/merchant-backend-ui/src/pages/OfferRefund.tsx:136
-#: packages/merchant-backend-ui/src/pages/RequestPayment.tsx:164
-msgid "Or open your Taler wallet"
-msgstr "O abre tu cartera Taler"
-
-#: packages/merchant-backend-ui/src/pages/OfferRefund.tsx:141
-#: packages/merchant-backend-ui/src/pages/RequestPayment.tsx:169
-msgid "Don't have a Taler wallet yet? Install it!"
-msgstr "¿Aún no tienes una cartera Taler? ¡Instálala!"
-
-#: packages/merchant-backend-ui/src/pages/RequestPayment.tsx:67
-msgid "Payment requested for"
-msgstr "Pago solicitado por"
-
-#: packages/merchant-backend-ui/src/pages/RequestPayment.tsx:155
-msgid "Pay with Taler"
-msgstr "Pagar con Taler"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:68
-msgid "Status of your order for"
-msgstr "Estado de la orden para"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:163
-msgid "Details of order"
-msgstr "Detalles de la orden"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:174
-msgid "Refunded:"
-msgstr "Reembolsado:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:176
-msgid "The merchant refunded you"
-msgstr "El comerciante te reembolsó"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:199
-msgid "Order summary:"
-msgstr "Resumen del pedido:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:216
-msgid "Amount paid:"
-msgstr "Monto pagado:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:218
-msgid "Order date:"
-msgstr "Fecha del pedido:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:229
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:455
-msgid "Merchant name:"
-msgstr "Nombre del comerciante:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:240
-msgid "Products purchased"
-msgstr "Productos comprados"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:252
-msgid "Quantity:"
-msgstr "Cantidad:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:255
-msgid "Price:"
-msgstr "Precio:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:278
-msgid "Delivered on:"
-msgstr "Entregado el:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:293
-msgid "Product unit:"
-msgstr "Unidad del producto:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:302
-msgid "Product ID:"
-msgstr "ID del producto:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:320
-msgid "Delivery information"
-msgstr "Información de entrega"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:325
-msgid "Delivery date:"
-msgstr "Fecha de entrega:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:333
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:405
-msgid "never"
-msgstr "nunca"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:343
-msgid "Delivery address:"
-msgstr "Dirección de entrega:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:358
-msgid "Full payment information"
-msgstr "Información completa del pago"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:360
-#, fuzzy
-#| msgid "Exchange transfer deadline:"
-msgid "Payment transfer deadline:"
-msgstr "Plazo de transferencia del exchange:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:375
-msgid "Wire transfer settled."
-msgstr "Transferencia bancaria liquidada."
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:379
-msgid "Maximum deposit fee:"
-msgstr "Comisión máxima de depósito:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:384
-msgid "Maximum wire fee:"
-msgstr "Comisión máxima de transferencia bancaria:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:395
-msgid "Refund information"
-msgstr "Información del reembolso"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:397
-msgid "Refund deadline:"
-msgstr "Plazo del reembolso:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:412
-#, fuzzy
-#| msgid "Refund available for"
-msgid "Automatic refund available for:"
-msgstr "Reembolso disponible durante"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:422
-msgid "forever"
-msgstr "para siempre"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:432
-msgid "Additional order details"
-msgstr "Detalles adicionales del pedido"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:434
-msgid "Public reorder URL:"
-msgstr "URL pública de reorden:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:435
-msgid "Not defined."
-msgstr "No definido."
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:439
-msgid "Fulfillment URL:"
-msgstr "URL de cumplimiento:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:453
-msgid "Full merchant information"
-msgstr "Información completa del comerciante"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:460
-msgid "Merchant address:"
-msgstr "Dirección del comerciante:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:466
-msgid "Merchant jurisdiction:"
-msgstr "Jurisdicción del comerciante:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:472
-msgid "Merchant URL:"
-msgstr "URL del comerciante:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:477
-msgid "Merchant public key:"
-msgstr "Clave pública del comerciante:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:490
-msgid "Auditors accepted by the merchant"
-msgstr "Auditores aceptados por el comerciante"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:497
-msgid "Auditor public key:"
-msgstr "Clave pública del auditor:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:499
-msgid "Auditor URL:"
-msgstr "URL del auditor:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:513
-msgid "Exchanges accepted by the merchant"
-msgstr "Exchanges aceptados por el comerciante"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:519
-msgid "Exchange URL:"
-msgstr "URL del exchange:"
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:521
-msgid "Exchange public key:"
-msgstr "Clave pública del exchange:"
-
-#, c-format
-#~ msgid "Wire fee amortization:"
-#~ msgstr "Amortización de la comisión de transferencia bancaria:"
-
-#, c-format
-#~ msgid "Attempt autorefund for:"
-#~ msgstr "Intentar reembolso automático durante:"
-
-#, c-format
-#~ msgid "Scan this QR code with your mobile wallet:"
-#~ msgstr "Escanea este código QR con tu cartera móvil:"
diff --git a/packages/merchant-backend-ui/src/i18n/poheader b/packages/merchant-backend-ui/src/i18n/poheader
@@ -1,27 +0,0 @@
-# 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 <http://www.gnu.org/licenses/>
-
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: Taler Backend UI\n"
-"Report-Msgid-Bugs-To: taler@gnu.org\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
diff --git a/packages/merchant-backend-ui/src/i18n/strings-prelude b/packages/merchant-backend-ui/src/i18n/strings-prelude
@@ -1,19 +0,0 @@
-/*
- 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 <http://www.gnu.org/licenses/>
- */
-
-/*eslint quote-props: ["error", "consistent"]*/
-export const strings: {[s: string]: any} = {};
-
diff --git a/packages/merchant-backend-ui/src/i18n/strings.ts b/packages/merchant-backend-ui/src/i18n/strings.ts
@@ -1,496 +0,0 @@
-/*
- 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 <http://www.gnu.org/licenses/>
- */
-
-/*eslint quote-props: ["error", "consistent"]*/
-export const strings: {[s: string]: any} = {};
-
-strings['es'] = {
- "locale_data": {
- "messages": {
- "": {
- "domain": "messages",
- "lang": "es",
- "plural_forms": "nplurals=2; plural=n != 1;"
- },
- "Refund available for": [
- "Reembolso disponible durante"
- ],
- "Collect Taler refund": [
- "Recibir reembolso de Taler"
- ],
- "Scan this QR code with your Taler mobile wallet:": [
- "Escanea este código QR con tu cartera móvil de Taler:"
- ],
- "Or open your Taler wallet": [
- "O abre tu cartera Taler"
- ],
- "Don't have a Taler wallet yet? Install it!": [
- "¿Aún no tienes una cartera Taler? ¡Instálala!"
- ],
- "Payment requested for": [
- "Pago solicitado por"
- ],
- "Pay with Taler": [
- "Pagar con Taler"
- ],
- "Status of your order for": [
- "Estado de la orden para"
- ],
- "Details of order": [
- "Detalles de la orden"
- ],
- "Refunded:": [
- "Reembolsado:"
- ],
- "The merchant refunded you": [
- "El comerciante te reembolsó"
- ],
- "Order summary:": [
- "Resumen del pedido:"
- ],
- "Amount paid:": [
- "Monto pagado:"
- ],
- "Order date:": [
- "Fecha del pedido:"
- ],
- "Merchant name:": [
- "Nombre del comerciante:"
- ],
- "Products purchased": [
- "Productos comprados"
- ],
- "Quantity:": [
- "Cantidad:"
- ],
- "Price:": [
- "Precio:"
- ],
- "Delivered on:": [
- "Entregado el:"
- ],
- "Product unit:": [
- "Unidad del producto:"
- ],
- "Product ID:": [
- "ID del producto:"
- ],
- "Delivery information": [
- "Información de entrega"
- ],
- "Delivery date:": [
- "Fecha de entrega:"
- ],
- "never": [
- "nunca"
- ],
- "Delivery address:": [
- "Dirección de entrega:"
- ],
- "Full payment information": [
- "Información completa del pago"
- ],
- "Wire transfer settled.": [
- "Transferencia bancaria liquidada."
- ],
- "Maximum deposit fee:": [
- "Comisión máxima de depósito:"
- ],
- "Maximum wire fee:": [
- "Comisión máxima de transferencia bancaria:"
- ],
- "Refund information": [
- "Información del reembolso"
- ],
- "Refund deadline:": [
- "Plazo del reembolso:"
- ],
- "forever": [
- "para siempre"
- ],
- "Additional order details": [
- "Detalles adicionales del pedido"
- ],
- "Public reorder URL:": [
- "URL pública de reorden:"
- ],
- "Not defined.": [
- "No definido."
- ],
- "Fulfillment URL:": [
- "URL de cumplimiento:"
- ],
- "Full merchant information": [
- "Información completa del comerciante"
- ],
- "Merchant address:": [
- "Dirección del comerciante:"
- ],
- "Merchant jurisdiction:": [
- "Jurisdicción del comerciante:"
- ],
- "Merchant URL:": [
- "URL del comerciante:"
- ],
- "Merchant public key:": [
- "Clave pública del comerciante:"
- ],
- "Auditors accepted by the merchant": [
- "Auditores aceptados por el comerciante"
- ],
- "Auditor public key:": [
- "Clave pública del auditor:"
- ],
- "Auditor URL:": [
- "URL del auditor:"
- ],
- "Exchanges accepted by the merchant": [
- "Exchanges aceptados por el comerciante"
- ],
- "Exchange URL:": [
- "URL del exchange:"
- ],
- "Exchange public key:": [
- "Clave pública del exchange:"
- ]
- }
- },
- "domain": "messages",
- "plural_forms": "nplurals=2; plural=n != 1;",
- "lang": "es",
- "completeness": 95
-};
-
-strings['en'] = {
- "locale_data": {
- "messages": {
- "": {
- "domain": "messages",
- "lang": "en",
- "plural_forms": "nplurals=2; plural=(n != 1);"
- },
- "Refund available for": [
- ""
- ],
- "Collect Taler refund": [
- ""
- ],
- "Scan this QR code with your Taler mobile wallet:": [
- ""
- ],
- "Or open your Taler wallet": [
- ""
- ],
- "Don't have a Taler wallet yet? Install it!": [
- ""
- ],
- "Payment requested for": [
- ""
- ],
- "Pay with Taler": [
- ""
- ],
- "Status of your order for": [
- ""
- ],
- "Details of order": [
- ""
- ],
- "Refunded:": [
- ""
- ],
- "The merchant refunded you": [
- ""
- ],
- "Order summary:": [
- ""
- ],
- "Amount paid:": [
- ""
- ],
- "Order date:": [
- ""
- ],
- "Merchant name:": [
- ""
- ],
- "Products purchased": [
- ""
- ],
- "Quantity:": [
- ""
- ],
- "Price:": [
- ""
- ],
- "Delivered on:": [
- ""
- ],
- "Product unit:": [
- ""
- ],
- "Product ID:": [
- ""
- ],
- "Delivery information": [
- ""
- ],
- "Delivery date:": [
- ""
- ],
- "never": [
- ""
- ],
- "Delivery address:": [
- ""
- ],
- "Full payment information": [
- ""
- ],
- "Payment transfer deadline:": [
- ""
- ],
- "Wire transfer settled.": [
- ""
- ],
- "Maximum deposit fee:": [
- ""
- ],
- "Maximum wire fee:": [
- ""
- ],
- "Refund information": [
- ""
- ],
- "Refund deadline:": [
- ""
- ],
- "Automatic refund available for:": [
- ""
- ],
- "forever": [
- ""
- ],
- "Additional order details": [
- ""
- ],
- "Public reorder URL:": [
- ""
- ],
- "Not defined.": [
- ""
- ],
- "Fulfillment URL:": [
- ""
- ],
- "Full merchant information": [
- ""
- ],
- "Merchant address:": [
- ""
- ],
- "Merchant jurisdiction:": [
- ""
- ],
- "Merchant URL:": [
- ""
- ],
- "Merchant public key:": [
- ""
- ],
- "Auditors accepted by the merchant": [
- ""
- ],
- "Auditor public key:": [
- ""
- ],
- "Auditor URL:": [
- ""
- ],
- "Exchanges accepted by the merchant": [
- ""
- ],
- "Exchange URL:": [
- ""
- ],
- "Exchange public key:": [
- ""
- ]
- }
- },
- "domain": "messages",
- "plural_forms": "nplurals=2; plural=(n != 1);",
- "lang": "en",
- "completeness": 100
-};
-
-strings['de'] = {
- "locale_data": {
- "messages": {
- "": {
- "domain": "messages",
- "lang": "de",
- "plural_forms": "nplurals=2; plural=n != 1;"
- },
- "Refund available for": [
- "Rückerstattung verfügbar für"
- ],
- "Collect Taler refund": [
- "Taler-Rückerstattung abholen"
- ],
- "Scan this QR code with your Taler mobile wallet:": [
- "Scannen Sie diesen QR-Code mit Ihrer mobilen Taler-Wallet:"
- ],
- "Or open your Taler wallet": [
- "Oder öffnen Sie Ihre Taler-Wallet"
- ],
- "Don't have a Taler wallet yet? Install it!": [
- "Noch keine Taler-Wallet? Installieren Sie sie!"
- ],
- "Payment requested for": [
- "Zahlung angefordert für"
- ],
- "Pay with Taler": [
- "Mit Taler bezahlen"
- ],
- "Status of your order for": [
- "Status Ihrer Bestellung für"
- ],
- "Details of order": [
- "Details der Bestellung"
- ],
- "Refunded:": [
- "Rückerstattet:"
- ],
- "The merchant refunded you": [
- "Der Händler hat Ihnen eine Rückerstattung gewährt"
- ],
- "Order summary:": [
- "Bestellübersicht:"
- ],
- "Amount paid:": [
- "Bezahlter Betrag:"
- ],
- "Order date:": [
- "Bestelldatum:"
- ],
- "Merchant name:": [
- "Name des Händlers:"
- ],
- "Products purchased": [
- "Gekaufte Produkte"
- ],
- "Quantity:": [
- "Menge:"
- ],
- "Price:": [
- "Preis:"
- ],
- "Delivered on:": [
- "Geliefert am:"
- ],
- "Product unit:": [
- "Produkteinheit:"
- ],
- "Product ID:": [
- "Produkt-ID:"
- ],
- "Delivery information": [
- "Lieferinformationen"
- ],
- "Delivery date:": [
- "Lieferdatum:"
- ],
- "never": [
- "nie"
- ],
- "Delivery address:": [
- "Lieferadresse:"
- ],
- "Full payment information": [
- "Vollständige Zahlungsinformationen"
- ],
- "Wire transfer settled.": [
- "Banküberweisung abgewickelt."
- ],
- "Maximum deposit fee:": [
- "Maximale Einzahlungsgebühr:"
- ],
- "Maximum wire fee:": [
- "Maximale Überweisungsgebühr:"
- ],
- "Refund information": [
- "Informationen zur Rückerstattung"
- ],
- "Refund deadline:": [
- "Frist für Rückerstattung:"
- ],
- "forever": [
- "für immer"
- ],
- "Additional order details": [
- "Weitere Bestelldetails"
- ],
- "Public reorder URL:": [
- "Öffentliche Nachbestell-URL:"
- ],
- "Not defined.": [
- "Nicht definiert."
- ],
- "Fulfillment URL:": [
- "Fulfillment-URL:"
- ],
- "Full merchant information": [
- "Vollständige Händlerinformationen"
- ],
- "Merchant address:": [
- "Adresse des Händlers:"
- ],
- "Merchant jurisdiction:": [
- "Gerichtsstand des Händlers:"
- ],
- "Merchant URL:": [
- "URL des Händlers:"
- ],
- "Merchant public key:": [
- "Öffentlicher Schlüssel des Händlers:"
- ],
- "Auditors accepted by the merchant": [
- "Vom Händler akzeptierte Auditoren"
- ],
- "Auditor public key:": [
- "Öffentlicher Schlüssel des Auditors:"
- ],
- "Auditor URL:": [
- "URL des Auditors:"
- ],
- "Exchanges accepted by the merchant": [
- "Vom Händler akzeptierte Exchanges"
- ],
- "Exchange URL:": [
- "Exchange-URL:"
- ],
- "Exchange public key:": [
- "Öffentlicher Schlüssel des Exchange:"
- ]
- }
- },
- "domain": "messages",
- "plural_forms": "nplurals=2; plural=n != 1;",
- "lang": "de",
- "completeness": 95
-};
-
diff --git a/packages/merchant-backend-ui/src/i18n/taler-merchant-backend-ui.pot b/packages/merchant-backend-ui/src/i18n/taler-merchant-backend-ui.pot
@@ -1,228 +0,0 @@
-# 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 <http://www.gnu.org/licenses/>
-
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: Taler Backend UI\n"
-"Report-Msgid-Bugs-To: taler@gnu.org\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: packages/merchant-backend-ui/src/pages/OfferRefund.tsx:65
-msgid "Refund available for"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/OfferRefund.tsx:127
-msgid "Collect Taler refund"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/OfferRefund.tsx:128
-#: packages/merchant-backend-ui/src/pages/RequestPayment.tsx:156
-msgid "Scan this QR code with your Taler mobile wallet:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/OfferRefund.tsx:136
-#: packages/merchant-backend-ui/src/pages/RequestPayment.tsx:164
-msgid "Or open your Taler wallet"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/OfferRefund.tsx:141
-#: packages/merchant-backend-ui/src/pages/RequestPayment.tsx:169
-msgid "Don't have a Taler wallet yet? Install it!"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/RequestPayment.tsx:67
-msgid "Payment requested for"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/RequestPayment.tsx:155
-msgid "Pay with Taler"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:68
-msgid "Status of your order for"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:163
-msgid "Details of order"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:174
-msgid "Refunded:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:176
-msgid "The merchant refunded you"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:199
-msgid "Order summary:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:216
-msgid "Amount paid:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:218
-msgid "Order date:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:229
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:455
-msgid "Merchant name:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:240
-msgid "Products purchased"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:252
-msgid "Quantity:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:255
-msgid "Price:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:278
-msgid "Delivered on:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:293
-msgid "Product unit:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:302
-msgid "Product ID:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:320
-msgid "Delivery information"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:325
-msgid "Delivery date:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:333
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:405
-msgid "never"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:343
-msgid "Delivery address:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:358
-msgid "Full payment information"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:360
-msgid "Payment transfer deadline:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:375
-msgid "Wire transfer settled."
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:379
-msgid "Maximum deposit fee:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:384
-msgid "Maximum wire fee:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:395
-msgid "Refund information"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:397
-msgid "Refund deadline:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:412
-msgid "Automatic refund available for:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:422
-msgid "forever"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:432
-msgid "Additional order details"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:434
-msgid "Public reorder URL:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:435
-msgid "Not defined."
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:439
-msgid "Fulfillment URL:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:453
-msgid "Full merchant information"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:460
-msgid "Merchant address:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:466
-msgid "Merchant jurisdiction:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:472
-msgid "Merchant URL:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:477
-msgid "Merchant public key:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:490
-msgid "Auditors accepted by the merchant"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:497
-msgid "Auditor public key:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:499
-msgid "Auditor URL:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:513
-msgid "Exchanges accepted by the merchant"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:519
-msgid "Exchange URL:"
-msgstr ""
-
-#: packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx:521
-msgid "Exchange public key:"
-msgstr ""
-
diff --git a/packages/merchant-backend-ui/src/i18n/taler-merchant-backoffice.pot b/packages/merchant-backend-ui/src/i18n/taler-merchant-backoffice.pot
@@ -1,28 +0,0 @@
-# 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 <http://www.gnu.org/licenses/>
-
-#
-#, fuzzy
-msgid ""
-msgstr ""
-"Project-Id-Version: Taler Backend UI\n"
-"Report-Msgid-Bugs-To: taler@gnu.org\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#. screenid: 18
diff --git a/packages/merchant-backend-ui/src/pages/OfferRefund.examples.ts b/packages/merchant-backend-ui/src/pages/OfferRefund.examples.ts
@@ -1,30 +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 { Props } from "./OfferRefund.js";
-
-export const exampleData: { [name: string]: Props } = {
- Simplest: {
- refundURI: "taler://refund/123",
- order_status_url: "http://merchant.taler/blog/ID123",
- qr_code: "<pre> insert qr code here - test data </pre>",
- },
-};
diff --git a/packages/merchant-backend-ui/src/pages/OfferRefund.stories.tsx b/packages/merchant-backend-ui/src/pages/OfferRefund.stories.tsx
@@ -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)
-*/
-
-import { h, VNode, FunctionalComponent } from 'preact';
-import { createSVG } from '../components/QR.js';
-import { OfferRefund as TestedComponent } from './OfferRefund.js';
-
-
-export default {
- title: 'OfferRefund',
- component: TestedComponent,
- argTypes: {
- },
-};
-
-function createExample<Props>(Component: FunctionalComponent<Props>, props: Partial<Props>) {
- const r = (args: any) => <Component {...args} />
- r.args = props
- return r
-}
-
-const REFUND_URI_EXAMPLE = 'taler://pay/backend.demo.taler.net/instances/blog/2021.249-022NW2KG88QGA/def537eb-00c2-4a8b-8a17-0be034d118d3?c=2Y4N4PMST7KYAPS83428GTPCD4'
-
-export const Example = createExample(TestedComponent, {
- refundURI: REFUND_URI_EXAMPLE,
- qr_code: createSVG(REFUND_URI_EXAMPLE)
-});
diff --git a/packages/merchant-backend-ui/src/pages/OfferRefund.tsx b/packages/merchant-backend-ui/src/pages/OfferRefund.tsx
@@ -1,201 +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 { Fragment, h, render, VNode } from "preact";
-import { render as renderToString } from "preact-render-to-string";
-import { useEffect } from "preact/hooks";
-import { Footer } from "../components/Footer.js";
-import { createSVG, QR } from "../components/QR.js";
-import "../css/pure-min.css";
-import "../css/style.css";
-import { Page, QRPlaceholder, WalletLink } from "../styled/index.js";
-import { Application } from "../components/Application.js";
-import { useTranslationContext } from "../context/translations.js";
-
-/**
- * This page creates a refund offer QR code
- *
- * It will build into a mustache html template for server side rendering
- *
- * server side rendering params:
- * - order_status_url
- * - taler_refund_qrcode_svg
- * - taler_refund_uri
- *
- * request params:
- * - refund_uri
- * - order_status_url
- */
-
-export interface Props {
- refundURI?: string;
- order_status_url?: string;
- qr_code?: string;
-}
-
-function Head({ order_summary }: { order_summary?: string }): VNode {
- const { i18n } = useTranslationContext();
- return (
- <Fragment>
- <meta charSet="UTF-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="taler-support" content="uri" />
- <meta name="taler-uri" content="{{ taler_refund_uri }}"></meta>
- <noscript>
- <meta http-equiv="refresh" content="1" />
- </noscript>
- <title>
- <i18n.Translate>Refund available for</i18n.Translate>{" "}
- {order_summary ? order_summary : `{{ order_summary }}`}
- </title>
- </Fragment>
- );
-}
-
-export function OfferRefund({
- refundURI,
- qr_code,
- order_status_url,
-}: Props): VNode {
- const { i18n } = useTranslationContext();
- useEffect(() => {
- const longpollDelayMs = 60 * 1000;
- const delayMs = 500;
- let checkUrl: URL;
- try {
- checkUrl = new URL(
- order_status_url ? order_status_url : "{{& order_status_url }}",
- );
- } catch (e) {
- return;
- }
- checkUrl.searchParams.set("await_refund_obtained", "yes");
- checkUrl.searchParams.set("timeout_ms", longpollDelayMs.toString());
- function check() {
- let retried = false;
- function retryOnce() {
- if (!retried) {
- retried = true;
- check();
- }
- }
- const req = new XMLHttpRequest();
- req.onreadystatechange = function () {
- if (req.readyState === XMLHttpRequest.DONE) {
- if (req.status === 200) {
- try {
- const resp = JSON.parse(req.responseText);
- if (!resp.refund_pending) {
- window.location.reload();
- }
- } catch (e) {
- console.error("could not parse response:", e);
- }
- }
- setTimeout(retryOnce, delayMs);
- }
- };
- req.onerror = function () {
- setTimeout(retryOnce, delayMs);
- };
- req.open("GET", checkUrl.href);
- req.send();
- }
-
- setTimeout(check, delayMs);
- });
- return (
- <Page>
- <section>
- <h1><i18n.Translate>Collect Taler refund</i18n.Translate></h1>
- <p><i18n.Translate>Scan this QR code with your Taler mobile wallet:</i18n.Translate></p>
- <QRPlaceholder
- dangerouslySetInnerHTML={{
- __html: qr_code ? qr_code : `{{{ taler_refund_qrcode_svg }}}`,
- }}
- />
- <p>
- <WalletLink href={refundURI ? refundURI : `{{ taler_refund_uri }}`}>
- <i18n.Translate>Or open your Taler wallet</i18n.Translate>
- </WalletLink>
- </p>
- <p>
- <a href="https://wallet.taler.net/">
- <i18n.Translate>Don't have a Taler wallet yet? Install it!</i18n.Translate>
- </a>
- </p>
- </section>
- <Footer />
- </Page>
- );
-}
-
-export function mount(lang: string): void {
- try {
- const fromLocation = new URL(window.location.href).searchParams;
- const os = fromLocation.get("order_summary") || undefined;
- if (os) {
- render(
- <Application lang={lang}>
- <Head order_summary={os} />
- </Application>,
- document.head,
- );
- }
-
- const uri = fromLocation.get("refund_uri") || undefined;
- const osu = fromLocation.get("order_status_url") || undefined;
- // const qr_code = uri ? renderToString(<QR text={uri} />) : undefined;
-// createSVG
- const qr_code = uri ? createSVG(uri) : undefined;
- // console.log("qr", qr_code)
- render(
- <Application lang={lang}>
- <OfferRefund refundURI={uri} order_status_url={osu} qr_code={qr_code} />
- </Application>,
- document.body,
- );
- } catch (e) {
- console.error("got error", e);
- if (e instanceof Error) {
- console.error("fatal rendering error", e);
- document.body.innerText =
- "Sorry, this page could not be displayed. Please try again or contact the merchant.";
- }
- }
-}
-
-export function buildTimeRendering(lang: string): {
- head: string;
- body: string;
-} {
- return {
- head: renderToString(
- <Application lang={lang}>
- <Head />
- </Application>,
- ),
- body: renderToString(
- <Application lang={lang}>
- <OfferRefund />
- </Application>,
- ),
- };
-}
diff --git a/packages/merchant-backend-ui/src/pages/RequestPayment.examples.ts b/packages/merchant-backend-ui/src/pages/RequestPayment.examples.ts
@@ -1,30 +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 { Props } from "./RequestPayment.js";
-
-export const exampleData: { [name: string]: Props } = {
- Simplest: {
- payURI: "taler://pay",
- order_status_url: "http://merchant.taler/blog/ID123",
- qr_code: "<pre> insert qr code here - test data </pre>",
- },
-};
diff --git a/packages/merchant-backend-ui/src/pages/RequestPayment.stories.tsx b/packages/merchant-backend-ui/src/pages/RequestPayment.stories.tsx
@@ -1,48 +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";
-import { createSVG } from "../components/QR.js";
-import { RequestPayment as TestedComponent } from "./RequestPayment.js";
-
-export default {
- title: "RequestPayment",
- component: TestedComponent,
- argTypes: {},
-};
-
-function createExample<Props>(
- Component: FunctionalComponent<Props>,
- props: Partial<Props>,
-) {
- const r = (args: any) => <Component {...args} />;
- r.args = props;
- return r;
-}
-
-const PAYTO_URI_EXAMPLE =
- "taler+http://pay/merchant-backend.taler/2021.242-01G2X4275RBWG/?c=66BE594PDZR24744J6EQK52XM0";
-
-export const Example = createExample(TestedComponent, {
- payURI:
- "taler+http://pay/merchant-backend.taler/2021.242-01G2X4275RBWG/?c=66BE594PDZR24744J6EQK52XM0",
- qr_code: createSVG(PAYTO_URI_EXAMPLE),
-});
diff --git a/packages/merchant-backend-ui/src/pages/RequestPayment.tsx b/packages/merchant-backend-ui/src/pages/RequestPayment.tsx
@@ -1,227 +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 { Fragment, h, render, VNode } from "preact";
-import { render as renderToString } from "preact-render-to-string";
-import { useEffect } from "preact/hooks";
-import { Footer } from "../components/Footer.js";
-import { createSVG, QR } from "../components/QR.js";
-import "../css/pure-min.css";
-import "../css/style.css";
-import { Page, QRPlaceholder, WalletLink } from "../styled/index.js";
-import { Application } from "../components/Application.js";
-import { useTranslationContext } from "../context/translations.js";
-
-/**
- * This page creates a payment request QR code
- *
- * It will build into a mustache html template for server side rendering
- *
- * server side rendering params:
- * - order_status_url
- * - taler_pay_qrcode_svg
- * - taler_pay_uri
- * - order_summary
- *
- * request params:
- * - pay_uri
- * - order_summary
- * - order_status_url
- */
-
-export interface Props {
- payURI?: string;
- order_status_url?: string;
- qr_code?: string;
-}
-
-function Head({ order_summary }: { order_summary?: string }): VNode {
- const { i18n } = useTranslationContext();
- return (
- <Fragment>
- <meta charSet="UTF-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="taler-support" content="uri" />
- <meta name="taler-uri" content="{{ taler_pay_uri }}"></meta>
- <noscript>
- <meta http-equiv="refresh" content="1" />
- </noscript>
- <title>
- <i18n.Translate>Payment requested for</i18n.Translate>{" "}
- {order_summary ? order_summary : `{{ order_summary }}`}
- </title>
- </Fragment>
- );
-}
-
-export function RequestPayment({
- payURI,
- qr_code,
- order_status_url,
-}: Props): VNode {
- const { i18n } = useTranslationContext();
- useEffect(() => {
- const longpollDelayMs = 60 * 1000;
- let checkUrl: URL;
- try {
- checkUrl = new URL(
- order_status_url ? order_status_url : "{{& order_status_url }}",
- );
- } catch (e) {
- return;
- }
- checkUrl.searchParams.set("timeout_ms", longpollDelayMs.toString());
- const delayMs = 500;
- function check() {
- let retried = false;
- function retryOnce() {
- if (!retried) {
- retried = true;
- check();
- }
- }
- const req = new XMLHttpRequest();
- req.onreadystatechange = function () {
- if (req.readyState === XMLHttpRequest.DONE) {
- if (req.status === 200) {
- try {
- const resp = JSON.parse(req.responseText);
- if (resp.fulfillment_url) {
- window.location.replace(resp.fulfillment_url);
- } else {
- window.location.reload();
- }
- } catch (e) {
- console.error("could not parse response:", e);
- }
- }
- if (req.status === 202) {
- try {
- const resp = JSON.parse(req.responseText);
- if (resp.fulfillment_url) {
- window.location.replace(resp.fulfillment_url);
- } else {
- window.location.reload();
- }
- } catch (e) {
- console.error("could not parse response:", e);
- }
- }
- if (req.status === 402) {
- try {
- const resp = JSON.parse(req.responseText);
- if (resp.already_paid_order_id && resp.fulfillment_url) {
- window.location.replace(resp.fulfillment_url);
- }
- } catch (e) {
- console.error("could not parse response:", e);
- }
- }
- setTimeout(retryOnce, delayMs);
- }
- };
- req.onerror = function () {
- setTimeout(retryOnce, delayMs);
- };
- req.ontimeout = function () {
- setTimeout(retryOnce, delayMs);
- };
- req.timeout = longpollDelayMs;
- req.open("GET", checkUrl.href);
- req.send();
- }
- setTimeout(check, delayMs);
- });
- return (
- <Page>
- <section>
- <h1><i18n.Translate>Pay with Taler</i18n.Translate></h1>
- <p><i18n.Translate>Scan this QR code with your Taler mobile wallet:</i18n.Translate></p>
- <QRPlaceholder
- dangerouslySetInnerHTML={{
- __html: qr_code ? qr_code : `{{{ taler_pay_qrcode_svg }}}`,
- }}
- />
- <p>
- <WalletLink href={payURI ? payURI : `{{ taler_pay_uri }}`}>
- <i18n.Translate>Or open your Taler wallet</i18n.Translate>
- </WalletLink>
- </p>
- <p>
- <a href="https://wallet.taler.net/">
- <i18n.Translate>Don't have a Taler wallet yet? Install it!</i18n.Translate>
- </a>
- </p>
- </section>
- <Footer />
- </Page>
- );
-}
-
-export function mount(lang: string): void {
- try {
- const fromLocation = new URL(window.location.href).searchParams;
- const os = fromLocation.get("order_summary") || undefined;
- if (os) {
- render(
- <Application lang={lang}>
- <Head order_summary={os} />
- </Application>,
- document.head,
- );
- }
-
- const uri = fromLocation.get("pay_uri") || undefined;
- const osu = fromLocation.get("order_status_url") || undefined;
- const qr_code = uri ? createSVG(uri) : undefined;
-
- render(
- <Application lang={lang}>
- <RequestPayment payURI={uri} order_status_url={osu} qr_code={qr_code} />
- </Application>,
- document.body,
- );
- } catch (e) {
- console.error("got error", e);
- if (e instanceof Error) {
- console.error("fatal rendering error", e);
- document.body.innerText =
- "Sorry, this page could not be displayed. Please try again or contact the merchant.";
- }
- }
-}
-
-export function buildTimeRendering(lang: string): {
- head: string;
- body: string;
-} {
- return {
- head: renderToString(
- <Application lang={lang}>
- <Head />
- </Application>,
- ),
- body: renderToString(
- <Application lang={lang}>
- <RequestPayment />
- </Application>,
- ),
- };
-}
diff --git a/packages/merchant-backend-ui/src/pages/ShowOrderDetails.examples.ts b/packages/merchant-backend-ui/src/pages/ShowOrderDetails.examples.ts
@@ -1,253 +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 { MerchantBackend } from '../declaration.js';
-import { Props } from './ShowOrderDetails.js';
-
-
-const defaultContractTerms: MerchantBackend.ContractTerms = {
- order_id: 'XRS8876388373',
- amount: 'USD:10',
- summary: 'this is a short summary',
- pay_deadline: {
- t_s: Math.round(new Date().getTime() / 1000) + 6 * 24 * 60 * 60
- },
- merchant: {
- name: 'the merchant (inc)',
- address: {
- country_subdivision: 'Buenos Aires',
- town: 'CABA',
- country: 'Argentina'
- },
- jurisdiction: {
- country_subdivision: 'Cordoba',
- town: 'Capital',
- country: 'Argentina'
- },
- },
- max_fee: 'USD:0.1',
- max_wire_fee: 'USD:0.2',
- wire_fee_amortization: 1,
- products: [],
- timestamp: {
- t_s: Math.round(new Date().getTime() / 1000)
- },
- auditors: [],
- exchanges: [],
- h_wire: '',
- merchant_base_url: 'http://merchant.base.url/',
- merchant_pub: 'QWEASDQWEASD',
- nonce: 'NONCE',
- refund_deadline: {
- t_s: Math.round(new Date().getTime() / 1000) + 6 * 24 * 60 * 60
- },
- wire_method: 'x-taler-bank',
- wire_transfer_deadline: {
- t_s: Math.round(new Date().getTime() / 1000) + 3 * 24 * 60 * 60
- },
-};
-
-const inSixDays = Math.round(new Date().getTime() / 1000) + 6 * 24 * 60 * 60
-const in10Minutes = Math.round(new Date().getTime() / 1000) + 10 * 60
-const in15Minutes = Math.round(new Date().getTime() / 1000) + 15 * 60
-const in20Minutes = Math.round(new Date().getTime() / 1000) + 20 * 60
-
-export const exampleData: { [name: string]: Props } = {
- Simplest: {
- order_summary: 'here goes the order summary',
- contract_terms: defaultContractTerms,
- },
- WithRefundAmount: {
- order_summary: 'here goes the order summary',
- refund_amount: 'USD:10',
- contract_terms: defaultContractTerms,
- },
- WithDeliveryDate: {
- order_summary: 'here goes the order summary',
- contract_terms: {
- ...defaultContractTerms,
- delivery_date: {
- t_s: inSixDays
- },
- },
- },
- WithDeliveryLocation: {
- order_summary: 'here goes the order summary',
- contract_terms: {
- ...defaultContractTerms,
- delivery_location: {
- address_lines: ['addr line 1', 'addr line 2', 'addr line 3', 'addr line 4', 'addr line 5', 'addr line 6', 'addr line 7'],
- building_name: 'building-name',
- building_number: 'building-number',
- country: 'country',
- country_subdivision: 'country sub',
- district: 'district',
- post_code: 'post-code',
- street: 'street',
- town: 'town',
- town_location: 'town loc',
- },
- },
- },
- WithDeliveryLocationAndDate: {
- order_summary: 'here goes the order summary',
- contract_terms: {
- ...defaultContractTerms,
- delivery_location: {
- address_lines: ['addr1', 'addr2', 'addr3', 'addr4', 'addr5', 'addr6', 'addr7'],
- building_name: 'building-name',
- building_number: 'building-number',
- country: 'country',
- country_subdivision: 'country sub',
- district: 'district',
- post_code: 'post-code',
- street: 'street',
- town: 'town',
- town_location: 'town loc',
- },
- delivery_date: {
- t_s: inSixDays
- },
- },
- },
- WithThreeProducts: {
- order_summary: 'here goes the order summary',
- contract_terms: {
- ...defaultContractTerms,
- products: [{
- description: 'description of the first product',
- price: '5:USD',
- quantity: 1,
- delivery_date: { t_s: in10Minutes },
- product_id: '12333',
- }, {
- description: 'another description',
- price: '10:USD',
- quantity: 5,
- unit: 't-shirt',
- }, {
- description: 'one last description',
- price: '10:USD',
- quantity: 5
- }]
- } as MerchantBackend.ContractTerms
- },
- WithProductWithTaxes: {
- order_summary: 'here goes the order summary',
- contract_terms: {
- ...defaultContractTerms,
- products: [{
- description: 'description of the first product',
- price: '5:USD',
- quantity: 1,
- unit: 'beer',
- delivery_date: { t_s: in10Minutes },
- product_id: '456',
- taxes: [{
- name: 'VAT', tax: 'USD:1'
- }],
- }, {
- description: 'one last description',
- price: '10:USD',
- quantity: 5,
- product_id: '123',
- unit: 'beer',
- taxes: [{
- name: 'VAT', tax: 'USD:1'
- }],
- }]
- } as MerchantBackend.ContractTerms
- },
- WithExchangeList: {
- order_summary: 'here goes the order summary',
- contract_terms: {
- ...defaultContractTerms,
- exchanges: [{
- master_pub: 'ABCDEFGHIJKLMNO',
- url: 'http://exchange0.taler.net'
- }, {
- master_pub: 'AAAAAAAAAAAAAAA',
- url: 'http://exchange1.taler.net'
- }, {
- master_pub: 'BBBBBBBBBBBBBBB',
- url: 'http://exchange2.taler.net'
- }]
- },
- },
- WithAuditorList: {
- order_summary: 'here goes the order summary',
- contract_terms: {
- ...defaultContractTerms,
- auditors: [{
- auditor_pub: 'ABCDEFGHIJKLMNO',
- name: 'the USD auditor',
- url: 'http://auditor-usd.taler.net'
- }, {
- auditor_pub: 'OPQRSTUVWXYZABCD',
- name: 'the EUR auditor',
- url: 'http://auditor-eur.taler.net'
- }]
- },
- },
- WithAutoRefund: {
- order_summary: 'here goes the order summary',
- contract_terms: {
- ...defaultContractTerms,
- auto_refund: {
- d_us: 1000 * 60 * 60 * 26 + 1000 * 60 * 30
- }
- },
- },
- WithFulfillmentURL: {
- order_summary: 'this is the order with fulfillmentURL',
- contract_terms: {
- ...defaultContractTerms,
- fulfillment_url: "https://demo.taler.net",
- fulfillment_message: "Congratulations! You just purchased an valuable item!"
- },
- },
- WithFulfillmentMessage: {
- order_summary: 'this is the order with fulfillment message',
- contract_terms: {
- ...defaultContractTerms,
- fulfillment_message: "Congratulations! You just purchased an valuable item!"
- },
- },
- WithoutWireTransferDeadline: {
- order_summary: 'this is the order without transfer deadline',
- contract_terms: {
- ...defaultContractTerms,
- // @ts-ignore
- wire_transfer_deadline: undefined,
- },
- },
- ZeroFee: {
- order_summary: 'example with zero fee',
- contract_terms: {
- ...defaultContractTerms,
- // @ts-ignore
- max_fee: undefined,
- // @ts-ignore
- max_wire_fee: undefined,
- fulfillment_message: "Congratulations! You just purchased an valuable item!"
- },
- },
-}
diff --git a/packages/merchant-backend-ui/src/pages/ShowOrderDetails.stories.tsx b/packages/merchant-backend-ui/src/pages/ShowOrderDetails.stories.tsx
@@ -1,49 +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';
-import { ShowOrderDetails as TestedComponent } from './ShowOrderDetails.js';
-import { exampleData } from './ShowOrderDetails.examples';
-
-export default {
- title: 'ShowOrderDetails',
- component: TestedComponent,
- argTypes: {
- },
- excludeStories: /.*Data$/,
-};
-
-function createExample<Props>(Component: FunctionalComponent<Props>, props: Partial<Props>) {
- const r = (args: any) => <Component {...args} />
- r.args = props
- return r
-}
-
-export const Simplest = createExample(TestedComponent, exampleData.Simplest);
-export const WithRefundAmount = createExample(TestedComponent, exampleData.WithRefundAmount);
-export const WithDeliveryDate = createExample(TestedComponent, exampleData.WithDeliveryDate);
-export const WithDeliveryLocation = createExample(TestedComponent, exampleData.WithDeliveryLocation);
-export const WithDeliveryLocationAndDate = createExample(TestedComponent, exampleData.WithDeliveryLocationAndDate);
-export const WithThreeProducts = createExample(TestedComponent, exampleData.WithThreeProducts);
-export const WithAuditorList = createExample(TestedComponent, exampleData.WithAuditorList);
-export const WithExchangeList = createExample(TestedComponent, exampleData.WithExchangeList);
-export const WithAutoRefund = createExample(TestedComponent, exampleData.WithAutoRefund);
-export const WithProductWithTaxes = createExample(TestedComponent, exampleData.WithProductWithTaxes);
diff --git a/packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx b/packages/merchant-backend-ui/src/pages/ShowOrderDetails.tsx
@@ -1,602 +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 { format, formatDuration } from "date-fns";
-import { intervalToDuration } from "date-fns/esm";
-import { Fragment, h, render, VNode } from "preact";
-import { render as renderToString } from "preact-render-to-string";
-import { Footer } from "../components/Footer.js";
-import "../css/pure-min.css";
-import "../css/style.css";
-import type { MerchantBackend } from "../declaration";
-import { Page, InfoBox, TableExpanded, TableSimple } from "../styled/index.js";
-import { TIME_DATE_FORMAT } from "../utils.js";
-import { Application } from "../components/Application.js";
-import { useTranslationContext } from "../context/translations.js";
-
-/**
- * This page creates a payment request QR code
- *
- * It will build into a mustache html template for server side rendering
- *
- * server side rendering params:
- * - order_summary
- * - contract_terms
- * - refund_amount
- *
- * request params:
- * - refund_amount
- * - contract_terms
- * - order_summary
- */
-
-export interface Props {
- btr?: boolean; // build time rendering flag
- order_summary?: string;
- refund_amount?: string;
- contract_terms?: MerchantBackend.ContractTerms;
-}
-
-function Head({ order_summary }: { order_summary?: string }): VNode {
- const { i18n } = useTranslationContext();
- return (
- <Fragment>
- <meta charSet="UTF-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <meta name="taler-support" content="uri" />
- <noscript>
- <meta http-equiv="refresh" content="1" />
- </noscript>
- <title>
- <i18n.Translate>Status of your order for </i18n.Translate>
- {order_summary ? order_summary : `{{ order_summary }}`}
- </title>
- <script>{`
- var contractTermsStr = '{{{contract_terms_json}}}';
- `}</script>
- </Fragment>
- );
-}
-
-function Location({
- templateName,
- location,
- btr,
-}: {
- templateName: string;
- location: MerchantBackend.Location | undefined;
- btr?: boolean;
-}) {
- //FIXME: mustache strings will be constructed in a way that ends in the final output of the html but is not present in the
- // javascript code, otherwise when mustache render engine run over the html it will also replace string in the javascript code
- // that is made to run when the browser has javascript enable leading into undefined behavior.
- // that's why in the next fields we are using concatenations to build the mustache placeholder.
- return (
- <Fragment>
- {btr && `{{` + `#${templateName}.building_name}}`}
- <dd>
- {location?.building_name ||
- (btr && `{{ ${templateName}.building_name }}`)}{" "}
- {location?.building_number ||
- (btr && `{{ ${templateName}.building_number }}`)}
- </dd>
- {btr && `{{` + `/${templateName}.building_name}}`}
-
- {btr && `{{` + `#${templateName}.country}}`}
- <dd>
- {location?.country || (btr && `{{ ${templateName}.country }}`)}{" "}
- {location?.country_subdivision ||
- (btr && `{{ ${templateName}.country_subdivision }}`)}
- </dd>
- {btr && `{{` + `/${templateName}.country}}`}
-
- {btr && `{{` + `#${templateName}.district}}`}
- <dd>{location?.district || (btr && `{{ ${templateName}.district }}`)}</dd>
- {btr && `{{` + `/${templateName}.district}}`}
-
- {btr && `{{` + `#${templateName}.post_code}}`}
- <dd>
- {location?.post_code || (btr && `{{ ${templateName}.post_code }}`)}
- </dd>
- {btr && `{{` + `/${templateName}.post_code}}`}
-
- {btr && `{{` + `#${templateName}.street}}`}
- <dd>{location?.street || (btr && `{{ ${templateName}.street }}`)}</dd>
- {btr && `{{` + `/${templateName}.street}}`}
-
- {btr && `{{` + `#${templateName}.town}}`}
- <dd>{location?.town || (btr && `{{ ${templateName}.town }}`)}</dd>
- {btr && `{{` + `/${templateName}.town}}`}
-
- {btr && `{{` + `#${templateName}.town_location}}`}
- <dd>
- {location?.town_location ||
- (btr && `{{ ${templateName}.town_location }}`)}
- </dd>
- {btr && `{{` + `/${templateName}.town_location}}`}
- </Fragment>
- );
-}
-
-export function ShowOrderDetails({
- order_summary,
- refund_amount,
- contract_terms,
- btr,
-}: Props): VNode {
- const { i18n } = useTranslationContext();
- const productList = btr
- ? [{} as MerchantBackend.Product]
- : contract_terms?.products || [];
- const auditorsList = btr
- ? [{} as MerchantBackend.Auditor]
- : contract_terms?.auditors || [];
- const exchangesList = btr
- ? [{} as MerchantBackend.Exchange]
- : contract_terms?.exchanges || [];
- const hasDeliveryInfo =
- btr ||
- !!contract_terms?.delivery_date ||
- !!contract_terms?.delivery_location;
-
- return (
- <Page>
- <header>
- <h1>
- <i18n.Translate>Details of order</i18n.Translate>{" "}
- {contract_terms?.order_id || `{{ contract_terms.order_id }}`}
- </h1>
- </header>
-
- <section>
- {btr && `{{#refund_amount}}`}
- {(btr || refund_amount) && (
- <section>
- <InfoBox>
- <b>
- <i18n.Translate>Refunded:</i18n.Translate>
- </b>{" "}
- <i18n.Translate>The merchant refunded you</i18n.Translate>{" "}
- <b>{refund_amount || `{{ refund_amount }}`}</b>.
- </InfoBox>
- </section>
- )}
- {btr && `{{/refund_amount}}`}
-
- {btr && `{{#contract_terms.fulfillment_message}}`}
- {(btr || contract_terms?.fulfillment_message) && (
- <section>
- <InfoBox>
- <b>
- {contract_terms?.fulfillment_message ||
- `{{ contract_terms.fulfillment_message }}`}
- </b>
- </InfoBox>
- </section>
- )}
- {btr && `{{/contract_terms.fulfillment_message}}`}
-
- <section>
- <TableExpanded>
- <dt>
- <i18n.Translate>Order summary:</i18n.Translate>
- </dt>
- <dd>{contract_terms?.summary || `{{ contract_terms.summary }}`}</dd>
- {btr && `{{#contract_terms.fulfillment_url}}`}
- <dt>Fulfillment URL:</dt>
- <dd>
- <a
- href={
- contract_terms?.fulfillment_url ||
- `{{ contract_terms.fulfillment_url }}`
- }
- >
- {contract_terms?.fulfillment_url ||
- `{{ contract_terms.fulfillment_url }}`}
- </a>
- </dd>
- {btr && `{{/contract_terms.fulfillment_url}}`}
- <dt><i18n.Translate>Amount paid:</i18n.Translate></dt>
- <dd>{contract_terms?.amount || `{{ contract_terms.amount }}`}</dd>
- <dt><i18n.Translate>Order date:</i18n.Translate></dt>
- <dd>
- {contract_terms?.timestamp
- ? contract_terms?.timestamp.t_s != "never"
- ? format(
- contract_terms?.timestamp.t_s * 1000,
- TIME_DATE_FORMAT,
- )
- : "never"
- : `{{ contract_terms.timestamp_str }}`}{" "}
- </dd>
- <dt><i18n.Translate>Merchant name:</i18n.Translate></dt>
- <dd>
- {contract_terms?.merchant.name ||
- `{{ contract_terms.merchant.name }}`}
- </dd>
- </TableExpanded>
- </section>
-
- {btr && `{{#contract_terms.hasProducts}}`}
- {!productList.length ? null : (
- <section>
- <h2><i18n.Translate>Products purchased</i18n.Translate></h2>
- <TableSimple>
- {btr && "{{" + "#contract_terms.products" + "}}"}
- {productList.map((p, i) => {
- const taxList = btr
- ? [{} as MerchantBackend.Tax]
- : p.taxes || [];
-
- return (
- <Fragment key={i}>
- <p>{p.description || `{{description}}`}</p>
- <dl>
- <dt><i18n.Translate>Quantity:</i18n.Translate></dt>
- <dd>{p.quantity || `{{quantity}}`}</dd>
-
- <dt><i18n.Translate>Price:</i18n.Translate></dt>
- <dd>{p.price || `{{price}}`}</dd>
-
- {btr && `{{#hasTaxes}}`}
- {!taxList.length ? null : (
- <Fragment>
- {btr && "{{" + "#taxes" + "}}"}
- {taxList.map((t, i) => {
- return (
- <Fragment key={i}>
- <dt>{t.name || `{{name}}`}</dt>
- <dd>{t.tax || `{{tax}}`}</dd>
- </Fragment>
- );
- })}
- {btr && "{{" + "/taxes" + "}}"}
- </Fragment>
- )}
- {btr && `{{/hasTaxes}}`}
-
- {btr && `{{#delivery_date}}`}
- {(btr || p.delivery_date) && (
- <Fragment>
- <dt><i18n.Translate>Delivered on:</i18n.Translate></dt>
- <dd>
- {p.delivery_date
- ? p.delivery_date.t_s != "never"
- ? format(p.delivery_date.t_s*1000, TIME_DATE_FORMAT)
- : "never"
- : `{{ delivery_date_str }}`}{" "}
- </dd>
- </Fragment>
- )}
- {btr && `{{/delivery_date}}`}
-
- {btr && `{{#unit}}`}
- {(btr || p.unit) && (
- <Fragment>
- <dt><i18n.Translate>Product unit:</i18n.Translate></dt>
- <dd>{p.unit || `{{.}}`}</dd>
- </Fragment>
- )}
- {btr && `{{/unit}}`}
-
- {btr && `{{#product_id}}`}
- {(btr || p.product_id) && (
- <Fragment>
- <dt><i18n.Translate>Product ID:</i18n.Translate></dt>
- <dd>{p.product_id || `{{.}}`}</dd>
- </Fragment>
- )}
- {btr && `{{/product_id}}`}
- </dl>
- </Fragment>
- );
- })}
- {btr && "{{" + "/contract_terms.products" + "}}"}
- </TableSimple>
- </section>
- )}
- {btr && `{{/contract_terms.hasProducts}}`}
-
- {btr && `{{#contract_terms.has_delivery_info}}`}
- {!hasDeliveryInfo ? null : (
- <section>
- <h2><i18n.Translate>Delivery information</i18n.Translate></h2>
- <TableExpanded>
- {btr && `{{#contract_terms.delivery_date}}`}
- {(btr || contract_terms?.delivery_date) && (
- <Fragment>
- <dt><i18n.Translate>Delivery date:</i18n.Translate></dt>
- <dd>
- {contract_terms?.delivery_date
- ? contract_terms?.delivery_date.t_s != "never"
- ? format(
- contract_terms?.delivery_date.t_s,
- TIME_DATE_FORMAT,
- )
- : i18n.str`never`
- : `{{ contract_terms.delivery_date_str }}`}{" "}
- </dd>
- </Fragment>
- )}
- {btr && `{{/contract_terms.delivery_date}}`}
-
- {btr && `{{#contract_terms.delivery_location}}`}
- {(btr || contract_terms?.delivery_location) && (
- <Fragment>
- <dt><i18n.Translate>Delivery address:</i18n.Translate></dt>
- <Location
- btr={btr}
- location={contract_terms?.delivery_location}
- templateName="contract_terms.delivery_location"
- />
- </Fragment>
- )}
- {btr && `{{/contract_terms.delivery_location}}`}
- </TableExpanded>
- </section>
- )}
- {btr && `{{/contract_terms.has_delivery_info}}`}
-
- <section>
- <h2><i18n.Translate>Full payment information</i18n.Translate></h2>
- <TableExpanded>
- <dt><i18n.Translate>Payment transfer deadline:</i18n.Translate></dt>
- {btr && `{{` + `#contract_terms.wire_transfer_deadline_str}}`}
- <dd>
- {contract_terms?.wire_transfer_deadline
- ? contract_terms?.wire_transfer_deadline.t_s != "never"
- ? format(
- contract_terms?.wire_transfer_deadline.t_s * 1000,
- TIME_DATE_FORMAT,
- )
- : "never"
- : `{{ contract_terms.wire_transfer_deadline_str }}`}{" "}
- </dd>
- {btr && `{{` + `/contract_terms.wire_transfer_deadline_str}}`}
-
- {btr && `{{` + `^contract_terms.wire_transfer_deadline_str}}`}
- <dd><i18n.Translate>Wire transfer settled.</i18n.Translate></dd>
- {btr && `{{` + `/contract_terms.wire_transfer_deadline_str}}`}
-
- {btr && `{{` + `#contract_terms.max_fee}}`}
- <dt><i18n.Translate>Maximum deposit fee:</i18n.Translate></dt>
- <dd>{contract_terms?.max_fee || `{{ contract_terms.max_fee }}`}</dd>
- {btr && `{{` + `/contract_terms.max_fee}}`}
-
- {btr && `{{` + `#contract_terms.max_wire_fee}}`}
- <dt><i18n.Translate>Maximum wire fee:</i18n.Translate></dt>
- <dd>
- {contract_terms?.max_wire_fee ||
- `{{ contract_terms.max_wire_fee }}`}
- </dd>
- {btr && `{{` + `/contract_terms.max_wire_fee}}`}
-
- </TableExpanded>
- </section>
-
- <section>
- <h2><i18n.Translate>Refund information</i18n.Translate></h2>
- <TableExpanded>
- <dt><i18n.Translate>Refund deadline:</i18n.Translate></dt>
- <dd>
- {contract_terms?.refund_deadline
- ? contract_terms?.refund_deadline.t_s != "never"
- ? format(
- contract_terms?.refund_deadline.t_s * 1000,
- TIME_DATE_FORMAT,
- )
- : i18n.str`never`
- : `{{ contract_terms.refund_deadline_str }}`}{" "}
- </dd>
-
- {btr && `{{#contract_terms.auto_refund}}`}
- {(btr || contract_terms?.auto_refund) && (
- <Fragment>
- <dt><i18n.Translate>Automatic refund available for:</i18n.Translate></dt>
- <dd>
- {contract_terms?.auto_refund
- ? contract_terms?.auto_refund.d_us != "forever"
- ? formatDuration(
- intervalToDuration({
- start: 0,
- end: contract_terms?.auto_refund.d_us,
- }),
- )
- : i18n.str`forever`
- : `{{ contract_terms.auto_refund_str }}`}{" "}
- </dd>
- </Fragment>
- )}
- {btr && `{{/contract_terms.auto_refund}}`}
- </TableExpanded>
- </section>
-
- <section>
- <h2><i18n.Translate>Additional order details</i18n.Translate></h2>
- <TableExpanded>
- <dt><i18n.Translate>Public reorder URL:</i18n.Translate></dt>
- <dd> -- <i18n.Translate>Not defined.</i18n.Translate> -- </dd>
- {btr && `{{#contract_terms.fulfillment_url}}`}
- {(btr || contract_terms?.fulfillment_url) && (
- <Fragment>
- <dt><i18n.Translate>Fulfillment URL:</i18n.Translate></dt>
- <dd>
- {contract_terms?.fulfillment_url ||
- (btr && `{{ contract_terms.fulfillment_url }}`)}
- </dd>
- </Fragment>
- )}
- {btr && `{{/contract_terms.fulfillment_url}}`}
- {/* <dt>Fulfillment message:</dt>
- <dd> -- not defined yet -- </dd> */}
- </TableExpanded>
- </section>
-
- <section>
- <h2><i18n.Translate>Full merchant information</i18n.Translate></h2>
- <TableExpanded>
- <dt><i18n.Translate>Merchant name:</i18n.Translate></dt>
- <dd>
- {contract_terms?.merchant.name ||
- `{{ contract_terms.merchant.name }}`}
- </dd>
- <dt><i18n.Translate>Merchant address:</i18n.Translate></dt>
- <Location
- btr={btr}
- location={contract_terms?.merchant.address}
- templateName="contract_terms.merchant.address"
- />
- <dt><i18n.Translate>Merchant jurisdiction:</i18n.Translate></dt>
- <Location
- btr={btr}
- location={contract_terms?.merchant.jurisdiction}
- templateName="contract_terms.merchant.jurisdiction"
- />
- <dt><i18n.Translate>Merchant URL:</i18n.Translate></dt>
- <dd>
- {contract_terms?.merchant_base_url ||
- `{{ contract_terms.merchant_base_url }}`}
- </dd>
- <dt><i18n.Translate>Merchant public key:</i18n.Translate></dt>
- <dd style="overflow-wrap: break-word;">
- {contract_terms?.merchant_pub ||
- `{{ contract_terms.merchant_pub }}`}
- </dd>
- {/* <dt>Merchant's hash:</dt>
- <dd> -- not defined yet -- </dd> */}
- </TableExpanded>
- </section>
-
- {btr && `{{#contract_terms.hasAuditors}}`}
- {!auditorsList.length ? null : (
- <section>
- <h2><i18n.Translate>Auditors accepted by the merchant</i18n.Translate></h2>
- <TableExpanded>
- {btr && "{{" + "#contract_terms.auditors" + "}}"}
- {auditorsList.map((p, i) => {
- return (
- <Fragment key={i}>
- <p>{p.name || `{{name}}`}</p>
- <dt><i18n.Translate>Auditor public key:</i18n.Translate></dt>
- <dd>{p.auditor_pub || `{{auditor_pub}}`}</dd>
- <dt><i18n.Translate>Auditor URL:</i18n.Translate></dt>
- <dd>{p.url || `{{url}}`}</dd>
- </Fragment>
- );
- })}
- {btr && "{{" + "/contract_terms.auditors" + "}}"}
- </TableExpanded>
- </section>
- )}
- {btr && `{{/contract_terms.hasAuditors}}`}
-
- {btr && `{{#contract_terms.hasExchanges}}`}
- {!exchangesList.length ? null : (
- <section>
- <h2><i18n.Translate>Exchanges accepted by the merchant</i18n.Translate></h2>
- <TableExpanded>
- {btr && "{{" + "#contract_terms.exchanges" + "}}"}
- {exchangesList.map((p, i) => {
- return (
- <Fragment key={i}>
- <dt><i18n.Translate>Exchange URL:</i18n.Translate></dt>
- <dd>{p.url || `{{url}}`}</dd>
- <dt><i18n.Translate>Exchange public key:</i18n.Translate></dt>
- <dd>{p.master_pub || `{{master_pub}}`}</dd>
- </Fragment>
- );
- })}
- {btr && "{{" + "/contract_terms.exchanges" + "}}"}
- </TableExpanded>
- </section>
- )}
- {btr && `{{/contract_terms.hasExchanges}}`}
- </section>
-
- <Footer />
- </Page>
- );
-}
-
-/**
- *
- */
-export function mount(lang: string): void {
- try {
- const fromLocation = new URL(window.location.href).searchParams;
- const os = fromLocation.get("order_summary") || undefined;
- if (os) {
- render(
- <Application lang={lang}>
- <Head order_summary={os} />
- </Application>,
- document.head,
- );
- }
-
- const ra = fromLocation.get("refund_amount") || undefined;
- const ct = fromLocation.get("contract_terms") || undefined;
-
- let contractTerms: MerchantBackend.ContractTerms | undefined;
- try {
- contractTerms = JSON.parse((window as any).contractTermsStr);
- } catch {}
-
- render(
- <Application lang={lang}>
- <ShowOrderDetails
- contract_terms={contractTerms}
- order_summary={os}
- refund_amount={ra}
- />
- </Application>,
- document.body,
- );
- } catch (e) {
- console.error("got error", e);
- if (e instanceof Error) {
- console.error("fatal rendering error", e);
- document.body.innerText =
- "Sorry, this page could not be displayed. Please try again or contact the merchant.";
- }
- }
-}
-
-/**
- * Build the mustache template at compile time.
- * @returns
- */
-export function buildTimeRendering(lang: string): {
- head: string;
- body: string;
-} {
- return {
- head: renderToString(
- <Application lang={lang}>
- <Head />
- </Application>,
- ),
- body: renderToString(
- <Application lang={lang}>
- <ShowOrderDetails btr />
- </Application>,
- ),
- };
-}
diff --git a/packages/merchant-backend-ui/src/render-examples.ts b/packages/merchant-backend-ui/src/render-examples.ts
@@ -1,149 +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 mustache from "mustache";
-import fs from "node:fs";
-import { exampleData as OfferRefundExamples } from "./pages/OfferRefund.examples.js";
-import { exampleData as RequestPaymentExamples } from "./pages/RequestPayment.examples.js";
-import { exampleData as ShowOrderDetailsExamples } from "./pages/ShowOrderDetails.examples.js";
-import {
- createDateToStringFunction,
- createDurationToStringFunction,
- createNonEmptyFunction,
-} from "./utils.js";
-/**
- * This script will emulate what the merchant backend will do when being requested
- *
- */
-
-const templateDirectory = process.argv[2];
-const destDirectory = process.argv[3];
-
-if (!templateDirectory || !destDirectory) {
- console.log("usage: render-mustache <source-directory> <dest-directory>");
- process.exit(1);
-}
-
-if (!fs.existsSync(destDirectory)) {
- fs.mkdirSync(destDirectory);
-}
-
-function fromCamelCaseName(name: string) {
- const result = name
- .replace(/^[a-z]/, (letter) => `${letter.toUpperCase()}`) //first letter lowercase
- .replace(/_[a-z]/g, (letter) => `${letter[1].toUpperCase()}`); //snake case
- return result;
-}
-/**
- * Load all the html files
- */
-const templateFiles = fs
- .readdirSync(templateDirectory)
- .filter((f) => /.html/.test(f));
-const exampleByTemplate: Record<string, any> = {
- "show_order_details.en.html": ShowOrderDetailsExamples,
- "show_order_details.de.html": ShowOrderDetailsExamples,
- "show_order_details.es.html": ShowOrderDetailsExamples,
- "offer_refund.en.html": OfferRefundExamples,
- "offer_refund.de.html": OfferRefundExamples,
- "offer_refund.es.html": OfferRefundExamples,
- "request_payment.en.html": RequestPaymentExamples,
- "request_payment.de.html": RequestPaymentExamples,
- "request_payment.es.html": RequestPaymentExamples,
-};
-
-templateFiles.forEach((templateFile) => {
- const html = fs.readFileSync(`${templateDirectory}/${templateFile}`, "utf8");
-
- const [templateFileWithoutExt, lang, extension] = templateFile.split(".");
- // const exampleFileName = `src/pages/${fromCamelCaseName(testName)}.examples`;
- // if (!fs.existsSync(`./${exampleFileName}.ts`)) {
- // console.log(`- skipping ${testName}: no examples found`);
- // return;
- // }
- // const pepe = `./${exampleFileName}.ts`
- // const { exampleData } = require(pepe);
-
- const exampleData = exampleByTemplate[templateFile];
- if (!exampleData) {
- console.log(`- skipping ${templateFile}: no examples found`);
- return;
- }
- const exampleNames = Object.keys(exampleData);
- console.log(`+ rendering ${templateFile}: ${exampleNames.length} examples`);
- exampleNames.forEach((exampleName) => {
- const example = exampleData[exampleName];
-
- //enhance the example with more information
- if (example.contract_terms) {
- example.contract_terms_json = () =>
- JSON.stringify(example.contract_terms);
-
- example.contract_terms.timestamp_str = createDateToStringFunction(
- example.contract_terms.timestamp,
- );
-
- example.contract_terms.hasProducts = createNonEmptyFunction(
- example.contract_terms.products,
- );
- example.contract_terms.hasAuditors = createNonEmptyFunction(
- example.contract_terms.auditors,
- );
- example.contract_terms.hasExchanges = createNonEmptyFunction(
- example.contract_terms.exchanges,
- );
-
- example.contract_terms.products.forEach((p: any) => {
- p.delivery_date_str = createDateToStringFunction(p.delivery_date);
- p.hasTaxes = createNonEmptyFunction(p.taxes);
- });
-
- example.contract_terms.has_delivery_info = () =>
- example.contract_terms.delivery_date ||
- example.contract_terms.delivery_location;
-
- example.contract_terms.delivery_date_str = createDateToStringFunction(
- example.contract_terms.delivery_date,
- );
- example.contract_terms.pay_deadline_str = createDateToStringFunction(
- example.contract_terms.pay_deadline,
- );
- example.contract_terms.wire_transfer_deadline_str =
- createDateToStringFunction(
- example.contract_terms.wire_transfer_deadline,
- );
-
- example.contract_terms.refund_deadline_str = createDateToStringFunction(
- example.contract_terms.refund_deadline,
- );
- example.contract_terms.auto_refund_str = createDurationToStringFunction(
- example.contract_terms.auto_refund,
- );
- }
-
- const output = mustache.render(html, example);
-
- fs.writeFileSync(
- `${destDirectory}/${templateFileWithoutExt}.${lang}.${exampleName}.html`,
- output,
- );
- });
-});
diff --git a/packages/merchant-backend-ui/src/styled/index.module.css b/packages/merchant-backend-ui/src/styled/index.module.css
@@ -1,176 +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/>
- */
-
-.QRPlaceholder {
- margin: auto;
- text-align: center;
- width: 340px;
-}
-
-.FooterBar {
- text-align: center;
- background-color: #033;
- color: white;
- padding: 1em;
- overflow: auto;
-}
-
-.FooterBar > p > a:link,
-.FooterBar > p > a:visited,
-.FooterBar > p > a:hover,
-.FooterBar > p > a:active {
- color: white;
-}
-
-.Page {
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- min-height: 100vh;
- align-items: center;
-}
-
-.Page a:link,
-.Page a:visited,
-.Page a:hover,
-.Page a:active {
- color: black;
-}
-
-.Page section {
- text-align: center;
- width: calc(100% - 20px);
- margin-bottom: auto;
- padding-left: 10px;
- padding-right: 10px;
-}
-
-.Page section:not(:first-of-type) {
- margin-top: 2em;
-}
-
-.Page > header {
- display: flex;
- flex-direction: row;
- justify-content: space-between;
- text-align: center;
-}
-
-.Page > footer {
- display: flex;
- flex-direction: row;
- justify-content: space-around;
- width: 100%;
- margin-bottom: 0px;
-}
-
-.Center {
- display: flex;
- justify-content: center;
-}
-
-.WalletLink {
- display: inline-block;
- zoom: 1;
- line-height: normal;
- white-space: nowrap;
- vertical-align: middle;
- text-align: center;
- cursor: pointer;
- user-select: none;
- box-sizing: border-box;
-
- font-family: inherit;
- font-size: 100%;
- padding: 0.5em 1em;
- color: #444; /* rgba not supported (IE 8) */
- color: rgba(0, 0, 0, 0.8); /* rgba supported */
- border: 1px solid #999; /*IE 6/7/8*/
- border: none rgba(0, 0, 0, 0); /*IE9 + everything else*/
- background-color: #e6e6e6;
- text-decoration: none;
- border-radius: 2px;
- text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
- box-shadow:
- 0 0 0 1px rgba(0, 0, 0, 0.15) inset,
- 0 0 6px rgba(0, 0, 0, 0.2) inset;
- border-color: #000;
-}
-
-.WalletLink:focus {
- outline: 0;
-}
-
-.WalletLink:disabled {
- border: none;
- background-image: none;
- /* csslint ignore:start */
- filter: alpha(opacity=40);
- /* csslint ignore:end */
- opacity: 0.4;
- cursor: not-allowed;
- box-shadow: none;
- pointer-events: none;
-}
-
-.WalletLink:hover {
- filter: alpha(opacity=90);
- background-image: linear-gradient(
- transparent,
- rgba(0, 0, 0, 0.05) 40%,
- rgba(0, 0, 0, 0.1)
- );
-}
-
-.InfoBox {
- border-radius: 0.25em;
- flex-direction: column;
- /* margin: 0.5em; */
- padding: 1em;
- /* width: 100%; */
- border: solid 1px #b8daff;
- background-color: #cce5ff;
- color: #004085;
-}
-
-.TableExpanded {
- text-align: left;
-}
-
-.TableExpanded dt {
- font-weight: bold;
- margin-top: 1em;
-}
-
-.TableExpanded dd {
- margin-inline-start: 0px;
-}
-
-.TableSimple {
- text-align: left;
-}
-
-.TableSimple dt {
- font-weight: bold;
- display: inline-block;
- width: 30%;
-}
-
-.TableSimple dd {
- margin-inline-start: 0px;
- display: inline-block;
- width: 70%;
-}
diff --git a/packages/merchant-backend-ui/src/styled/index.tsx b/packages/merchant-backend-ui/src/styled/index.tsx
@@ -1,64 +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, JSX } from "preact";
-import styles from "./index.module.css";
-
-function classNames(...classes: (string | undefined | null | false)[]) {
- return classes.filter(Boolean).join(" ");
-}
-
-export function QRPlaceholder(props: JSX.HTMLAttributes<HTMLDivElement>) {
- return <div {...props} class={classNames(styles.QRPlaceholder, props.class as string)} />;
-}
-
-export function FooterBar(props: JSX.HTMLAttributes<HTMLElement>) {
- return <footer {...props} class={classNames(styles.FooterBar, props.class as string)} />;
-}
-
-export function Page(props: JSX.HTMLAttributes<HTMLDivElement>) {
- return <div {...props} class={classNames(styles.Page, props.class as string)} />;
-}
-
-export function Center(props: JSX.HTMLAttributes<HTMLDivElement>) {
- return <div {...props} class={classNames(styles.Center, props.class as string)} />;
-}
-
-export interface WalletLinkProps extends JSX.HTMLAttributes<HTMLAnchorElement> {
- upperCased?: boolean;
-}
-
-export function WalletLink(props: WalletLinkProps) {
- const { upperCased, style, ...rest } = props;
- const linkStyle = upperCased ? { textTransform: "uppercase", ...((style as object) || {}) } : style;
- return <a {...rest} style={linkStyle} class={classNames(styles.WalletLink, props.class as string)} />;
-}
-
-export function InfoBox(props: JSX.HTMLAttributes<HTMLDivElement>) {
- return <div {...props} class={classNames(styles.InfoBox, props.class as string)} />;
-}
-
-export function TableExpanded(props: JSX.HTMLAttributes<HTMLDListElement>) {
- return <dl {...props} class={classNames(styles.TableExpanded, props.class as string)} />;
-}
-
-export function TableSimple(props: JSX.HTMLAttributes<HTMLDListElement>) {
- return <dl {...props} class={classNames(styles.TableSimple, props.class as string)} />;
-}
diff --git a/packages/merchant-backend-ui/src/utils.ts b/packages/merchant-backend-ui/src/utils.ts
@@ -1,41 +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/>
- */
-
-import { format, formatDuration, intervalToDuration } from "date-fns";
-
-export const TIME_DATE_FORMAT = "dd MMM yyyy HH:mm:ss"
-
-export function createDateToStringFunction(date: any) {
- return () => {
- if (!date) return "";
- return format(date.t_s * 1000, TIME_DATE_FORMAT);
- }
-}
-
-export function createDurationToStringFunction(duration: any) {
- return () => {
- if (!duration) return "";
- return formatDuration(intervalToDuration({ start: 0, end: duration.d_us }));
- }
-}
-
-export function createNonEmptyFunction(list: any) {
- return () => {
- if (!list) return false;
- return list.length > 0;
- }
-}
-
diff --git a/packages/merchant-backend-ui/src/utils/i18n.ts b/packages/merchant-backend-ui/src/utils/i18n.ts
@@ -1,181 +0,0 @@
-// @ts-ignore: no type decl for this library
-import * as jedLib from "jed";
-
-export let jed: any = undefined;
-
-/**
- * Set up jed library for internationalization,
- * based on browser language settings.
- */
-export function setupI18n(lang: string, strings: { [s: string]: any }): void {
- lang = lang.replace("_", "-");
-
- if (!strings[lang]) {
- strings[lang] = {};
- }
- jed = new jedLib.Jed(strings[lang]);
-}
-
-/**
- * Use different translations for testing. Should not be used outside
- * of test cases.
- */
-export function internalSetStrings(langStrings: any): void {
- jed = new jedLib.Jed(langStrings);
-}
-
-declare const __translated: unique symbol;
-export type TranslatedString = string & { [__translated]: true };
-export type ToTranslateString = string & { [__translated]: true };
-
-/**
- * Convert template strings to a msgid
- */
-function toI18nString(stringSeq: ReadonlyArray<string>): TranslatedString {
- let s = "";
- for (let i = 0; i < stringSeq.length; i++) {
- s += stringSeq[i];
- if (i < stringSeq.length - 1) {
- s += `%${i + 1}$s`;
- }
- }
- return s as TranslatedString;
-}
-
-/**
- * Internationalize a string template with arbitrary serialized values.
- */
-export function singular(
- stringSeq: TemplateStringsArray,
- ...values: any[]
-): TranslatedString {
- const s = toI18nString(stringSeq);
- // jed throws a Error when key is empty
- if (!s) return "" as TranslatedString;
- const tr = jed
- .translate(s)
- .ifPlural(1, s)
- .fetch(...values);
- return tr;
-}
-
-function withContext(ctx: string): typeof singular {
- return function (t: TemplateStringsArray, ...v: any[]): TranslatedString {
- const s = toI18nString(t);
- const tr = jed
- .translate(s)
- .withContext(ctx)
- .ifPlural(1, s)
- .fetch(...v);
- return tr;
- };
-}
-
-/**
- * Internationalize a string template without serializing
- */
-export function translate(
- stringSeq: TemplateStringsArray,
- ...values: any[]
-): TranslatedString[] {
- const s = toI18nString(stringSeq);
- if (!s) return [];
- const translation: TranslatedString = jed.ngettext(s, s, 1);
- return replacePlaceholderWithValues(translation, values);
-}
-
-/**
- * Internationalize a string template without serializing
- */
-export function Translate({
- children,
- debug,
- context: ctx,
-}: {
- children: any;
- debug?: boolean;
- context?: string;
-}): any {
- const c = [].concat(children);
- const s = stringifyArray(c);
- if (!s) return [];
- const translation: TranslatedString = ctx
- ? jed.npgettext(ctx, s, s, 1)
- : jed.ngettext(s, s, 1);
- if (debug) {
- console.log("looking for ", s, "got", translation);
- }
- return replacePlaceholderWithValues(translation, c);
-}
-
-/**
- * Get an internationalized string (based on the globally set, current language)
- * from a JSON object. Fall back to the default language of the JSON object
- * if no match exists.
- */
-export function getJsonI18n<K extends string>(
- obj: Record<K, string>,
- key: K,
-): string {
- return obj[key];
-}
-
-export function getTranslatedArray(array: Array<any>) {
- const s = stringifyArray(array);
- const translation: TranslatedString = jed.ngettext(s, s, 1);
- return replacePlaceholderWithValues(translation, array);
-}
-
-function replacePlaceholderWithValues(
- translation: TranslatedString,
- childArray: Array<any>,
-): Array<any> {
- const tr = translation.split(/%(\d+)\$s/);
- // const childArray = toChildArray(children);
- // Merge consecutive string children.
- const placeholderChildren = [];
- for (let i = 0; i < childArray.length; i++) {
- const x = childArray[i];
- if (x === undefined) {
- continue;
- } else if (typeof x === "string") {
- continue;
- } else {
- placeholderChildren.push(x);
- }
- }
- const result = [];
- for (let i = 0; i < tr.length; i++) {
- if (i % 2 == 0) {
- // Text
- result.push(tr[i]);
- } else {
- const childIdx = Number.parseInt(tr[i]) - 1;
- result.push(placeholderChildren[childIdx]);
- }
- }
- return result;
-}
-
-function stringifyArray(children: Array<any>): string {
- let n = 1;
- const ss = children.map((c) => {
- if (typeof c === "string") {
- return c;
- }
- return `%${n++}$s`;
- });
- const s = ss.join("").replace(/ +/g, " ").trim();
- return s;
-}
-
-export type InternationalizationAPI = typeof i18n;
-export type Translator = (i18n: InternationalizationAPI) => TranslatedString;
-
-export const i18n = {
- str: singular,
- ctx: withContext,
- singular,
- Translate,
- translate,
-};
diff --git a/packages/merchant-backend-ui/trim-extension.cjs b/packages/merchant-backend-ui/trim-extension.cjs
@@ -1,23 +0,0 @@
-// Simple plugin to trim extensions from the filename of relative import statements.
-// Required to get standard build tools to work with `moduleResulution: "Node16"` imports.
-// @author Florian Dold
-module.exports = function({ types: t }) {
- return {
- name: "trim-extension",
- visitor: {
- ImportDeclaration: (x) => {
- const src = x.node.source;
- if (src.value.startsWith(".")) {
- if (src.value.endsWith(".js")) {
- const newVal = src.value.replace(/[.]js$/, "")
- x.node.source = t.stringLiteral(newVal);
- }
- }
- if (src.value.endsWith(".jsx")) {
- const newVal = src.value.replace(/[.]jsx$/, "")
- x.node.source = t.stringLiteral(newVal);
- }
- },
- }
- };
-}
diff --git a/packages/merchant-backend-ui/tsconfig.json b/packages/merchant-backend-ui/tsconfig.json
@@ -1,12 +0,0 @@
-{
- "extends": "../../tsconfig.defaults.json",
- "compilerOptions": {
- "allowJs": true,
- "types": ["node"],
- "jsx": "react",
- "jsxFactory": "h",
- "jsxFragmentFactory": "Fragment",
- "noEmit": true
- },
- "include": ["src/**/*", "tests/**/*"]
-}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
@@ -237,46 +237,6 @@ importers:
specifier: 7.0.2
version: 7.0.2
- packages/merchant-backend-ui:
- dependencies:
- date-fns:
- specifier: ^2.21.1
- version: 2.29.3
- jed:
- specifier: 1.1.1
- version: 1.1.1
- preact:
- specifier: 10.11.3
- version: 10.11.3
- qrcode-generator:
- specifier: ^1.4.4
- version: 1.4.4
- devDependencies:
- '@gnu-taler/pogen':
- specifier: workspace:*
- version: link:../pogen
- '@types/mustache':
- specifier: ^4.1.2
- version: 4.2.1
- '@types/node':
- specifier: ^20.19.41
- version: 20.19.41
- mustache:
- specifier: ^4.2.0
- version: 4.2.0
- preact-render-to-string:
- specifier: ^5.1.19
- version: 5.2.6(preact@10.11.3)
- ts-node:
- specifier: ^10.9.1
- version: 10.9.1(@types/node@20.19.41)(typescript@7.0.2)
- tslib:
- specifier: 2.6.2
- version: 2.6.2
- typescript:
- specifier: 7.0.2
- version: 7.0.2
-
packages/pogen:
dependencies:
'@types/node':
@@ -1272,9 +1232,6 @@ packages:
'@types/json5@0.0.29':
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
- '@types/mustache@4.2.1':
- resolution: {integrity: sha512-gFAlWL9Ik21nJioqjlGCnNYbf9zHi0sVbaZ/1hQEBcCEuxfLJDvz4bVJSV6v6CUaoLOz0XEIoP7mSrhJ6o237w==}
-
'@types/node@20.19.41':
resolution: {integrity: sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==}
@@ -2492,10 +2449,6 @@ packages:
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
- mustache@4.2.0:
- resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==}
- hasBin: true
-
mz@2.7.0:
resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
@@ -3029,9 +2982,6 @@ packages:
tsconfig-paths@3.15.0:
resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
- tslib@2.6.2:
- resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
-
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
@@ -3209,6 +3159,7 @@ snapshots:
'@cspotcode/source-map-support@0.8.1':
dependencies:
'@jridgewell/trace-mapping': 0.3.9
+ optional: true
'@esbuild/aix-ppc64@0.28.0':
optional: true
@@ -3392,6 +3343,7 @@ snapshots:
dependencies:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.5
+ optional: true
'@kurkle/color@0.3.4': {}
@@ -3419,13 +3371,17 @@ snapshots:
mini-svg-data-uri: 1.4.4
tailwindcss: 3.4.17(ts-node@10.9.1(@types/node@20.19.41)(typescript@7.0.2))
- '@tsconfig/node10@1.0.9': {}
+ '@tsconfig/node10@1.0.9':
+ optional: true
- '@tsconfig/node12@1.0.11': {}
+ '@tsconfig/node12@1.0.11':
+ optional: true
- '@tsconfig/node14@1.0.3': {}
+ '@tsconfig/node14@1.0.3':
+ optional: true
- '@tsconfig/node16@1.0.3': {}
+ '@tsconfig/node16@1.0.3':
+ optional: true
'@types/better-sqlite3@7.6.8':
dependencies:
@@ -3465,8 +3421,6 @@ snapshots:
'@types/json5@0.0.29': {}
- '@types/mustache@4.2.1': {}
-
'@types/node@20.19.41':
dependencies:
undici-types: 6.21.0
@@ -3652,6 +3606,7 @@ snapshots:
acorn-walk@8.3.5:
dependencies:
acorn: 8.16.0
+ optional: true
acorn@8.16.0: {}
@@ -3679,7 +3634,8 @@ snapshots:
normalize-path: 3.0.0
picomatch: 2.3.2
- arg@4.1.3: {}
+ arg@4.1.3:
+ optional: true
arg@5.0.2: {}
@@ -3932,7 +3888,8 @@ snapshots:
core-util-is@1.0.3: {}
- create-require@1.1.1: {}
+ create-require@1.1.1:
+ optional: true
cross-spawn@7.0.6:
dependencies:
@@ -3998,7 +3955,8 @@ snapshots:
didyoumean@1.2.2: {}
- diff@4.0.2: {}
+ diff@4.0.2:
+ optional: true
dlv@1.1.3: {}
@@ -4781,7 +4739,8 @@ snapshots:
dependencies:
semver: 7.8.0
- make-error@1.3.6: {}
+ make-error@1.3.6:
+ optional: true
math-intrinsics@1.1.0: {}
@@ -4812,8 +4771,6 @@ snapshots:
ms@2.1.3: {}
- mustache@4.2.0: {}
-
mz@2.7.0:
dependencies:
any-promise: 1.3.0
@@ -5419,6 +5376,7 @@ snapshots:
typescript: 7.0.2
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
+ optional: true
tsconfig-paths@3.15.0:
dependencies:
@@ -5427,8 +5385,6 @@ snapshots:
minimist: 1.2.8
strip-bom: 3.0.0
- tslib@2.6.2: {}
-
tslib@2.8.1: {}
type-check@0.4.0:
@@ -5533,7 +5489,8 @@ snapshots:
util-deprecate@1.0.2: {}
- v8-compile-cache-lib@3.0.1: {}
+ v8-compile-cache-lib@3.0.1:
+ optional: true
v8-to-istanbul@9.3.0:
dependencies:
@@ -5622,6 +5579,7 @@ snapshots:
y18n: 5.0.8
yargs-parser: 21.1.1
- yn@3.1.1: {}
+ yn@3.1.1:
+ optional: true
yocto-queue@0.1.0: {}
diff --git a/tsconfig.json b/tsconfig.json
@@ -36,9 +36,6 @@
"path": "packages/taler-exchange-kyc-webui/"
},
{
- "path": "packages/merchant-backend-ui/"
- },
- {
"path": "packages/taler-merchant-webui/"
},
{