feat(types,dashboard): ability to set shipping methods for claim (#8533)

This commit is contained in:
Riqwan Thamir
2024-08-09 11:51:33 +02:00
committed by GitHub
parent fdc94f6482
commit 3fe5848e72
6 changed files with 99 additions and 89 deletions
@@ -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": {
@@ -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>
) )
@@ -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>
@@ -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>
+2 -1
View File
@@ -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