saleor-dashboard/src/orders/components/OrderHistory/ExtendedTimelineEvent.tsx
mmarkusik f0f9fe9b85
Feature/order reissue (#910)
* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Add change to changelog

* Remove console.log

* Update tests

* Extract messages

* Add utils functions for selecting only ulfulfilled order lines

* Add optional value selection for line item

* Update
tests

* Add optional rendering of unfulfilled items card and refactor a bit

* Update displaying of items card title when refunded card

* UUpdate utils, form data etc. not to include refunded items when calculating replaced items amount

* Uppdate return items card not to display replace buttons for refunded items

* Refactor and small fixes after review

* Update extracted messages

* Fix card title when no fullfilemtn id

* wip

* Initially stitch returns page. Update types, add mutation

* remove unnecessary component display names

* Add loading status from form submission & refactor

* Add errors from response

* Add errors from response and refactor

* Remove comments

* Add optional error adding when no data from return create request

* Update messages

* wip

* Update snapshots

* Remove unnecessary console.log

* Add better typing for getParsedLineData function

* Update & refactor card title to match cards both in return and order details

* Add handling of new statuses to order details cards. Also refactor, and devide order fulfillment card into couple of smaller components

* Update messages

* Update schema to match api

* Update types

* Update status label component to match colors with new designs and order details cards

* RUpdate and refactor order fulfillment card components to be reusable. Also add replaced status handling

* Updayte card title component to handle all cases and statuses

* Update oorder unfulfilled items card and order details page, reduce some of the boilerplate

* Fix card title types and adjust returns card to match

* Update messages

* Update snapshots

* RUpdate order fulfillment card with subtitles and buttons for returned status

* Add onRefund to order fulfillment card

* Fix typo and wrong message in card title

* Add missing condition in return form submission utils to decice if to refund products

* Update fulfillment subtitles row and tests

* Update messages

* Change naming and locations of OrderFulfillment and items card components

* Update messages

* U[pdate names of components again to even better ones

* Update messages

* changelog

* Update schema and types so that order history event also includes user first and last name

* Add extended timeline event and event header components. Move some of the logic to utils and add way to display links in the event header.

* FFix types

* Update messages

* Change naming of isOfType -> isTimelineEventOfType and refactor extended timeline event messages selection to be less complicated

* Add ids and update messages

* Add ids and update messages some more

* Update storybook decorator to work with react router context in components and tests

* Refactor after review

* Update messages

* Add rredirecting to draft order

* Add handling draft creation from replacement

* Add related order to order event fragment and update lots and lots of types

* Update extended timeline event to match related order type on order history event

* Update fixtures

* Refactor ExtendedTimelineEvent

Co-authored-by: Jakub Majorek <majorek.jakub@gmail.com>

* Fix typing

* Update messages

* Fix missing history event for replacement draft created for replaced products

* Update messages

* Handle new statuses for returned and partially returned orders

* Update messages

* update snapshots

* BBump empty line to rebuild ci

* Change status to proper color

* Change replaceable items in return for replace to be auto off instead of on

* Add utils functions and make order details menu not show option to return items when there are returnable items in the order

* Fix replace checkbox showing when previously hidden and clicked set maximal quantities

* Fix return form invalid money values

* Add default values to avoid returning of NaN in utils for return amount and refactor

* Add ggeneral error alerts

* Add eproduct error box component and style. style a lot.

* Fixes

* Fix lint

* Add cannot refund error title + description

* Extract messages

* Refactor after review

* Add better, nicer and fancier imports to product error cell

* Use error color from palette in product error cell

* Fix max refund when 0 for return

* Add ddisable ability to refund products button so it's disabled when 0 products selected

* Add class for order return form data parsing and add condition to not do refund when total captured on order is 0

* Update snapshots

* Add condition for order lines quantity in order products table row

* Fix return amount submit button

* Add change to changelog

Co-authored-by: Jakub Majorek <majorek.jakub@gmail.com>
2021-01-20 17:16:43 +01:00

211 lines
5.8 KiB
TypeScript

import { makeStyles, Typography } from "@material-ui/core";
import Money from "@saleor/components/Money";
import { TimelineEvent } from "@saleor/components/Timeline";
import { orderUrl } from "@saleor/orders/urls";
import { staffMemberDetailsUrl } from "@saleor/staff/urls";
import { OrderEventsEnum } from "@saleor/types/globalTypes";
import classNames from "classnames";
import camelCase from "lodash/camelCase";
import React from "react";
import { defineMessages, useIntl } from "react-intl";
import { OrderDetails_order_events } from "../../types/OrderDetails";
const useStyles = makeStyles(
theme => ({
eventSubtitle: {
marginBottom: theme.spacing(0.5),
marginTop: theme.spacing(1)
},
header: {
fontWeight: 500,
marginBottom: theme.spacing(1)
},
linesTableCell: {
paddingRight: theme.spacing(3)
},
root: { marginTop: theme.spacing(4) },
topSpacer: {
marginTop: theme.spacing(3)
},
user: {
marginBottom: theme.spacing(1)
}
}),
{ name: "OrderHistory" }
);
export const productTitles = defineMessages({
draftCreatedFromReplace: {
defaultMessage: "Products replaced",
description: "draft created from replace products list title",
id: "event products title draft reissued"
},
fulfillmentRefunded: {
defaultMessage: "Products refunded",
description: "refunded products list title",
id: "event products list title refunded"
},
fulfillmentReplaced: {
defaultMessage: "Products replaced",
description: "replaced products list title",
id: "event products list title replaced"
},
fulfillmentReturned: {
defaultMessage: "Products returned",
description: "returned products list title",
id: "event products list title returned"
}
});
export const titles = defineMessages({
draftCreatedFromReplace: {
defaultMessage: "Draft was reissued from order ",
description: "draft created from replace event title",
id: "event title draft reissued"
},
fulfillmentRefunded: {
defaultMessage: "Products were refunded by ",
description: "refunded event title",
id: "event title refunded"
},
fulfillmentReplaced: {
defaultMessage: "Products were replaced by ",
description: "replaced event title",
id: "event title replaced"
},
fulfillmentReturned: {
defaultMessage: "Products were returned by",
description: "returned event title",
id: "event title returned"
}
});
export const messages = defineMessages({
by: {
defaultMessage: "by",
description: "by preposition",
id: "by preposition"
},
refundedAmount: {
defaultMessage: "Refunded amount",
description: "amount title",
id: "amount title"
},
refundedShipment: {
defaultMessage: "Shipment was refunded",
description: "shipment refund title",
id: "shipment refund title"
}
});
interface ExtendedTimelineEventProps {
event: OrderDetails_order_events;
orderCurrency: string;
}
const ExtendedTimelineEvent: React.FC<ExtendedTimelineEventProps> = ({
event,
orderCurrency
}) => {
const {
id,
date,
type,
user,
lines,
amount,
shippingCostsIncluded,
relatedOrder
} = event;
const classes = useStyles({});
const intl = useIntl();
const eventTypeInCamelCase = camelCase(type);
const employeeName = `${user.firstName} ${user.lastName}`;
const titleElements = {
by: { text: intl.formatMessage(messages.by) },
employeeName: { link: staffMemberDetailsUrl(user.id), text: employeeName },
orderNumber: {
link: orderUrl(relatedOrder?.id),
text: `#${relatedOrder?.number}`
},
title: { text: intl.formatMessage(titles[eventTypeInCamelCase]) }
};
const selectTitleElements = () => {
const { title, by, employeeName, orderNumber } = titleElements;
switch (type) {
case OrderEventsEnum.DRAFT_CREATED_FROM_REPLACE: {
return [title, orderNumber, by, employeeName];
}
default: {
return [title, employeeName];
}
}
};
return (
<TimelineEvent date={date} titleElements={selectTitleElements()} key={id}>
{lines && (
<>
<Typography
variant="caption"
color="textSecondary"
className={classes.eventSubtitle}
>
{intl.formatMessage(productTitles[eventTypeInCamelCase])}
</Typography>
<table>
<tbody>
{lines.map(({ orderLine, quantity }) => (
<tr key={orderLine.id}>
<td className={classes.linesTableCell}>
{orderLine.productName}
</td>
<td className={classes.linesTableCell}>
<Typography variant="caption" color="textSecondary">
{orderLine.variantName}
</Typography>
</td>
<td className={classes.linesTableCell}>
<Typography variant="caption" color="textSecondary">
{`qty: ${quantity}`}
</Typography>
</td>
</tr>
))}
</tbody>
</table>
{(amount || amount === 0) && (
<>
<Typography
variant="caption"
color="textSecondary"
className={classNames(classes.eventSubtitle, classes.topSpacer)}
>
{intl.formatMessage(messages.refundedAmount)}
</Typography>
<Money
money={{
amount,
currency: orderCurrency
}}
/>
</>
)}
{shippingCostsIncluded && (
<Typography>
{intl.formatMessage(messages.refundedShipment)}
</Typography>
)}
</>
)}
</TimelineEvent>
);
};
export default ExtendedTimelineEvent;