feat(dashboard,medusa): Draft order detail (#6703)

**What**
- Adds draft order details page
- Adds Shipping and Billing address forms to both draft order and order pages
- Adds Email form to both draft order and order pages
- Adds transfer ownership form to draft order, order and customer pages
- Update Combobox component allowing it to work with async data (`useInfiniteQuery`)

**@medusajs/medusa**
- Include country as a default relation of draft order addresses
This commit is contained in:
Kasper Fabricius Kristensen
2024-03-15 10:29:59 +00:00
committed by GitHub
parent 68d869607f
commit c3f26a6826
70 changed files with 2884 additions and 573 deletions
@@ -0,0 +1,50 @@
import { FulfillmentStatus, PaymentStatus } from "@medusajs/medusa"
import { TFunction } from "i18next"
export const getOrderPaymentStatus = (
t: TFunction<"translation">,
status: PaymentStatus
) => {
const [label, color] = {
not_paid: [t("orders.payment.status.notPaid"), "red"],
awaiting: [t("orders.payment.status.awaiting"), "orange"],
captured: [t("orders.payment.status.captured"), "green"],
refunded: [t("orders.payment.status.refunded"), "green"],
partially_refunded: [
t("orders.payment.status.partiallyRefunded"),
"orange",
],
canceled: [t("orders.payment.status.canceled"), "red"],
requires_action: [t("orders.payment.status.requiresAction"), "orange"],
}[status] as [string, "red" | "orange" | "green"]
return { label, color }
}
export const getOrderFulfillmentStatus = (
t: TFunction<"translation">,
status: FulfillmentStatus
) => {
const [label, color] = {
not_fulfilled: [t("orders.fulfillment.status.notFulfilled"), "red"],
partially_fulfilled: [
t("orders.fulfillment.status.partiallyFulfilled"),
"orange",
],
fulfilled: [t("orders.fulfillment.status.fulfilled"), "green"],
partially_shipped: [
t("orders.fulfillment.status.partiallyShipped"),
"orange",
],
shipped: [t("orders.fulfillment.status.shipped"), "green"],
partially_returned: [
t("orders.fulfillment.status.partiallyReturned"),
"orange",
],
returned: [t("orders.fulfillment.status.returned"), "green"],
canceled: [t("orders.fulfillment.status.canceled"), "red"],
requires_action: [t("orders.fulfillment.status.requiresAction"), "orange"],
}[status] as [string, "red" | "orange" | "green"]
return { label, color }
}
@@ -0,0 +1,36 @@
import i18n from "i18next"
import { z } from "zod"
export const AddressSchema = z.object({
first_name: z.string().min(1),
last_name: z.string().min(1),
company: z.string().optional(),
address_1: z.string().min(1),
address_2: z.string().optional(),
city: z.string().min(1),
postal_code: z.string().min(1),
province: z.string().optional(),
country_code: z.string().min(1),
phone: z.string().optional(),
})
export const EmailSchema = z.object({
email: z.string().email(),
})
export const TransferOwnershipSchema = z
.object({
current_owner_id: z.string().min(1),
new_owner_id: z
.string()
.min(1, i18n.t("transferOwnership.validation.required")),
})
.superRefine((data, ctx) => {
if (data.current_owner_id === data.new_owner_id) {
return ctx.addIssue({
code: z.ZodIssueCode.custom,
path: ["new_owner_id"],
message: i18n.t("transferOwnership.validation.mustBeDifferent"),
})
}
})