fix(medusa, admin-ui): Fix edit order variant stock (#3512)
The stock column when adding variants in an order edit would just look at `inventory_quantity`, location-unaware. Updated this to now attempt to request location-aware stock information and updated the column to use this information and show total stock across how many locations, and a tooltip showing per-location stock.  Resolves CORE-1250 Co-authored-by: Philip Korsholm <88927411+pKorsholm@users.noreply.github.com>
This commit is contained in:
1 parent
2176ff5027
commit
a8423b8acc
4 files changed
+76
-6
No files matched your search
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"@medusajs/admin-ui": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix(medusa, admin-ui): Fix edit order variant stock
|
||||||
@@ -50,6 +50,7 @@
|
|||||||
"emoji-picker-react": "^4.4.3",
|
"emoji-picker-react": "^4.4.3",
|
||||||
"framer-motion": "^9.1.6",
|
"framer-motion": "^9.1.6",
|
||||||
"medusa-react": "*",
|
"medusa-react": "*",
|
||||||
|
"pluralize": "^8.0.0",
|
||||||
"postcss": "^8.4.21",
|
"postcss": "^8.4.21",
|
||||||
"query-string": "^8.1.0",
|
"query-string": "^8.1.0",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
@@ -81,6 +82,7 @@
|
|||||||
"@testing-library/jest-dom": "^5.16.5",
|
"@testing-library/jest-dom": "^5.16.5",
|
||||||
"@testing-library/react": "^14.0.0",
|
"@testing-library/react": "^14.0.0",
|
||||||
"@testing-library/user-event": "^14.4.3",
|
"@testing-library/user-event": "^14.4.3",
|
||||||
|
"@types/pluralize": "^0.0.29",
|
||||||
"@types/react": "^18.0.27",
|
"@types/react": "^18.0.27",
|
||||||
"@types/react-dom": "^18.0.10",
|
"@types/react-dom": "^18.0.10",
|
||||||
"@types/react-table": "^7.7.9",
|
"@types/react-table": "^7.7.9",
|
||||||
|
|||||||
@@ -1,15 +1,18 @@
|
|||||||
import { useAdminVariants } from "medusa-react"
|
import { useAdminVariants, useAdminVariantsInventory } from "medusa-react"
|
||||||
import React, { useEffect, useMemo, useState } from "react"
|
import React, { useEffect, useMemo, useState } from "react"
|
||||||
import { usePagination, useRowSelect, useTable } from "react-table"
|
import { usePagination, useRowSelect, useTable } from "react-table"
|
||||||
import { ProductVariant } from "@medusajs/medusa"
|
import { InventoryLevelDTO, ProductVariant } from "@medusajs/medusa"
|
||||||
import clsx from "clsx"
|
import clsx from "clsx"
|
||||||
|
import pluralize from "pluralize"
|
||||||
import { useDebounce } from "../../../hooks/use-debounce"
|
import { useDebounce } from "../../../hooks/use-debounce"
|
||||||
import ImagePlaceholder from "../../../components/fundamentals/image-placeholder"
|
import ImagePlaceholder from "../../../components/fundamentals/image-placeholder"
|
||||||
import Table from "../../../components/molecules/table"
|
import Table from "../../../components/molecules/table"
|
||||||
import IndeterminateCheckbox from "../../../components/molecules/indeterminate-checkbox"
|
import IndeterminateCheckbox from "../../../components/molecules/indeterminate-checkbox"
|
||||||
import { formatAmountWithSymbol } from "../../../utils/prices"
|
import { formatAmountWithSymbol } from "../../../utils/prices"
|
||||||
import TableContainer from "../../../components/organisms/table-container"
|
import TableContainer from "../../../components/organisms/table-container"
|
||||||
|
import Tooltip from "../../../components/atoms/tooltip"
|
||||||
|
import useStockLocations from "../../../hooks/use-stock-locations"
|
||||||
|
import Skeleton from "../../../components/atoms/skeleton"
|
||||||
|
|
||||||
const PAGE_SIZE = 12
|
const PAGE_SIZE = 12
|
||||||
|
|
||||||
@@ -46,6 +49,59 @@ const VariantsTable: React.FC<Props> = (props) => {
|
|||||||
}
|
}
|
||||||
}, [count])
|
}, [count])
|
||||||
|
|
||||||
|
const VariantInventoryCell = ({ row: { original } }) => {
|
||||||
|
const { getLocationNameById } = useStockLocations()
|
||||||
|
|
||||||
|
const { variant, isLoading } = useAdminVariantsInventory(original.id)
|
||||||
|
|
||||||
|
if (isLoading) {
|
||||||
|
return (
|
||||||
|
<div className="flex justify-end">
|
||||||
|
<Skeleton isLoading={true}>
|
||||||
|
<div className="h-[20px] w-[50px]" />
|
||||||
|
</Skeleton>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isLoading && (!variant || !variant.inventory)) {
|
||||||
|
return <div className="text-right">{original.inventory_quantity}</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
const { inventory } = variant
|
||||||
|
|
||||||
|
const total = inventory[0].location_levels.reduce(
|
||||||
|
(sum: number, location_level: InventoryLevelDTO) =>
|
||||||
|
(sum += location_level.stocked_quantity),
|
||||||
|
0
|
||||||
|
)
|
||||||
|
|
||||||
|
const LocationTooltip = (
|
||||||
|
<>
|
||||||
|
{inventory[0].location_levels.map(
|
||||||
|
(location_level: InventoryLevelDTO) => (
|
||||||
|
<div key={location_level.id} className="font-normal">
|
||||||
|
<span className="font-semibold">
|
||||||
|
{location_level.stocked_quantity}
|
||||||
|
</span>
|
||||||
|
{" in "}
|
||||||
|
{getLocationNameById(location_level.location_id)}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Tooltip content={LocationTooltip} side="top" className="translate-x-1/4">
|
||||||
|
<div className="text-right">
|
||||||
|
{total} in {inventory[0].location_levels.length}{" "}
|
||||||
|
{pluralize("location", inventory[0].location_levels.length)}
|
||||||
|
</div>
|
||||||
|
</Tooltip>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
const columns = useMemo(() => {
|
const columns = useMemo(() => {
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
@@ -103,9 +159,7 @@ const VariantsTable: React.FC<Props> = (props) => {
|
|||||||
</div>
|
</div>
|
||||||
),
|
),
|
||||||
accessor: "inventory_quantity",
|
accessor: "inventory_quantity",
|
||||||
Cell: ({ row: { original } }) => (
|
Cell: VariantInventoryCell,
|
||||||
<div className="text-right">{original.inventory_quantity}</div>
|
|
||||||
),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Header: (
|
Header: (
|
||||||
|
|||||||
@@ -5633,6 +5633,7 @@ __metadata:
|
|||||||
"@testing-library/jest-dom": ^5.16.5
|
"@testing-library/jest-dom": ^5.16.5
|
||||||
"@testing-library/react": ^14.0.0
|
"@testing-library/react": ^14.0.0
|
||||||
"@testing-library/user-event": ^14.4.3
|
"@testing-library/user-event": ^14.4.3
|
||||||
|
"@types/pluralize": ^0.0.29
|
||||||
"@types/react": ^18.0.27
|
"@types/react": ^18.0.27
|
||||||
"@types/react-dom": ^18.0.10
|
"@types/react-dom": ^18.0.10
|
||||||
"@types/react-table": ^7.7.9
|
"@types/react-table": ^7.7.9
|
||||||
@@ -5643,6 +5644,7 @@ __metadata:
|
|||||||
emoji-picker-react: ^4.4.3
|
emoji-picker-react: ^4.4.3
|
||||||
framer-motion: ^9.1.6
|
framer-motion: ^9.1.6
|
||||||
medusa-react: "*"
|
medusa-react: "*"
|
||||||
|
pluralize: ^8.0.0
|
||||||
postcss: ^8.4.21
|
postcss: ^8.4.21
|
||||||
query-string: ^8.1.0
|
query-string: ^8.1.0
|
||||||
react: ^18.2.0
|
react: ^18.2.0
|
||||||
@@ -11372,6 +11374,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@types/pluralize@npm:^0.0.29":
|
||||||
|
version: 0.0.29
|
||||||
|
resolution: "@types/pluralize@npm:0.0.29"
|
||||||
|
checksum: 840796fa1db158eb4d9787758d134736e29d9a8035f5b0cbad06e3801fc64b79112ba944c83f9a1a5b94da08703f505b8315b7e0f28bfc0f8e9e1ccfead7b083
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@types/prettier@npm:^1.19.0":
|
"@types/prettier@npm:^1.19.0":
|
||||||
version: 1.19.1
|
version: 1.19.1
|
||||||
resolution: "@types/prettier@npm:1.19.1"
|
resolution: "@types/prettier@npm:1.19.1"
|
||||||
|
|||||||
Reference in new issue
Block a user