diff --git a/src/apps/loan-list/materials/utils/warning-bar.tsx b/src/apps/loan-list/materials/utils/warning-bar.tsx index e1fddc70e4..12e27b7b6e 100644 --- a/src/apps/loan-list/materials/utils/warning-bar.tsx +++ b/src/apps/loan-list/materials/utils/warning-bar.tsx @@ -76,7 +76,7 @@ const WarningBar: FC = ({ variant="filled" ariaLabelledBy={labelId} > - {rightButtonText} + {rightButtonText || ""} )} diff --git a/src/apps/menu/menu-logged-in/MenuLoggedInContent.tsx b/src/apps/menu/menu-logged-in/MenuLoggedInContent.tsx index aaca6488fb..943105effe 100644 --- a/src/apps/menu/menu-logged-in/MenuLoggedInContent.tsx +++ b/src/apps/menu/menu-logged-in/MenuLoggedInContent.tsx @@ -14,6 +14,8 @@ import useReservations from "../../../core/utils/useReservations"; import useLoans from "../../../core/utils/useLoans"; import { usePatronData } from "../../../core/utils/helpers/usePatronData"; import { resetPersistedData } from "../../../core/store"; +import { Button } from "../../../components/Buttons/Button"; +import { redirectTo } from "../../../core/utils/helpers/url"; interface MenuLoggedInContentProps { pageSize: number; @@ -67,6 +69,11 @@ const MenuLoggedInContent: FC = ({ pageSize }) => { loansSoonOverdue.length !== 0 || reservations.length !== 0; + const handleOnClick = () => { + resetPersistedData(); + redirectTo(logoutUrl); + }; + return (
@@ -111,13 +118,16 @@ const MenuLoggedInContent: FC = ({ pageSize }) => {
- resetPersistedData()} - href={logoutUrl} - > - {t("menuLogOutText")} - +
diff --git a/src/apps/menu/menu.test.ts b/src/apps/menu/menu.test.ts index 625adca2b5..0d44b6d7fc 100644 --- a/src/apps/menu/menu.test.ts +++ b/src/apps/menu/menu.test.ts @@ -322,8 +322,7 @@ describe("Menu (authenticated))", () => { .and("have.text", "2"); // 2.e. “Log ud” knappen. Engelsk tekst: "Log out" - cy.get(".modal-profile__btn-logout") - .find("a") + cy.getBySel("menu-logout-button") .should("exist") .and("have.text", "Log out"); }); diff --git a/src/apps/reservation-list/modal/reservation-details/reservation-details-redirect.tsx b/src/apps/reservation-list/modal/reservation-details/reservation-details-redirect.tsx index ff141976df..1d211b1221 100644 --- a/src/apps/reservation-list/modal/reservation-details/reservation-details-redirect.tsx +++ b/src/apps/reservation-list/modal/reservation-details/reservation-details-redirect.tsx @@ -1,5 +1,4 @@ import React, { FC } from "react"; -import ExternalLinkIcon from "@danskernesdigitalebibliotek/dpl-design-system/build/icons/buttons/icon-btn-external-link.svg"; import { useText } from "../../../../core/utils/text"; import { MaterialProps } from "../../../loan-list/materials/utils/material-fetch-hoc"; import { ReservationType } from "../../../../core/utils/types/reservation-type"; @@ -44,9 +43,10 @@ const ReservationDetailsRedirect: FC< url={externalLink} variant="filled" id="go-to-ereolen-button" + iconClassNames="btn-icon invert" + buttonType="external-link" > {t("reservationDetailsDigitalReservationGoToEreolenText")} - ); diff --git a/src/apps/reservation-list/modal/reservation-details/reservation-details.test.ts b/src/apps/reservation-list/modal/reservation-details/reservation-details.test.ts index 8bb5adf164..b3517cce71 100644 --- a/src/apps/reservation-list/modal/reservation-details/reservation-details.test.ts +++ b/src/apps/reservation-list/modal/reservation-details/reservation-details.test.ts @@ -195,10 +195,7 @@ describe("Reservation details modal", () => { cy.get(".modal") .find("[data-cy='go-to-ereolen-button']") .eq(0) - .should("have.text", "Go to eReolen") - .should("have.attr", "href") - // ID 17 2.d.i. link to "ereolen.dk" - .should("include", "ereolen.dk"); + .should("have.text", "Go to eReolen"); cy.get(".modal") .find(".status-label") diff --git a/src/components/Buttons/Button.tsx b/src/components/Buttons/Button.tsx index 24811ada78..0dd87bb949 100644 --- a/src/components/Buttons/Button.tsx +++ b/src/components/Buttons/Button.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useRef } from "react"; import { ButtonSize, ButtonType, @@ -9,32 +9,41 @@ import { ButtonIcon } from "./ButtonIcon"; export type ButtonProps = { label: string; buttonType: ButtonType; - disabled: boolean; collapsible: boolean; size: ButtonSize; variant: ButtonVariant; + disabled?: boolean; onClick?: () => void; iconClassNames?: string; id?: string; classNames?: string; dataCy?: string; ariaDescribedBy?: string; + canOnlyBeClickedOnce?: boolean; }; export const Button: React.FC = ({ label, buttonType, - disabled, collapsible, size, variant, + disabled = false, onClick, iconClassNames, id, classNames, dataCy, - ariaDescribedBy + ariaDescribedBy, + canOnlyBeClickedOnce = false }) => { + const isLoadingRef = useRef(false); + const handleClick = () => { + if (isLoadingRef.current) return; + if (canOnlyBeClickedOnce) isLoadingRef.current = true; + if (onClick) onClick(); + }; + return (