feat(types,dashboard): ability to set shipping methods for claim (#8533)
This commit is contained in:
@@ -894,6 +894,9 @@
|
|||||||
"cancelClaim": {
|
"cancelClaim": {
|
||||||
"successToast": "Claim was successfully canceled."
|
"successToast": "Claim was successfully canceled."
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"tooltips": {
|
||||||
|
"onlyReturnShippingOptions": "This list will consist of only return shipping options."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"reservations": {
|
"reservations": {
|
||||||
|
|||||||
+10
-1
@@ -6,6 +6,7 @@ import { useNavigate, useParams } from "react-router-dom"
|
|||||||
import { RouteFocusModal } from "../../../components/modals"
|
import { RouteFocusModal } from "../../../components/modals"
|
||||||
import { useClaim, useCreateClaim } from "../../../hooks/api/claims"
|
import { useClaim, useCreateClaim } from "../../../hooks/api/claims"
|
||||||
import { useOrder, useOrderPreview } from "../../../hooks/api/orders"
|
import { useOrder, useOrderPreview } from "../../../hooks/api/orders"
|
||||||
|
import { useReturn } from "../../../hooks/api/returns"
|
||||||
import { DEFAULT_FIELDS } from "../order-detail/constants"
|
import { DEFAULT_FIELDS } from "../order-detail/constants"
|
||||||
import { ClaimCreateForm } from "./components/claim-create-form"
|
import { ClaimCreateForm } from "./components/claim-create-form"
|
||||||
|
|
||||||
@@ -27,6 +28,9 @@ export const ClaimCreate = () => {
|
|||||||
const { claim } = useClaim(activeClaimId!, undefined, {
|
const { claim } = useClaim(activeClaimId!, undefined, {
|
||||||
enabled: !!activeClaimId,
|
enabled: !!activeClaimId,
|
||||||
})
|
})
|
||||||
|
const { return: orderReturn } = useReturn(claim?.return_id!, undefined, {
|
||||||
|
enabled: !!claim?.return_id,
|
||||||
|
})
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
async function run() {
|
async function run() {
|
||||||
@@ -68,7 +72,12 @@ export const ClaimCreate = () => {
|
|||||||
return (
|
return (
|
||||||
<RouteFocusModal>
|
<RouteFocusModal>
|
||||||
{claim && preview && order && (
|
{claim && preview && order && (
|
||||||
<ClaimCreateForm order={order} claim={claim} preview={preview} />
|
<ClaimCreateForm
|
||||||
|
order={order}
|
||||||
|
claim={claim}
|
||||||
|
preview={preview}
|
||||||
|
orderReturn={orderReturn}
|
||||||
|
/>
|
||||||
)}
|
)}
|
||||||
</RouteFocusModal>
|
</RouteFocusModal>
|
||||||
)
|
)
|
||||||
|
|||||||
+69
-43
@@ -36,6 +36,7 @@ import { AddClaimItemsTable } from "../add-claim-items-table"
|
|||||||
import { ClaimInboundItem } from "./claim-inbound-item.tsx"
|
import { ClaimInboundItem } from "./claim-inbound-item.tsx"
|
||||||
import { ClaimCreateSchema, CreateClaimSchemaType } from "./schema"
|
import { ClaimCreateSchema, CreateClaimSchemaType } from "./schema"
|
||||||
|
|
||||||
|
import { AdminReturn } from "@medusajs/types"
|
||||||
import {
|
import {
|
||||||
useAddClaimInboundItems,
|
useAddClaimInboundItems,
|
||||||
useAddClaimInboundShipping,
|
useAddClaimInboundShipping,
|
||||||
@@ -45,6 +46,7 @@ import {
|
|||||||
useUpdateClaimInboundItem,
|
useUpdateClaimInboundItem,
|
||||||
useUpdateClaimInboundShipping,
|
useUpdateClaimInboundShipping,
|
||||||
} from "../../../../../hooks/api/claims"
|
} from "../../../../../hooks/api/claims"
|
||||||
|
import { useUpdateReturn } from "../../../../../hooks/api/returns.tsx"
|
||||||
import { sdk } from "../../../../../lib/client"
|
import { sdk } from "../../../../../lib/client"
|
||||||
import { currencies } from "../../../../../lib/data/currencies"
|
import { currencies } from "../../../../../lib/data/currencies"
|
||||||
import { ClaimOutboundSection } from "./claim-outbound-section"
|
import { ClaimOutboundSection } from "./claim-outbound-section"
|
||||||
@@ -54,6 +56,7 @@ type ReturnCreateFormProps = {
|
|||||||
order: AdminOrder
|
order: AdminOrder
|
||||||
claim: AdminClaim
|
claim: AdminClaim
|
||||||
preview: AdminOrderPreview
|
preview: AdminOrderPreview
|
||||||
|
orderReturn?: AdminReturn
|
||||||
}
|
}
|
||||||
|
|
||||||
let itemsToAdd: string[] = []
|
let itemsToAdd: string[] = []
|
||||||
@@ -64,6 +67,7 @@ export const ClaimCreateForm = ({
|
|||||||
order,
|
order,
|
||||||
preview,
|
preview,
|
||||||
claim,
|
claim,
|
||||||
|
orderReturn,
|
||||||
}: ReturnCreateFormProps) => {
|
}: ReturnCreateFormProps) => {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const { handleSuccess } = useRouteModal()
|
const { handleSuccess } = useRouteModal()
|
||||||
@@ -78,18 +82,6 @@ export const ClaimCreateForm = ({
|
|||||||
Record<string, InventoryLevelDTO[]>
|
Record<string, InventoryLevelDTO[]>
|
||||||
>({})
|
>({})
|
||||||
|
|
||||||
/**
|
|
||||||
* HOOKS
|
|
||||||
*/
|
|
||||||
const { stock_locations = [] } = useStockLocations({ limit: 999 })
|
|
||||||
const { shipping_options = [] } = useShippingOptions({
|
|
||||||
limit: 999,
|
|
||||||
fields: "*prices,+service_zone.fulfillment_set.location.id",
|
|
||||||
/**
|
|
||||||
* TODO: this should accept filter for location_id
|
|
||||||
*/
|
|
||||||
})
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MUTATIONS
|
* MUTATIONS
|
||||||
*/
|
*/
|
||||||
@@ -100,7 +92,11 @@ export const ClaimCreateForm = ({
|
|||||||
useCancelClaimRequest(claim.id, order.id)
|
useCancelClaimRequest(claim.id, order.id)
|
||||||
|
|
||||||
// TODO: implement update claim request
|
// TODO: implement update claim request
|
||||||
const { mutateAsync: updateClaimRequest, isPending: isUpdating } = {} // useUpdateClaim(claim.id, order.id)
|
|
||||||
|
const { mutateAsync: updateReturn, isPending: isUpdating } = useUpdateReturn(
|
||||||
|
claim.return_id!,
|
||||||
|
order.id
|
||||||
|
)
|
||||||
|
|
||||||
const {
|
const {
|
||||||
mutateAsync: addInboundShipping,
|
mutateAsync: addInboundShipping,
|
||||||
@@ -166,9 +162,17 @@ export const ClaimCreateForm = ({
|
|||||||
*/
|
*/
|
||||||
const form = useForm<CreateClaimSchemaType>({
|
const form = useForm<CreateClaimSchemaType>({
|
||||||
defaultValues: () => {
|
defaultValues: () => {
|
||||||
const method = preview.shipping_methods.find(
|
const inboundShippingMethod = preview.shipping_methods.find((s) => {
|
||||||
(s) => !!s.actions?.find((a) => a.action === "SHIPPING_ADD")
|
const action = s.actions?.find((a) => a.action === "SHIPPING_ADD")
|
||||||
)
|
|
||||||
|
return !!action?.return?.id
|
||||||
|
})
|
||||||
|
|
||||||
|
const outboundShippingMethod = preview.shipping_methods.find((s) => {
|
||||||
|
const action = s.actions?.find((a) => a.action === "SHIPPING_ADD")
|
||||||
|
|
||||||
|
return action && !!!action?.return?.id
|
||||||
|
})
|
||||||
|
|
||||||
return Promise.resolve({
|
return Promise.resolve({
|
||||||
inbound_items: inboundPreviewItems.map((i) => {
|
inbound_items: inboundPreviewItems.map((i) => {
|
||||||
@@ -189,16 +193,43 @@ export const ClaimCreateForm = ({
|
|||||||
variant_id: i.variant_id,
|
variant_id: i.variant_id,
|
||||||
quantity: i.detail.quantity,
|
quantity: i.detail.quantity,
|
||||||
})),
|
})),
|
||||||
inbound_option_id: method ? method.shipping_option_id : "",
|
inbound_option_id: inboundShippingMethod
|
||||||
// TODO: pick up shipping method for outbound when available
|
? inboundShippingMethod.shipping_option_id
|
||||||
outbound_option_id: method ? method.shipping_option_id : "",
|
: "",
|
||||||
location_id: "",
|
outbound_option_id: outboundShippingMethod
|
||||||
|
? outboundShippingMethod.shipping_option_id
|
||||||
|
: "",
|
||||||
|
location_id: orderReturn?.location_id,
|
||||||
send_notification: false,
|
send_notification: false,
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
resolver: zodResolver(ClaimCreateSchema),
|
resolver: zodResolver(ClaimCreateSchema),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const locationId = form.watch("location_id")
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HOOKS
|
||||||
|
*/
|
||||||
|
const { stock_locations = [] } = useStockLocations({ limit: 999 })
|
||||||
|
const { shipping_options = [] } = useShippingOptions(
|
||||||
|
{
|
||||||
|
limit: 999,
|
||||||
|
fields: "*prices,+service_zone.fulfillment_set.location.id",
|
||||||
|
stock_location_id: locationId,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
enabled: !!locationId,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
const inboundShippingOptions = shipping_options.filter(
|
||||||
|
(shippingOption) =>
|
||||||
|
!!shippingOption.rules.find(
|
||||||
|
(r) => r.attribute === "is_return" && r.value === "true"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
const {
|
const {
|
||||||
fields: inboundItems,
|
fields: inboundItems,
|
||||||
append,
|
append,
|
||||||
@@ -257,8 +288,11 @@ export const ClaimCreateForm = ({
|
|||||||
}
|
}
|
||||||
}, [preview.shipping_methods])
|
}, [preview.shipping_methods])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
form.setValue("location_id", orderReturn?.location_id)
|
||||||
|
}, [orderReturn])
|
||||||
|
|
||||||
const showInboundItemsPlaceholder = !inboundItems.length
|
const showInboundItemsPlaceholder = !inboundItems.length
|
||||||
const locationId = form.watch("location_id")
|
|
||||||
const shippingOptionId = form.watch("inbound_option_id")
|
const shippingOptionId = form.watch("inbound_option_id")
|
||||||
|
|
||||||
const handleSubmit = form.handleSubmit(async (data) => {
|
const handleSubmit = form.handleSubmit(async (data) => {
|
||||||
@@ -307,7 +341,7 @@ export const ClaimCreateForm = ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const onLocationChange = async (selectedLocationId?: string | null) => {
|
const onLocationChange = async (selectedLocationId?: string | null) => {
|
||||||
await updateClaimRequest({ location_id: selectedLocationId })
|
await updateReturn({ location_id: selectedLocationId })
|
||||||
}
|
}
|
||||||
|
|
||||||
const onShippingOptionChange = async (selectedOptionId: string) => {
|
const onShippingOptionChange = async (selectedOptionId: string) => {
|
||||||
@@ -379,7 +413,7 @@ export const ClaimCreateForm = ({
|
|||||||
).variants
|
).variants
|
||||||
|
|
||||||
variants.forEach((variant) => {
|
variants.forEach((variant) => {
|
||||||
ret[variant.id] = variant.inventory[0]?.location_levels || []
|
ret[variant.id] = variant.inventory?.[0]?.location_levels || []
|
||||||
})
|
})
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
@@ -549,12 +583,12 @@ export const ClaimCreateForm = ({
|
|||||||
<Form.Item>
|
<Form.Item>
|
||||||
<Form.Control>
|
<Form.Control>
|
||||||
<Combobox
|
<Combobox
|
||||||
value={value}
|
{...field}
|
||||||
|
value={value ?? undefined}
|
||||||
onChange={(v) => {
|
onChange={(v) => {
|
||||||
onChange(v)
|
onChange(v)
|
||||||
onLocationChange(v)
|
onLocationChange(v)
|
||||||
}}
|
}}
|
||||||
{...field}
|
|
||||||
options={(stock_locations ?? []).map(
|
options={(stock_locations ?? []).map(
|
||||||
(stockLocation) => ({
|
(stockLocation) => ({
|
||||||
label: stockLocation.name,
|
label: stockLocation.name,
|
||||||
@@ -572,9 +606,14 @@ export const ClaimCreateForm = ({
|
|||||||
{/*INBOUND SHIPPING*/}
|
{/*INBOUND SHIPPING*/}
|
||||||
<div className="grid grid-cols-1 gap-2 md:grid-cols-2">
|
<div className="grid grid-cols-1 gap-2 md:grid-cols-2">
|
||||||
<div>
|
<div>
|
||||||
<Form.Label>
|
<Form.Label
|
||||||
|
tooltip={t(
|
||||||
|
"orders.claims.tooltips.onlyReturnShippingOptions"
|
||||||
|
)}
|
||||||
|
>
|
||||||
{t("orders.returns.inboundShipping")}
|
{t("orders.returns.inboundShipping")}
|
||||||
</Form.Label>
|
</Form.Label>
|
||||||
|
|
||||||
<Form.Hint className="!mt-1">
|
<Form.Hint className="!mt-1">
|
||||||
{t("orders.returns.inboundShippingHint")}
|
{t("orders.returns.inboundShippingHint")}
|
||||||
</Form.Hint>
|
</Form.Hint>
|
||||||
@@ -595,23 +634,10 @@ export const ClaimCreateForm = ({
|
|||||||
val && onShippingOptionChange(val)
|
val && onShippingOptionChange(val)
|
||||||
}}
|
}}
|
||||||
{...field}
|
{...field}
|
||||||
options={(shipping_options ?? [])
|
options={inboundShippingOptions.map((so) => ({
|
||||||
.filter(
|
label: so.name,
|
||||||
(so) =>
|
value: so.id,
|
||||||
(locationId
|
}))}
|
||||||
? so.service_zone.fulfillment_set!
|
|
||||||
.location.id === locationId
|
|
||||||
: true) &&
|
|
||||||
!!so.rules.find(
|
|
||||||
(r) =>
|
|
||||||
r.attribute === "is_return" &&
|
|
||||||
r.value === "true"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.map((so) => ({
|
|
||||||
label: so.name,
|
|
||||||
value: so.id,
|
|
||||||
}))}
|
|
||||||
disabled={!locationId}
|
disabled={!locationId}
|
||||||
/>
|
/>
|
||||||
</Form.Control>
|
</Form.Control>
|
||||||
|
|||||||
+14
-44
@@ -24,7 +24,6 @@ import {
|
|||||||
useUpdateClaimOutboundItems,
|
useUpdateClaimOutboundItems,
|
||||||
} from "../../../../../hooks/api/claims"
|
} from "../../../../../hooks/api/claims"
|
||||||
import { useShippingOptions } from "../../../../../hooks/api/shipping-options"
|
import { useShippingOptions } from "../../../../../hooks/api/shipping-options"
|
||||||
import { useStockLocations } from "../../../../../hooks/api/stock-locations"
|
|
||||||
import { sdk } from "../../../../../lib/client"
|
import { sdk } from "../../../../../lib/client"
|
||||||
import { AddClaimOutboundItemsTable } from "../add-claim-outbound-items-table"
|
import { AddClaimOutboundItemsTable } from "../add-claim-outbound-items-table"
|
||||||
import { ClaimOutboundItem } from "./claim-outbound-item"
|
import { ClaimOutboundItem } from "./claim-outbound-item"
|
||||||
@@ -57,13 +56,9 @@ export const ClaimOutboundSection = ({
|
|||||||
/**
|
/**
|
||||||
* HOOKS
|
* HOOKS
|
||||||
*/
|
*/
|
||||||
const { stock_locations = [] } = useStockLocations({ limit: 999 })
|
|
||||||
const { shipping_options = [] } = useShippingOptions({
|
const { shipping_options = [] } = useShippingOptions({
|
||||||
limit: 999,
|
limit: 999,
|
||||||
fields: "*prices,+service_zone.fulfillment_set.location.id",
|
fields: "*prices,+service_zone.fulfillment_set.location.id",
|
||||||
/**
|
|
||||||
* TODO: this should accept filter for location_id
|
|
||||||
*/
|
|
||||||
})
|
})
|
||||||
|
|
||||||
const { mutateAsync: addOutboundShipping } = useAddClaimOutboundShipping(
|
const { mutateAsync: addOutboundShipping } = useAddClaimOutboundShipping(
|
||||||
@@ -154,17 +149,6 @@ export const ClaimOutboundSection = ({
|
|||||||
})
|
})
|
||||||
}, [previewOutboundItems])
|
}, [previewOutboundItems])
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
// TODO: Pick the shipping methods from actions where return_id is null for outbound
|
|
||||||
const method = preview.shipping_methods.find(
|
|
||||||
(s) => !!s.actions?.find((a) => a.action === "SHIPPING_ADD")
|
|
||||||
)
|
|
||||||
|
|
||||||
if (method) {
|
|
||||||
form.setValue("outbound_option_id", method.shipping_option_id)
|
|
||||||
}
|
|
||||||
}, [preview.shipping_methods])
|
|
||||||
|
|
||||||
const locationId = form.watch("location_id")
|
const locationId = form.watch("location_id")
|
||||||
const showOutboundItemsPlaceholder = !outboundItems.length
|
const showOutboundItemsPlaceholder = !outboundItems.length
|
||||||
|
|
||||||
@@ -201,17 +185,16 @@ export const ClaimOutboundSection = ({
|
|||||||
setIsOpen("outbound-items", false)
|
setIsOpen("outbound-items", false)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: implement outbound shipping
|
|
||||||
const { mutateAsync: updateClaimRequest, isPending: isUpdating } = {} // useUpdateClaim(claim.id, order.id)
|
|
||||||
const onLocationChange = async (selectedLocationId?: string | null) => {
|
|
||||||
await updateClaimRequest({ location_id: selectedLocationId })
|
|
||||||
}
|
|
||||||
|
|
||||||
const onShippingOptionChange = async (selectedOptionId: string) => {
|
const onShippingOptionChange = async (selectedOptionId: string) => {
|
||||||
const promises = preview.shipping_methods
|
const outboundShippingMethods = preview.shipping_methods.filter((s) => {
|
||||||
.map((s) => s.actions?.find((a) => a.action === "SHIPPING_ADD")?.id)
|
const action = s.actions?.find((a) => a.action === "SHIPPING_ADD")
|
||||||
|
|
||||||
|
return action && !!!action?.return?.id
|
||||||
|
})
|
||||||
|
|
||||||
|
const promises = outboundShippingMethods
|
||||||
.filter(Boolean)
|
.filter(Boolean)
|
||||||
.map(deleteOutboundShipping)
|
.map((action) => deleteOutboundShipping(action.id))
|
||||||
|
|
||||||
await Promise.all(promises)
|
await Promise.all(promises)
|
||||||
|
|
||||||
@@ -270,7 +253,7 @@ export const ClaimOutboundSection = ({
|
|||||||
).variants
|
).variants
|
||||||
|
|
||||||
variants.forEach((variant) => {
|
variants.forEach((variant) => {
|
||||||
ret[variant.id] = variant.inventory[0]?.location_levels || []
|
ret[variant.id] = variant.inventory?.[0]?.location_levels || []
|
||||||
})
|
})
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
@@ -403,24 +386,11 @@ export const ClaimOutboundSection = ({
|
|||||||
val && onShippingOptionChange(val)
|
val && onShippingOptionChange(val)
|
||||||
}}
|
}}
|
||||||
{...field}
|
{...field}
|
||||||
options={(shipping_options ?? [])
|
options={shipping_options.map((so) => ({
|
||||||
.filter(
|
label: so.name,
|
||||||
(so) =>
|
value: so.id,
|
||||||
(locationId
|
}))}
|
||||||
? so.service_zone.fulfillment_set!.location
|
disabled={!shipping_options.length}
|
||||||
.id === locationId
|
|
||||||
: true) &&
|
|
||||||
!!so.rules.find(
|
|
||||||
(r) =>
|
|
||||||
r.attribute === "is_return" &&
|
|
||||||
r.value === "true"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.map((so) => ({
|
|
||||||
label: so.name,
|
|
||||||
value: so.id,
|
|
||||||
}))}
|
|
||||||
disabled={!locationId}
|
|
||||||
/>
|
/>
|
||||||
</Form.Control>
|
</Form.Control>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ export interface AdminReturn {
|
|||||||
order_id: string
|
order_id: string
|
||||||
status?: string
|
status?: string
|
||||||
exchange_id?: string
|
exchange_id?: string
|
||||||
|
location_id?: string
|
||||||
claim_id?: string
|
claim_id?: string
|
||||||
order_version: number
|
order_version: number
|
||||||
display_id: number
|
display_id: number
|
||||||
@@ -79,7 +80,7 @@ export interface AdminConfirmReturnRequest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface AdminUpdateReturnRequest {
|
export interface AdminUpdateReturnRequest {
|
||||||
location_id?: string
|
location_id?: string | null
|
||||||
no_notification?: boolean
|
no_notification?: boolean
|
||||||
metadata?: Record<string, unknown> | null
|
metadata?: Record<string, unknown> | null
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ export interface AdminShippingOptionListParams extends FindParams {
|
|||||||
id?: string | string[]
|
id?: string | string[]
|
||||||
q?: string
|
q?: string
|
||||||
service_zone_id?: string
|
service_zone_id?: string
|
||||||
|
stock_location_id?: string | string[]
|
||||||
shipping_profile_id?: string
|
shipping_profile_id?: string
|
||||||
provider_id?: string
|
provider_id?: string
|
||||||
shipping_option_type_id?: string
|
shipping_option_type_id?: string
|
||||||
|
|||||||
Reference in New Issue
Block a user