diff options
author | Christian Blättler <blatc2@bfh.ch> | 2024-06-13 11:35:52 +0200 |
---|---|---|
committer | Christian Blättler <blatc2@bfh.ch> | 2024-06-13 11:35:52 +0200 |
commit | eb964dfae0a12f9a90eb066d610f627538f8997c (patch) | |
tree | 26a6cd74c9a29edce05b2dcd51cf497374bf8e30 /packages/merchant-backoffice-ui | |
parent | 9d0fc80a905e02a0a0b63dd547daac6e7b17fb52 (diff) | |
parent | f9d4ff5b43e48a07ac81d7e7ef800ddb12f5f90a (diff) | |
download | wallet-core-eb964dfae0a12f9a90eb066d610f627538f8997c.tar.xz |
Merge branch 'master' into feature/tokens
Diffstat (limited to 'packages/merchant-backoffice-ui')
15 files changed, 227 insertions, 176 deletions
diff --git a/packages/merchant-backoffice-ui/package.json b/packages/merchant-backoffice-ui/package.json index e80604777..8aabdce87 100644 --- a/packages/merchant-backoffice-ui/package.json +++ b/packages/merchant-backoffice-ui/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "@gnu-taler/merchant-backoffice-ui", - "version": "0.10.7", + "version": "0.11.4", "license": "AGPL-3.0-or-later", "type": "module", "scripts": { diff --git a/packages/merchant-backoffice-ui/src/components/form/InputPaytoForm.tsx b/packages/merchant-backoffice-ui/src/components/form/InputPaytoForm.tsx index a0c15c77c..4ac798afe 100644 --- a/packages/merchant-backoffice-ui/src/components/form/InputPaytoForm.tsx +++ b/packages/merchant-backoffice-ui/src/components/form/InputPaytoForm.tsx @@ -18,13 +18,10 @@ * * @author Sebastian Javier Marchano (sebasjm) */ -import { - parsePaytoUri, - PaytoUriGeneric, - stringifyPaytoUri, -} from "@gnu-taler/taler-util"; +import { parsePaytoUri, stringifyPaytoUri } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { Fragment, h, VNode } from "preact"; +import { useEffect, useState } from "preact/hooks"; import { COUNTRY_TABLE } from "../../utils/constants.js"; import { undefinedIfEmpty } from "../../utils/table.js"; import { FormErrors, FormProvider } from "./FormProvider.js"; @@ -32,7 +29,6 @@ import { Input } from "./Input.js"; import { InputGroup } from "./InputGroup.js"; import { InputSelector } from "./InputSelector.js"; import { InputProps, useField } from "./useField.js"; -import { useEffect, useState } from "preact/hooks"; export interface Props<T> extends InputProps<T> { isValid?: (e: any) => boolean; @@ -108,13 +104,13 @@ function validateEthereum_path1( * bank.com/path * bank.com/path/subpath/ */ -const DOMAIN_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9](?:\.[a-zA-Z]{2,})+(\/[a-zA-Z0-9-.]+)*\/?$/ +const DOMAIN_REGEX = + /^[a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9-_](?:\.[a-zA-Z0-9-_]{2,})+(:[0-9]+)?(\/[a-zA-Z0-9-.]+)*\/?$/; function validateTalerBank_path1( addr: string, i18n: ReturnType<typeof useTranslationContext>["i18n"], ): string | undefined { - console.log(addr, DOMAIN_REGEX.test(addr)) try { const valid = DOMAIN_REGEX.test(addr); if (valid) return undefined; @@ -206,6 +202,7 @@ export function InputPaytoForm<T>({ const { value: initialValueStr, onChange } = useField<T>(name); const initialPayto = parsePaytoUri(initialValueStr ?? ""); + const paths = !initialPayto ? [] : initialPayto.targetPath.split("/"); const initialPath1 = paths.length >= 1 ? paths[0] : undefined; const initialPath2 = paths.length >= 2 ? paths[1] : undefined; @@ -219,6 +216,22 @@ export function InputPaytoForm<T>({ path2: initialPath2, }; const [value, setValue] = useState<Partial<Entity>>(initial); + useEffect(() => { + const nv = parsePaytoUri(initialValueStr ?? ""); + const paths = !initialPayto ? [] : initialPayto.targetPath.split("/"); + if (nv !== undefined && nv.isKnown) { + if (nv.targetType === "iban" && paths.length >= 2) { + //FIXME: workaround EBIC not supported + paths[0] = paths[1] + } + setValue({ + target: nv.targetType, + params: nv.params, + path1: paths.length >= 1 ? paths[0] : undefined, + path2: paths.length >= 2 ? paths[1] : undefined, + }); + } + }, [initialValueStr]); const { i18n } = useTranslationContext(); @@ -252,7 +265,8 @@ export function InputPaytoForm<T>({ (k) => (errors as any)[k] !== undefined, ); - const path1WithSlash = value.path1 && !value.path1.endsWith("/") ? value.path1 + "/" : value.path1 + const path1WithSlash = + value.path1 && !value.path1.endsWith("/") ? value.path1 + "/" : value.path1; const str = hasErrors || !value.target ? undefined @@ -268,37 +282,6 @@ export function InputPaytoForm<T>({ onChange(str as any); }, [str]); - // const submit = useCallback((): void => { - // // const accounts: TalerMerchantApi.AccountAddDetails[] = paytos; - // // const alreadyExists = - // // accounts.findIndex((x) => x.payto_uri === paytoURL) !== -1; - // // if (!alreadyExists) { - // const newValue: TalerMerchantApi.AccountAddDetails = { - // payto_uri: paytoURL, - // }; - // if (value.auth) { - // if (value.auth.url) { - // newValue.credit_facade_url = value.auth.url; - // } - // if (value.auth.type === "none") { - // newValue.credit_facade_credentials = { - // type: "none", - // }; - // } - // if (value.auth.type === "basic") { - // newValue.credit_facade_credentials = { - // type: "basic", - // username: value.auth.username ?? "", - // password: value.auth.password ?? "", - // }; - // } - // } - // onChange(newValue as any); - // // } - // // valueHandler(defaultTarget); - // }, [value]); - - //FIXME: translating plural singular return ( <InputGroup name="payto" label={label} fixed tooltip={tooltip}> <FormProvider<Entity> @@ -413,11 +396,17 @@ export function InputPaytoForm<T>({ return v; }} tooltip={i18n.str`Bank host.`} - help={<Fragment> - <div><i18n.Translate>Without scheme and may include subpath:</i18n.Translate></div> - <div>bank.com/</div> - <div>bank.com/path/subpath/</div> - </Fragment>} + help={ + <Fragment> + <div> + <i18n.Translate> + Without scheme and may include subpath: + </i18n.Translate> + </div> + <div>bank.com/</div> + <div>bank.com/path/subpath/</div> + </Fragment> + } /> <Input<Entity> name="path2" diff --git a/packages/merchant-backoffice-ui/src/components/instance/DefaultInstanceFormFields.tsx b/packages/merchant-backoffice-ui/src/components/instance/DefaultInstanceFormFields.tsx index 864d09f48..efcca302f 100644 --- a/packages/merchant-backoffice-ui/src/components/instance/DefaultInstanceFormFields.tsx +++ b/packages/merchant-backoffice-ui/src/components/instance/DefaultInstanceFormFields.tsx @@ -60,22 +60,6 @@ export function DefaultInstanceFormFields({ tooltip={i18n.str`Legal name of the business represented by this instance.`} /> - <TextField name="asdasd" label=""> - <i18n.Translate> - Choose individual if you don't have or are not required to have legal business permission. - </i18n.Translate> - </TextField> - - <InputSelector<Entity> - name="user_type" - label={i18n.str`Selling as`} - tooltip={i18n.str`Different type of account can have different rules and requirements.`} - values={["business", "individual"]} - toStr={(d: string) => { - return d.toUpperCase(); - }} - /> - <Input<Entity> name="email" label={i18n.str`Email`} diff --git a/packages/merchant-backoffice-ui/src/components/menu/SideBar.tsx b/packages/merchant-backoffice-ui/src/components/menu/SideBar.tsx index dbe21e0e9..aeb49e81d 100644 --- a/packages/merchant-backoffice-ui/src/components/menu/SideBar.tsx +++ b/packages/merchant-backoffice-ui/src/components/menu/SideBar.tsx @@ -111,7 +111,7 @@ export function Sidebar({ mobile }: Props): VNode { <li> <a href={"/templates"} class="has-icon"> <span class="icon"> - <i class="mdi mdi-newspaper" /> + <i class="mdi mdi-qrcode" /> </span> <span class="menu-item-label"> <i18n.Translate>Templates</i18n.Translate> @@ -166,7 +166,7 @@ export function Sidebar({ mobile }: Props): VNode { <li> <a href={"/webhooks"} class="has-icon"> <span class="icon"> - <i class="mdi mdi-newspaper" /> + <i class="mdi mdi-webhook" /> </span> <span class="menu-item-label"> <i18n.Translate>Webhooks</i18n.Translate> diff --git a/packages/merchant-backoffice-ui/src/components/modal/index.tsx b/packages/merchant-backoffice-ui/src/components/modal/index.tsx index 1335d0f77..43062d13e 100644 --- a/packages/merchant-backoffice-ui/src/components/modal/index.tsx +++ b/packages/merchant-backoffice-ui/src/components/modal/index.tsx @@ -24,9 +24,14 @@ import { ComponentChildren, Fragment, h, VNode } from "preact"; import { useState } from "preact/hooks"; import { DEFAULT_REQUEST_TIMEOUT } from "../../utils/constants.js"; import { Spinner } from "../exception/loading.js"; -import { FormProvider } from "../form/FormProvider.js"; +import { FormErrors, FormProvider } from "../form/FormProvider.js"; import { Input } from "../form/Input.js"; import { useSessionContext } from "../../context/session.js"; +import { + AccountLetter, + codecForAccountLetter, + PaytoString, +} from "@gnu-taler/taler-util"; interface Props { active?: boolean; @@ -201,6 +206,88 @@ export function ClearConfirmModal({ ); } +interface ImportingAccountModalProps { + onCancel: () => void; + onConfirm: (account: AccountLetter) => void; +} + +export function ImportingAccountModal({ + onCancel, + onConfirm, +}: ImportingAccountModalProps): VNode { + const { i18n } = useTranslationContext(); + const [letter, setLetter] = useState<string>(); + let parsed = undefined; + try { + parsed = JSON.parse(letter ?? ""); + } catch (e) { + parsed = undefined; + } + let account: AccountLetter | undefined = undefined; + let parsingError: string | undefined = undefined; + try { + account = + parsed !== undefined ? codecForAccountLetter().decode(parsed) : undefined; + } catch (e) { + account = undefined; + if (e instanceof Error) { + parsingError = e.message; + } + } + const errors: FormErrors<{ letter: string }> = { + letter: !letter + ? i18n.str`required` + : parsed === undefined + ? i18n.str`letter should be a JSON string` + : account === undefined + ? i18n.str`JSON string is invalid` + : undefined, + }; + return ( + <ConfirmModal + label={i18n.str`Import`} + description={i18n.str`Importing an account from the bank`} + active + onCancel={onCancel} + disabled={account === undefined} + onConfirm={() => onConfirm(account!)} + > + <p> + <i18n.Translate> + You can export your account settings from the Libeufin Bank's account + profile. Paste the content in the next field. + </i18n.Translate> + </p> + <div class="field is-horizontal"> + <div class="field-label is-normal"> + <label class="label"> + <i18n.Translate>Account information</i18n.Translate> + </label> + </div> + <div class="field-body is-flex-grow-3"> + <div class="field"> + <p class="control"> + <input + class="input" + value={letter ?? ""} + onChange={(e) => { + setLetter(e.currentTarget.value); + }} + /> + </p> + {letter !== undefined && errors.letter && ( + <p class="help is-danger">{errors.letter}</p> + )} + {parsingError !== undefined && ( + <p class="help is-danger">{parsingError}</p> + )} + </div> + </div> + </div> + </ConfirmModal> + ); +} + interface DeleteModalProps { element: { id: string; name: string }; onCancel: () => void; diff --git a/packages/merchant-backoffice-ui/src/paths/instance/accounts/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/accounts/create/CreatePage.tsx index d05375b6c..d0e7a83cd 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/accounts/create/CreatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/accounts/create/CreatePage.tsx @@ -31,6 +31,7 @@ import { import { Input } from "../../../../components/form/Input.js"; import { InputPaytoForm } from "../../../../components/form/InputPaytoForm.js"; import { InputSelector } from "../../../../components/form/InputSelector.js"; +import { ImportingAccountModal } from "../../../../components/modal/index.js"; import { undefinedIfEmpty } from "../../../../utils/table.js"; import { safeConvertURL } from "../update/UpdatePage.js"; @@ -46,6 +47,7 @@ const accountAuthType = ["none", "basic"]; export function CreatePage({ onCreate, onBack }: Props): VNode { const { i18n } = useTranslationContext(); + const [importing, setImporting] = useState(false); const [state, setState] = useState<Partial<Entity>>({}); const facadeURL = safeConvertURL(state.credit_facade_url); const errors: FormErrors<Entity> = { @@ -115,9 +117,25 @@ export function CreatePage({ onCreate, onBack }: Props): VNode { credit_facade_url, }); }; - return ( <div> + {importing && <ImportingAccountModal onCancel={()=> {setImporting(false)}} onConfirm={(ac) => { + state.payto_uri = ac.accountURI + const u = new URL(ac.infoURL) + u.password = "" + if (u.username || u.password) { + state.credit_facade_credentials = { + type: "basic", + password: u.password, + username: u.username, + } + state.repeatPassword = u.password + } + u.password = "" + u.username = "" + state.credit_facade_url = u.href; + setImporting(false) + }} />} <section class="section is-main-section"> <div class="columns"> <div class="column" /> @@ -171,6 +189,16 @@ export function CreatePage({ onCreate, onBack }: Props): VNode { </FormProvider> <div class="buttons is-right mt-5"> + <button + class="button is-info" + data-tooltip={i18n.str`Need to complete marked fields`} + onClick={() => { + setImporting(true) + }} + > + <i18n.Translate>Import from bank</i18n.Translate> + </button> + {onBack && ( <button class="button" onClick={onBack}> <i18n.Translate>Cancel</i18n.Translate> diff --git a/packages/merchant-backoffice-ui/src/paths/instance/accounts/create/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/accounts/create/index.tsx index 9bab33f6f..aa1481a2e 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/accounts/create/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/accounts/create/index.tsx @@ -24,6 +24,7 @@ import { HttpStatusCode, OperationFail, OperationOk, + PaytoString, TalerError, TalerMerchantApi, TalerRevenueHttpClient, @@ -67,51 +68,55 @@ export default function CreateValidator({ onConfirm, onBack }: Props): VNode { const resp = await testRevenueAPI( revenueAPI, request.credit_facade_credentials, + request.payto_uri, ); + if (resp instanceof TalerError) { + setNotif({ + message: i18n.str`Could not add bank account`, + type: "ERROR", + description: i18n.str`The request to check the revenue API failed.`, + details: JSON.stringify(resp.errorDetail, undefined, 2), + }); + return; + } if (resp.type === "fail") { switch (resp.case) { - case TestRevenueErrorType.NO_CONFIG: { - setNotif({ - message: i18n.str`Could not create account`, - type: "ERROR", - description: i18n.str`The endpoint doesn't seems to be a Taler Revenue API`, - }); - return; - } - case TestRevenueErrorType.CLIENT_BAD_REQUEST: { + case HttpStatusCode.BadRequest: { setNotif({ - message: i18n.str`Could not create account`, + message: i18n.str`Could not add bank account`, type: "ERROR", description: i18n.str`Server replied with "bad request".`, }); return; + } - case TestRevenueErrorType.UNAUTHORIZED: { + case HttpStatusCode.Unauthorized: { setNotif({ - message: i18n.str`Could not create account`, + message: i18n.str`Could not add bank account`, type: "ERROR", description: i18n.str`Unauthorized, try with another credentials.`, }); return; + } - case TestRevenueErrorType.NOT_FOUND: { + case HttpStatusCode.NotFound: { setNotif({ - message: i18n.str`Could not create account`, + message: i18n.str`Could not add bank account`, type: "ERROR", - description: i18n.str`Check facade URL, server replied with "not found".`, + description: i18n.str`The endpoint doesn't seems to be a Taler Revenue API`, }); return; } - case TestRevenueErrorType.GENERIC_ERROR: { + case TestRevenueErrorType.ANOTHER_ACCOUNT: { setNotif({ - message: i18n.str`Could not create account`, + message: i18n.str`Could not add bank account`, type: "ERROR", - description: resp.detail.hint, + description: i18n.str`The account info URL returned information from an account which is not the same in the account form: ${resp.detail.hint}`, }); return; } default: { - assertUnreachable(resp.case); + assertUnreachable(resp); } } } @@ -136,17 +141,18 @@ export default function CreateValidator({ onConfirm, onBack }: Props): VNode { } export enum TestRevenueErrorType { - NO_CONFIG, - CLIENT_BAD_REQUEST, - UNAUTHORIZED, - NOT_FOUND, - GENERIC_ERROR, + ANOTHER_ACCOUNT, } export async function testRevenueAPI( revenueAPI: URL, creds: FacadeCredentials | undefined, -): Promise<OperationOk<void> | OperationFail<TestRevenueErrorType>> { + account: PaytoString, +): Promise<OperationOk<void> | OperationFail<HttpStatusCode.NotFound> +| OperationFail<HttpStatusCode.Unauthorized> +| OperationFail<HttpStatusCode.BadRequest> +| OperationFail<TestRevenueErrorType.ANOTHER_ACCOUNT> +| TalerError> { const api = new TalerRevenueHttpClient( revenueAPI.href, new BrowserFetchHttpLib(), @@ -167,69 +173,33 @@ export async function testRevenueAPI( const config = await api.getConfig(auth); if (config.type === "fail") { - switch (config.case) { - case HttpStatusCode.Unauthorized: { - return { - type: "fail", - case: TestRevenueErrorType.UNAUTHORIZED, - detail: { - code: 1, - }, - }; - } - case HttpStatusCode.NotFound: { - return { - type: "fail", - case: TestRevenueErrorType.NO_CONFIG, - detail: { - code: 1, - }, - }; - } - } + return config; } const history = await api.getHistory(auth); if (history.type === "fail") { - switch (history.case) { - case HttpStatusCode.BadRequest: { - return { - type: "fail", - case: TestRevenueErrorType.CLIENT_BAD_REQUEST, - detail: { - code: 1, - }, - }; - } - case HttpStatusCode.Unauthorized: { - return { - type: "fail", - case: TestRevenueErrorType.UNAUTHORIZED, - detail: { - code: 1, - }, - }; - } - case HttpStatusCode.NotFound: { - return { - type: "fail", - case: TestRevenueErrorType.NOT_FOUND, - detail: { - code: 1, - }, - }; - } - } + return history; } - } catch (err) { - if (err instanceof TalerError) { + if (history.body.credit_account !== account) { return { type: "fail", - case: TestRevenueErrorType.GENERIC_ERROR, - detail: err.errorDetail, + case: TestRevenueErrorType.ANOTHER_ACCOUNT, + detail: { + code: 1, + hint: history.body.credit_account + }, }; } + } catch (err) { + if (err instanceof TalerError) { + return err; + // return { + // type: "fail", + // case: TestRevenueErrorType.GENERIC_ERROR, + // detail: err.errorDetail, + // }; + } } return opFixedSuccess(undefined); diff --git a/packages/merchant-backoffice-ui/src/paths/instance/accounts/list/Table.tsx b/packages/merchant-backoffice-ui/src/paths/instance/accounts/list/Table.tsx index efe484402..a9cb2805b 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/accounts/list/Table.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/accounts/list/Table.tsx @@ -48,7 +48,7 @@ export function CardTable({ <header class="card-header"> <p class="card-header-title"> <span class="icon"> - <i class="mdi mdi-newspaper" /> + <i class="mdi mdi-bank" /> </span> <i18n.Translate>Bank accounts</i18n.Translate> </p> @@ -240,9 +240,6 @@ function Table({ <th> <i18n.Translate>IBAN</i18n.Translate> </th> - <th> - <i18n.Translate>BIC</i18n.Translate> - </th> <th /> </tr> </thead> @@ -263,12 +260,6 @@ function Table({ > {ac.iban} </td> - <td - onClick={(): void => onSelect(acc)} - style={{ cursor: "pointer" }} - > - {ac.bic ?? ""} - </td> <td class="is-actions-cell right-sticky"> <div class="buttons is-right"> <button diff --git a/packages/merchant-backoffice-ui/src/paths/instance/accounts/update/index.tsx b/packages/merchant-backoffice-ui/src/paths/instance/accounts/update/index.tsx index 70942fd55..9116aaa62 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/accounts/update/index.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/accounts/update/index.tsx @@ -88,51 +88,55 @@ export default function UpdateValidator({ const resp = await testRevenueAPI( revenueAPI, request.credit_facade_credentials, + result.body.payto_uri, ); + if (resp instanceof TalerError) { + setNotif({ + message: i18n.str`Could not create account`, + type: "ERROR", + description: i18n.str`The request to check the revenue API failed.`, + details: JSON.stringify(resp.errorDetail, undefined, 2), + }); + return; + } if (resp.type === "fail") { switch (resp.case) { - case TestRevenueErrorType.NO_CONFIG: { - setNotif({ - message: i18n.str`Could not create account`, - type: "ERROR", - description: i18n.str`The endpoint doesn't seems to be a Taler Revenue API`, - }); - return; - } - case TestRevenueErrorType.CLIENT_BAD_REQUEST: { + case HttpStatusCode.BadRequest: { setNotif({ message: i18n.str`Could not create account`, type: "ERROR", description: i18n.str`Server replied with "bad request".`, }); return; + } - case TestRevenueErrorType.UNAUTHORIZED: { + case HttpStatusCode.Unauthorized: { setNotif({ message: i18n.str`Could not create account`, type: "ERROR", description: i18n.str`Unauthorized, try with another credentials.`, }); return; + } - case TestRevenueErrorType.NOT_FOUND: { + case HttpStatusCode.NotFound: { setNotif({ message: i18n.str`Could not create account`, type: "ERROR", - description: i18n.str`Check facade URL, server replied with "not found".`, + description: i18n.str`The endpoint doesn't seems to be a Taler Revenue API`, }); return; } - case TestRevenueErrorType.GENERIC_ERROR: { + case TestRevenueErrorType.ANOTHER_ACCOUNT: { setNotif({ - message: i18n.str`Could not create account`, + message: i18n.str`Could not add bank account`, type: "ERROR", - description: resp.detail.hint, + description: i18n.str`The account info URL returned information from an account which is not the same in the account form: ${resp.detail.hint}`, }); return; } default: { - assertUnreachable(resp.case) + assertUnreachable(resp); } } } diff --git a/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/create/CreatePage.tsx index d5522c2d4..a16817bab 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/create/CreatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/create/CreatePage.tsx @@ -101,7 +101,7 @@ export function CreatePage({ onCreate, onBack }: Props): VNode { /> <Input<Entity> name="otp_device_description" - label={i18n.str`Descripiton`} + label={i18n.str`Description`} tooltip={i18n.str`Useful to identify the device physically`} /> <InputSelector<Entity> diff --git a/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/list/Table.tsx b/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/list/Table.tsx index afe3c98e2..e4206ff7d 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/list/Table.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/otp_devices/list/Table.tsx @@ -52,7 +52,7 @@ export function CardTable({ <header class="card-header"> <p class="card-header-title"> <span class="icon"> - <i class="mdi mdi-newspaper" /> + <i class="mdi mdi-lock" /> </span> <i18n.Translate>OTP Devices</i18n.Translate> </p> diff --git a/packages/merchant-backoffice-ui/src/paths/instance/templates/create/CreatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/templates/create/CreatePage.tsx index 50262be17..336a336ed 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/templates/create/CreatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/templates/create/CreatePage.tsx @@ -145,7 +145,6 @@ export function CreatePage({ onCreate, onBack }: Props): VNode { template_id: state.id!, template_description: state.description!, template_contract, - required_currency: contract_amount !== undefined ? undefined : config.currency, editable_defaults: { amount: !state.amount_editable ? undefined : (state.amount ?? zero), summary: !state.summary_editable ? undefined : (state.summary ?? ""), diff --git a/packages/merchant-backoffice-ui/src/paths/instance/templates/list/Table.tsx b/packages/merchant-backoffice-ui/src/paths/instance/templates/list/Table.tsx index 082e622e3..4c55bae2a 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/templates/list/Table.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/templates/list/Table.tsx @@ -56,7 +56,7 @@ export function CardTable({ <header class="card-header"> <p class="card-header-title"> <span class="icon"> - <i class="mdi mdi-newspaper" /> + <i class="mdi mdi-qrcode" /> </span> <i18n.Translate>Templates</i18n.Translate> </p> diff --git a/packages/merchant-backoffice-ui/src/paths/instance/templates/update/UpdatePage.tsx b/packages/merchant-backoffice-ui/src/paths/instance/templates/update/UpdatePage.tsx index 32c5637aa..d284fda67 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/templates/update/UpdatePage.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/templates/update/UpdatePage.tsx @@ -161,7 +161,6 @@ export function UpdatePage({ template, onUpdate, onBack }: Props): VNode { return onUpdate({ template_description: state.description!, template_contract, - required_currency: contract_amount !== undefined ? undefined : config.currency, editable_defaults: { amount: !state.amount_editable ? undefined : (state.amount ?? zero), summary: !state.summary_editable ? undefined : (state.summary ?? ""), diff --git a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/list/Table.tsx b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/list/Table.tsx index 919285e78..877bd30e5 100644 --- a/packages/merchant-backoffice-ui/src/paths/instance/webhooks/list/Table.tsx +++ b/packages/merchant-backoffice-ui/src/paths/instance/webhooks/list/Table.tsx @@ -52,7 +52,7 @@ export function CardTable({ <header class="card-header"> <p class="card-header-title"> <span class="icon"> - <i class="mdi mdi-newspaper" /> + <i class="mdi mdi-webhook" /> </span> <i18n.Translate>Webhooks</i18n.Translate> </p> |