saleor-dashboard/src/orders/views/OrderDetails/index.tsx

290 lines
11 KiB
TypeScript
Raw Normal View History

2020-09-01 16:22:54 +00:00
import { MetadataFormData } from "@saleor/components/Metadata";
import NotFoundPage from "@saleor/components/NotFoundPage";
2020-06-26 17:06:48 +00:00
import { Task } from "@saleor/containers/BackgroundTasks/types";
import useBackgroundTask from "@saleor/hooks/useBackgroundTask";
2019-06-19 14:40:52 +00:00
import useNavigator from "@saleor/hooks/useNavigator";
2020-09-01 16:22:54 +00:00
import useNotifier from "@saleor/hooks/useNotifier";
import { commonMessages } from "@saleor/intl";
import { useOrderConfirmMutation } from "@saleor/orders/mutations";
2020-06-26 17:06:48 +00:00
import { InvoiceRequest } from "@saleor/orders/types/InvoiceRequest";
import getOrderErrorMessage from "@saleor/utils/errors/order";
2019-12-06 14:58:28 +00:00
import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers";
2020-09-01 16:22:54 +00:00
import createMetadataUpdateHandler from "@saleor/utils/handlers/metadataUpdateHandler";
import {
useMetadataUpdate,
usePrivateMetadataUpdate
} from "@saleor/utils/metadata/updateMetadata";
import React from "react";
import { useIntl } from "react-intl";
import {
InvoiceErrorCode,
JobStatusEnum,
OrderStatus
} from "../../../types/globalTypes";
2019-06-19 14:40:52 +00:00
import OrderOperations from "../../containers/OrderOperations";
import { TypedOrderDetailsQuery } from "../../queries";
2019-06-19 14:40:52 +00:00
import {
orderListUrl,
orderUrl,
2020-04-20 17:18:20 +00:00
OrderUrlDialog,
OrderUrlQueryParams
2019-06-19 14:40:52 +00:00
} from "../../urls";
2020-10-29 11:59:48 +00:00
import OrderAddressFields from "./OrderAddressFields";
2019-06-19 14:40:52 +00:00
import { OrderDetailsMessages } from "./OrderDetailsMessages";
import { OrderDraftDetails } from "./OrderDraftDetails";
import { OrderNormalDetails } from "./OrderNormalDetails";
import { OrderUnconfirmedDetails } from "./OrderUnconfirmedDetails";
2019-06-19 14:40:52 +00:00
interface OrderDetailsProps {
id: string;
params: OrderUrlQueryParams;
}
export const OrderDetails: React.FC<OrderDetailsProps> = ({ id, params }) => {
2019-06-19 14:40:52 +00:00
const navigate = useNavigator();
2020-06-26 17:06:48 +00:00
const { queue } = useBackgroundTask();
2020-03-16 12:28:52 +00:00
const intl = useIntl();
2020-09-01 16:22:54 +00:00
const [updateMetadata, updateMetadataOpts] = useMetadataUpdate({});
const [
updatePrivateMetadata,
updatePrivateMetadataOpts
] = usePrivateMetadataUpdate({});
const notify = useNotifier();
2020-03-16 12:28:52 +00:00
const [openModal, closeModal] = createDialogActionHandlers<
OrderUrlDialog,
OrderUrlQueryParams
>(navigate, params => orderUrl(id, params), params);
2019-06-19 14:40:52 +00:00
2020-02-20 14:18:22 +00:00
const handleBack = () => navigate(orderListUrl());
const [orderConfirm] = useOrderConfirmMutation({
onCompleted: ({ orderConfirm: { errors } }) => {
const isError = !!errors.length;
notify({
status: isError ? "error" : "success",
text: isError
? getOrderErrorMessage(errors[0], intl)
: "Confirmed Order"
});
}
});
2019-06-19 14:40:52 +00:00
return (
2020-02-20 14:18:22 +00:00
<TypedOrderDetailsQuery displayLoader variables={{ id }}>
2019-06-19 14:40:52 +00:00
{({ data, loading }) => {
2020-02-20 14:18:22 +00:00
const order = data?.order;
if (order === null) {
return <NotFoundPage onBack={handleBack} />;
}
2021-02-05 12:46:15 +00:00
const isOrderUnconfirmed = order?.status === OrderStatus.UNCONFIRMED;
const isOrderDraft = order?.status === OrderStatus.DRAFT;
2020-09-01 16:22:54 +00:00
const handleSubmit = async (data: MetadataFormData) => {
if (order?.status === OrderStatus.UNCONFIRMED) {
await orderConfirm({ variables: { id: order?.id } });
}
2020-09-01 16:22:54 +00:00
const update = createMetadataUpdateHandler(
{
id: order.token,
metadata: order.metadata,
privateMetadata: order.privateMetadata
},
2020-09-01 16:22:54 +00:00
() => Promise.resolve([]),
variables => updateMetadata({ variables }),
variables => updatePrivateMetadata({ variables })
);
const result = await update(data);
if (result.length === 0) {
notify({
status: "success",
text: intl.formatMessage(commonMessages.savedChanges)
});
}
2020-10-22 11:33:29 +00:00
return result;
2020-09-01 16:22:54 +00:00
};
2019-06-19 14:40:52 +00:00
return (
2020-03-16 12:28:52 +00:00
<OrderDetailsMessages id={id} params={params}>
{orderMessages => (
2019-11-19 16:32:35 +00:00
<OrderOperations
order={id}
onNoteAdd={orderMessages.handleNoteAdd}
onOrderCancel={orderMessages.handleOrderCancel}
onOrderVoid={orderMessages.handleOrderVoid}
onPaymentCapture={orderMessages.handlePaymentCapture}
onUpdate={orderMessages.handleUpdate}
onDraftUpdate={orderMessages.handleDraftUpdate}
onShippingMethodUpdate={data => {
orderMessages.handleShippingMethodUpdate(data);
order.total = data.orderUpdateShipping.order.total;
}}
2019-11-19 16:32:35 +00:00
onOrderLineDelete={orderMessages.handleOrderLineDelete}
onOrderLinesAdd={orderMessages.handleOrderLinesAdd}
onOrderLineUpdate={orderMessages.handleOrderLineUpdate}
Introduce fulfillment creation API (#1241) * Display warehouse name for each fulfillment (#1259) * Hide no-stocks columns in fulfillment view (#1260) * Hide no-stocks columns in fulfillment view * Update tests * Refactor * Update tests * Add fulfillment settings card (#1242) * Add fulfillment setting card * Make fulfillment approvement naming consistent * Fix mutation bug * Update types * Trigger CI * Handle fulfillment acceptance on order details page (#1255) * Handle fulfillment acceptance on order details page * Make fulfillment approvement naming consistent * Update fulfillment schema and its usage * Render history events regarding waiting fulfillments (#1265) * Add awaiting for approval fulfillment order event * Fix warehouse name * Change fulfillment quantity calculation (#1267) * Change fulfillment quantity calculation * Fix warehouse name * Update messages * Trigger CI * Refactor * Fix refactor * Fix fulfillment for no variant * Allow creating fulfillments waiting for acceptance (#1248) * Fix fulfillment page style and typescript classname types perfomance issue * Allow creating fulfillments waiting for acceptance * Make fulfillment approvement naming consistent * Update schema * Add tooltip to fulfillment savebar * Update unpaid fulfillment creation restriction * Update fulfillment cration restriction * Update test snapshots * Add possibility to cancel "waiting" fulfillments (#1288) * Allow to cancel waiting fulfillments * Add delete button to fulfillment card * Update test snapshots * Handle waiting fulfillments on refund page (#1290) * Handle waiting fulfillments on refund page * Trigger CI * Trigger CI * Calculate quantity to refund on quantityToFulfill * Update changelog * Update snapshots Co-authored-by: Jakub Majorek <majorek.jakub@gmail.com>
2021-08-20 14:36:05 +00:00
onOrderFulfillmentApprove={
orderMessages.handleOrderFulfillmentApprove
}
2019-11-19 16:32:35 +00:00
onOrderFulfillmentCancel={
orderMessages.handleOrderFulfillmentCancel
}
onOrderFulfillmentUpdate={
orderMessages.handleOrderFulfillmentUpdate
}
onDraftFinalize={orderMessages.handleDraftFinalize}
onDraftCancel={orderMessages.handleDraftCancel}
onOrderMarkAsPaid={orderMessages.handleOrderMarkAsPaid}
2020-06-26 17:06:48 +00:00
onInvoiceRequest={(data: InvoiceRequest) => {
if (
data.invoiceRequest.errors.some(
err => err.code === InvoiceErrorCode.NO_INVOICE_PLUGIN
)
) {
notify({
title: intl.formatMessage({
defaultMessage: "Could not generate invoice",
description: "snackbar title"
}),
text: intl.formatMessage({
defaultMessage: "No invoice plugin installed",
description: "error message"
}),
status: "error"
});
}
2020-06-26 17:06:48 +00:00
if (
data.invoiceRequest.invoice.status === JobStatusEnum.SUCCESS
) {
orderMessages.handleInvoiceGenerateFinished(data);
} else {
orderMessages.handleInvoiceGeneratePending(data);
queue(Task.INVOICE_GENERATE, {
2020-07-06 23:57:43 +00:00
generateInvoice: {
2020-06-26 17:06:48 +00:00
invoiceId: data.invoiceRequest.invoice.id,
orderId: id
}
2020-06-26 17:06:48 +00:00
});
}
}}
2020-06-24 12:50:14 +00:00
onInvoiceSend={orderMessages.handleInvoiceSend}
2019-11-19 16:32:35 +00:00
>
{({
orderAddNote,
orderCancel,
orderDraftUpdate,
orderLinesAdd,
orderLineDelete,
orderLineUpdate,
orderPaymentCapture,
orderVoid,
orderShippingMethodUpdate,
orderUpdate,
Introduce fulfillment creation API (#1241) * Display warehouse name for each fulfillment (#1259) * Hide no-stocks columns in fulfillment view (#1260) * Hide no-stocks columns in fulfillment view * Update tests * Refactor * Update tests * Add fulfillment settings card (#1242) * Add fulfillment setting card * Make fulfillment approvement naming consistent * Fix mutation bug * Update types * Trigger CI * Handle fulfillment acceptance on order details page (#1255) * Handle fulfillment acceptance on order details page * Make fulfillment approvement naming consistent * Update fulfillment schema and its usage * Render history events regarding waiting fulfillments (#1265) * Add awaiting for approval fulfillment order event * Fix warehouse name * Change fulfillment quantity calculation (#1267) * Change fulfillment quantity calculation * Fix warehouse name * Update messages * Trigger CI * Refactor * Fix refactor * Fix fulfillment for no variant * Allow creating fulfillments waiting for acceptance (#1248) * Fix fulfillment page style and typescript classname types perfomance issue * Allow creating fulfillments waiting for acceptance * Make fulfillment approvement naming consistent * Update schema * Add tooltip to fulfillment savebar * Update unpaid fulfillment creation restriction * Update fulfillment cration restriction * Update test snapshots * Add possibility to cancel "waiting" fulfillments (#1288) * Allow to cancel waiting fulfillments * Add delete button to fulfillment card * Update test snapshots * Handle waiting fulfillments on refund page (#1290) * Handle waiting fulfillments on refund page * Trigger CI * Trigger CI * Calculate quantity to refund on quantityToFulfill * Update changelog * Update snapshots Co-authored-by: Jakub Majorek <majorek.jakub@gmail.com>
2021-08-20 14:36:05 +00:00
orderFulfillmentApprove,
2019-11-19 16:32:35 +00:00
orderFulfillmentCancel,
orderFulfillmentUpdateTracking,
orderDraftCancel,
orderDraftFinalize,
2020-06-22 16:34:59 +00:00
orderPaymentMarkAsPaid,
2020-06-23 12:27:44 +00:00
orderInvoiceRequest,
orderInvoiceSend
2019-12-06 17:11:46 +00:00
}) => (
<>
2021-02-05 12:46:15 +00:00
{!isOrderDraft && !isOrderUnconfirmed && (
<OrderNormalDetails
id={id}
params={params}
data={data}
orderAddNote={orderAddNote}
orderInvoiceRequest={orderInvoiceRequest}
handleSubmit={handleSubmit}
orderCancel={orderCancel}
orderPaymentMarkAsPaid={orderPaymentMarkAsPaid}
orderVoid={orderVoid}
orderPaymentCapture={orderPaymentCapture}
Introduce fulfillment creation API (#1241) * Display warehouse name for each fulfillment (#1259) * Hide no-stocks columns in fulfillment view (#1260) * Hide no-stocks columns in fulfillment view * Update tests * Refactor * Update tests * Add fulfillment settings card (#1242) * Add fulfillment setting card * Make fulfillment approvement naming consistent * Fix mutation bug * Update types * Trigger CI * Handle fulfillment acceptance on order details page (#1255) * Handle fulfillment acceptance on order details page * Make fulfillment approvement naming consistent * Update fulfillment schema and its usage * Render history events regarding waiting fulfillments (#1265) * Add awaiting for approval fulfillment order event * Fix warehouse name * Change fulfillment quantity calculation (#1267) * Change fulfillment quantity calculation * Fix warehouse name * Update messages * Trigger CI * Refactor * Fix refactor * Fix fulfillment for no variant * Allow creating fulfillments waiting for acceptance (#1248) * Fix fulfillment page style and typescript classname types perfomance issue * Allow creating fulfillments waiting for acceptance * Make fulfillment approvement naming consistent * Update schema * Add tooltip to fulfillment savebar * Update unpaid fulfillment creation restriction * Update fulfillment cration restriction * Update test snapshots * Add possibility to cancel "waiting" fulfillments (#1288) * Allow to cancel waiting fulfillments * Add delete button to fulfillment card * Update test snapshots * Handle waiting fulfillments on refund page (#1290) * Handle waiting fulfillments on refund page * Trigger CI * Trigger CI * Calculate quantity to refund on quantityToFulfill * Update changelog * Update snapshots Co-authored-by: Jakub Majorek <majorek.jakub@gmail.com>
2021-08-20 14:36:05 +00:00
orderFulfillmentApprove={orderFulfillmentApprove}
orderFulfillmentCancel={orderFulfillmentCancel}
orderFulfillmentUpdateTracking={
orderFulfillmentUpdateTracking
}
orderInvoiceSend={orderInvoiceSend}
updateMetadataOpts={updateMetadataOpts}
updatePrivateMetadataOpts={updatePrivateMetadataOpts}
openModal={openModal}
closeModal={closeModal}
/>
2021-02-05 12:46:15 +00:00
)}
{isOrderDraft && (
<OrderDraftDetails
id={id}
params={params}
loading={loading}
data={data}
orderAddNote={orderAddNote}
orderLineUpdate={orderLineUpdate}
orderLineDelete={orderLineDelete}
orderShippingMethodUpdate={orderShippingMethodUpdate}
orderLinesAdd={orderLinesAdd}
orderDraftUpdate={orderDraftUpdate}
orderDraftCancel={orderDraftCancel}
orderDraftFinalize={orderDraftFinalize}
openModal={openModal}
closeModal={closeModal}
/>
2021-01-29 13:14:31 +00:00
)}
{isOrderUnconfirmed && (
<OrderUnconfirmedDetails
id={id}
params={params}
data={data}
orderAddNote={orderAddNote}
orderLineUpdate={orderLineUpdate}
orderLineDelete={orderLineDelete}
orderInvoiceRequest={orderInvoiceRequest}
handleSubmit={handleSubmit}
orderCancel={orderCancel}
orderShippingMethodUpdate={orderShippingMethodUpdate}
orderLinesAdd={orderLinesAdd}
orderPaymentMarkAsPaid={orderPaymentMarkAsPaid}
orderVoid={orderVoid}
orderPaymentCapture={orderPaymentCapture}
Introduce fulfillment creation API (#1241) * Display warehouse name for each fulfillment (#1259) * Hide no-stocks columns in fulfillment view (#1260) * Hide no-stocks columns in fulfillment view * Update tests * Refactor * Update tests * Add fulfillment settings card (#1242) * Add fulfillment setting card * Make fulfillment approvement naming consistent * Fix mutation bug * Update types * Trigger CI * Handle fulfillment acceptance on order details page (#1255) * Handle fulfillment acceptance on order details page * Make fulfillment approvement naming consistent * Update fulfillment schema and its usage * Render history events regarding waiting fulfillments (#1265) * Add awaiting for approval fulfillment order event * Fix warehouse name * Change fulfillment quantity calculation (#1267) * Change fulfillment quantity calculation * Fix warehouse name * Update messages * Trigger CI * Refactor * Fix refactor * Fix fulfillment for no variant * Allow creating fulfillments waiting for acceptance (#1248) * Fix fulfillment page style and typescript classname types perfomance issue * Allow creating fulfillments waiting for acceptance * Make fulfillment approvement naming consistent * Update schema * Add tooltip to fulfillment savebar * Update unpaid fulfillment creation restriction * Update fulfillment cration restriction * Update test snapshots * Add possibility to cancel "waiting" fulfillments (#1288) * Allow to cancel waiting fulfillments * Add delete button to fulfillment card * Update test snapshots * Handle waiting fulfillments on refund page (#1290) * Handle waiting fulfillments on refund page * Trigger CI * Trigger CI * Calculate quantity to refund on quantityToFulfill * Update changelog * Update snapshots Co-authored-by: Jakub Majorek <majorek.jakub@gmail.com>
2021-08-20 14:36:05 +00:00
orderFulfillmentApprove={orderFulfillmentApprove}
orderFulfillmentCancel={orderFulfillmentCancel}
orderFulfillmentUpdateTracking={
orderFulfillmentUpdateTracking
}
orderInvoiceSend={orderInvoiceSend}
updateMetadataOpts={updateMetadataOpts}
updatePrivateMetadataOpts={updatePrivateMetadataOpts}
openModal={openModal}
closeModal={closeModal}
/>
2019-12-06 17:11:46 +00:00
)}
2020-10-29 11:59:48 +00:00
<OrderAddressFields
isDraft={order?.status === OrderStatus.DRAFT}
orderUpdate={orderUpdate}
orderDraftUpdate={orderDraftUpdate}
data={data}
id={id}
2019-12-06 17:11:46 +00:00
onClose={closeModal}
2020-10-29 11:59:48 +00:00
action={params.action}
2019-12-06 17:11:46 +00:00
/>
</>
)}
2019-11-19 16:32:35 +00:00
</OrderOperations>
2019-06-19 14:40:52 +00:00
)}
2019-11-19 16:32:35 +00:00
</OrderDetailsMessages>
2019-06-19 14:40:52 +00:00
);
}}
</TypedOrderDetailsQuery>
);
};
export default OrderDetails;