saleor-dashboard/src/orders/components/OrderRefundPage/OrderRefundPage.tsx
Wojciech Mista a5ac6bb92e
Exit form fixes (#1889)
* Add onBeforeUnload handler to prevent accidental refresh

* Update button messages

* Fix exit form not working after submit

* Make onBeforeUnload disable if env is development

* Fix onClose

* Remove internal date time field state

* Update messages and dialog

* Prevent navigation on 400 error

* Add submit disabled ref in exit form

* Update exit form dialog for disabled save

* Update confirmLeave forms to set ref if save is disabled

* Remove unused error handling

* Remove explicit ref type

* Remove unused import

* Fix disabled type

* Add disable check function to generic forms

* Add custom isDisabled method to sale and voucher forms

* Add default isDisabled functions to confirmLeave forms

* Update tests

* Remove unused code

* Rebase fixes + update tests

* Refactor form and useform

* Refactor disabling forms

* Change "saveDisabled" name to "isSaveDisabled" for improved readability

* Change "isDisabled" function to "checkIfSaveIsDisabled"

* Update exit form disabling conditions for zone rates forms
2022-03-23 10:13:23 +01:00

174 lines
5.6 KiB
TypeScript

import CardSpacer from "@saleor/components/CardSpacer";
import Container from "@saleor/components/Container";
import Grid from "@saleor/components/Grid";
import PageHeader from "@saleor/components/PageHeader";
import {
FulfillmentStatus,
OrderErrorFragment,
OrderRefundDataQuery
} from "@saleor/graphql";
import { SubmitPromise } from "@saleor/hooks/useForm";
import { Backlink } from "@saleor/macaw-ui";
import { renderCollection } from "@saleor/misc";
import React from "react";
import { useIntl } from "react-intl";
import OrderRefund from "../OrderRefund";
import OrderRefundFulfilledProducts from "../OrderRefundFulfilledProducts";
import OrderRefundAmount from "../OrderRefundReturnAmount";
import {
getMiscellaneousAmountValues,
getRefundProductsAmountValues
} from "../OrderRefundReturnAmount/utils";
import OrderRefundUnfulfilledProducts from "../OrderRefundUnfulfilledProducts";
import OrderRefundForm, {
OrderRefundSubmitData,
OrderRefundType
} from "./form";
export const refundFulfilledStatuses = [
FulfillmentStatus.FULFILLED,
FulfillmentStatus.RETURNED,
FulfillmentStatus.WAITING_FOR_APPROVAL
];
export interface OrderRefundPageProps {
order: OrderRefundDataQuery["order"];
defaultType?: OrderRefundType;
disabled: boolean;
errors: OrderErrorFragment[];
onBack: () => void;
onSubmit: (data: OrderRefundSubmitData) => SubmitPromise;
}
const OrderRefundPage: React.FC<OrderRefundPageProps> = props => {
const {
order,
defaultType = OrderRefundType.PRODUCTS,
disabled,
errors = [],
onBack,
onSubmit
} = props;
const intl = useIntl();
const unfulfilledLines = order?.lines.filter(
line => line.quantityToFulfill > 0
);
const fulfilledFulfillemnts =
order?.fulfillments.filter(({ status }) =>
refundFulfilledStatuses.includes(status)
) || [];
return (
<OrderRefundForm
order={order}
defaultType={defaultType}
onSubmit={onSubmit}
disabled={disabled}
>
{({ data, handlers, change, submit, isSaveDisabled }) => {
const isProductRefund = data.type === OrderRefundType.PRODUCTS;
return (
<Container>
<Backlink onClick={onBack}>
{order?.number
? intl.formatMessage(
{
defaultMessage: "Order #{orderNumber}",
description: "page header with order number"
},
{
orderNumber: order.number
}
)
: intl.formatMessage({
defaultMessage: "Order",
description: "page header"
})}
</Backlink>
<PageHeader
title={intl.formatMessage(
{
defaultMessage: "Order no. {orderNumber} - Refund",
description: "page header"
},
{
orderNumber: order?.number
}
)}
/>
<Grid>
<div>
<OrderRefund
data={data}
disabled={disabled}
onChange={change}
/>
{isProductRefund && (
<>
{unfulfilledLines?.length > 0 && (
<>
<CardSpacer />
<OrderRefundUnfulfilledProducts
unfulfilledLines={unfulfilledLines}
data={data}
disabled={disabled}
onRefundedProductQuantityChange={
handlers.changeRefundedProductQuantity
}
onSetMaximalQuantities={
handlers.setMaximalRefundedProductQuantities
}
/>
</>
)}
{renderCollection(fulfilledFulfillemnts, fulfillment => (
<React.Fragment key={fulfillment?.id}>
<CardSpacer />
<OrderRefundFulfilledProducts
fulfillment={fulfillment}
data={data}
disabled={disabled}
orderNumber={order?.number}
onRefundedProductQuantityChange={
handlers.changeRefundedFulfilledProductQuantity
}
onSetMaximalQuantities={() =>
handlers.setMaximalRefundedFulfilledProductQuantities(
fulfillment?.id
)
}
/>
</React.Fragment>
))}
</>
)}
</div>
<div>
<OrderRefundAmount
amountData={
isProductRefund
? getRefundProductsAmountValues(order, data)
: getMiscellaneousAmountValues(order)
}
data={data}
order={order}
disabled={isSaveDisabled}
errors={errors}
onChange={change}
onRefund={submit}
/>
</div>
</Grid>
</Container>
);
}}
</OrderRefundForm>
);
};
OrderRefundPage.displayName = "OrderRefundPage";
export default OrderRefundPage;