feat(inventory,dashboard,types,core-flows,js-sdk,medusa): Improve inventory UX (#10630)

* feat(dashboard): Add UI for bulk editing inventory stock (#10556)

* progress

* cleanup types

* add changeset

* fix 0 values

* format schema

* add delete event and allow copy/pasting enabled for some fields

* add response types

* add tests

* work on fixing setValue behaviour

* cleanup toggle logic

* add loading state

* format schema

* add support for bidirectional actions in DataGrid and update Checkbox and RadioGroup

* update lock

* lint

* fix 404

* address feedback

* update cursor on bidirectional select
This commit is contained in:
Kasper Fabricius Kristensen
2025-01-12 19:07:14 -05:00
committed by GitHub
parent c5915451b8
commit bc22b81cdf
82 changed files with 2720 additions and 289 deletions
+121 -48
View File
@@ -15,15 +15,15 @@ export class InventoryItem {
}
/**
* This method creates an inventory item. It sends a request to the
* This method creates an inventory item. It sends a request to the
* [Create Inventory Item](https://docs.medusajs.com/api/admin#inventory-items_postinventoryitems)
* API route.
*
*
* @param body - The inventory item's details.
* @param query - Configure the fields to retrieve in the inventory item.
* @param headers - Headers to pass in the request.
* @returns The inventory item's details.
*
*
* @example
* sdk.admin.inventoryItem.create({
* sku: "SHIRT"
@@ -52,13 +52,13 @@ export class InventoryItem {
* This method updates an inventory level. It sends a request to the
* [Update Inventory Item](https://docs.medusajs.com/api/admin#inventory-items_postinventoryitemsid)
* API route.
*
*
* @param id - The inventory item's ID.
* @param body - The data to update.
* @param query - Configure the fields to retrieve in the inventory item.
* @param headers - Headers to pass in the request.
* @returns The inventory item's details.
*
*
* @example
* sdk.admin.inventoryItem.update("iitem_123", {
* sku: "SHIRT"
@@ -85,28 +85,28 @@ export class InventoryItem {
}
/**
* This method retrieves a paginated list of inventory items. It sends a request to the
* This method retrieves a paginated list of inventory items. It sends a request to the
* [List Inventory Items](https://docs.medusajs.com/api/admin#inventory-items_getinventoryitems)
* API route.
*
*
* @param query - Filters and pagination configurations.
* @param headers - Headers to pass in the request.
* @returns The paginated list of inventory items.
*
*
* @example
* To retrieve the list of inventory items:
*
*
* ```ts
* sdk.admin.inventoryItem.list()
* .then(({ inventory_items, count, limit, offset }) => {
* console.log(inventory_items)
* })
* ```
*
*
* To configure the pagination, pass the `limit` and `offset` query parameters.
*
*
* For example, to retrieve only 10 items and skip 10 items:
*
*
* ```ts
* sdk.admin.inventoryItem.list({
* limit: 10,
@@ -116,10 +116,10 @@ export class InventoryItem {
* console.log(inventory_items)
* })
* ```
*
*
* Using the `fields` query parameter, you can specify the fields and relations to retrieve
* in each inventory item:
*
*
* ```ts
* sdk.admin.inventoryItem.list({
* fields: "id,*location_levels"
@@ -128,7 +128,7 @@ export class InventoryItem {
* console.log(inventory_items)
* })
* ```
*
*
* Learn more about the `fields` property in the [API reference](https://docs.medusajs.com/api/store#select-fields-and-relations).
*/
async list(
@@ -145,26 +145,26 @@ export class InventoryItem {
}
/**
* This method retrieves an inventory item by its ID. It sends a request to the
* This method retrieves an inventory item by its ID. It sends a request to the
* [Get Inventory Item](https://docs.medusajs.com/api/admin#inventory-items_getinventoryitemsid) API route.
*
*
* @param id - The inventory item's ID.
* @param query - Configure the fields to retrieve in the inventory item.
* @param headers - Headers to pass in the request
* @returns The inventory item's details.
*
*
* @example
* To retrieve an inventory item by its ID:
*
*
* ```ts
* sdk.admin.inventoryItem.retrieve("iitem_123")
* .then(({ inventory_item }) => {
* console.log(inventory_item)
* })
* ```
*
*
* To specify the fields and relations to retrieve:
*
*
* ```ts
* sdk.admin.inventoryItem.retrieve("iitem_123", {
* fields: "id,*location_levels"
@@ -173,7 +173,7 @@ export class InventoryItem {
* console.log(inventory_item)
* })
* ```
*
*
* Learn more about the `fields` property in the [API reference](https://docs.medusajs.com/api/store#select-fields-and-relations).
*/
async retrieve(id: string, query?: SelectParams, headers?: ClientHeaders) {
@@ -190,11 +190,11 @@ export class InventoryItem {
* This method deletes an inventory item. This sends a request to the
* [Delete Inventory Item](https://docs.medusajs.com/api/admin#inventory-items_deleteinventoryitemsid)
* API route.
*
*
* @param id - The inventory item's ID.
* @param headers - Headers to pass in the request
* @returns The deletion's details.
*
*
* @example
* sdk.admin.inventoryItem.delete("iitem_123")
* .then(({ deleted }) => {
@@ -215,26 +215,26 @@ export class InventoryItem {
* This method retrieves a paginated list of inventory levels that belong to an inventory item.
* It sends a request to the [List Inventory Items](https://docs.medusajs.com/api/admin#inventory-items_getinventoryitems)
* API route.
*
*
* @param id - The inventory item's ID.
* @param query - Filters and pagination configurations.
* @param headers - Headers to pass in the request.
* @returns The paginated list of inventory levels.
*
*
* @example
* To retrieve the list of inventory levels:
*
*
* ```ts
* sdk.admin.inventoryItem.listLevels("iitem_123")
* .then(({ inventory_levels, count, limit, offset }) => {
* console.log(inventory_levels)
* })
* ```
*
*
* To configure the pagination, pass the `limit` and `offset` query parameters.
*
*
* For example, to retrieve only 10 items and skip 10 items:
*
*
* ```ts
* sdk.admin.inventoryItem.listLevels("iitem_123", {
* limit: 10,
@@ -244,10 +244,10 @@ export class InventoryItem {
* console.log(inventory_levels)
* })
* ```
*
*
* Using the `fields` query parameter, you can specify the fields and relations to retrieve
* in each inventory level:
*
*
* ```ts
* sdk.admin.inventoryItem.listLevels("iitem_123", {
* fields: "id,*inventory_item"
@@ -256,7 +256,7 @@ export class InventoryItem {
* console.log(inventory_levels)
* })
* ```
*
*
* Learn more about the `fields` property in the [API reference](https://docs.medusajs.com/api/store#select-fields-and-relations).
*/
async listLevels(
@@ -276,18 +276,18 @@ export class InventoryItem {
/**
* This method updates the inventory level of the specified inventory item and
* stock location.
*
* This method sends a request to the
*
* This method sends a request to the
* [Update Inventory Level](https://docs.medusajs.com/api/admin#inventory-items_postinventoryitemsidlocationlevelslocation_id)
* API route.
*
*
* @param id - The inventory item's ID.
* @param locationId - The stock location's ID.
* @param body - The details to update.
* @param query - Configure the fields to retrieve in the inventory item.
* @param headers - Headers to pass in the request
* @returns The inventory item's details.
*
*
* @example
* sdk.admin.inventoryItem.updateLevel(
* "iitem_123",
@@ -321,16 +321,16 @@ export class InventoryItem {
/**
* This method deletes an inventory level associated with an inventory item
* and a stock location.
*
* This method sends a request to the
*
* This method sends a request to the
* [Remove Inventory Level](https://docs.medusajs.com/api/admin#inventory-items_deleteinventoryitemsidlocationlevelslocation_id)
* API route.
*
*
* @param id - The inventory item's ID.
* @param locationId - The stock location's ID.
* @param headers - Headers to pass in the request
* @returns The deletion's details.
*
*
* @example
* sdk.admin.inventoryItem.deleteLevel(
* "iitem_123",
@@ -354,32 +354,34 @@ export class InventoryItem {
* This method manages the inventory levels of an inventory item. It sends a request to the
* [Manage Inventory Levels](https://docs.medusajs.com/api/admin#inventory-items_postinventoryitemsidlocationlevelsbatch)
* API route.
*
*
* @deprecated Use `batchInventoryItemLocationLevels` instead.
*
* @param id - The inventory item's ID.
* @param body - The inventory levels to create or delete.
* @param query - Configure the fields to retrieve in the inventory item.
* @param headers - Headers to pass in the request
* @returns The inventory item's details.
*
*
* @example
* sdk.admin.inventoryItem.batchUpdateLevels("iitem_123", {
* create: [{
* location_id: "sloc_123",
* stocked_quantity: 10
* }],
* delete: ["sloc_123"]
* delete: ["ilvl_123"]
* })
* .then(({ inventory_item }) => {
* console.log(inventory_item)
* .then(({ created, updated, deleted }) => {
* console.log(created, updated, deleted)
* })
*/
async batchUpdateLevels(
id: string,
body: HttpTypes.AdminBatchUpdateInventoryLevelLocation,
body: HttpTypes.AdminBatchInventoryItemLocationLevels,
query?: SelectParams,
headers?: ClientHeaders
) {
return await this.client.fetch<HttpTypes.AdminInventoryItemResponse>(
return await this.client.fetch<HttpTypes.AdminBatchInventoryItemLocationLevelsResponse>(
`/admin/inventory-items/${id}/location-levels/batch`,
{
method: "POST",
@@ -389,4 +391,75 @@ export class InventoryItem {
}
)
}
/**
* This method manages the inventory levels of an inventory item. It sends a request to the
* [Manage Inventory Levels](https://docs.medusajs.com/api/admin#inventory-items_postinventoryitemsidlocationlevelsbatch)
* API route.
*
* @param id - The inventory item's ID.
* @param body - The inventory levels to create, update or delete, and an optional `force` flag.
* @param headers - Headers to pass in the request
* @returns The inventory item's details.
*
* @example
* sdk.admin.inventoryItem.batchInventoryItemLocationLevels("iitem_123", {
* create: [{
* location_id: "sloc_123",
* stocked_quantity: 10
* }],
* delete: ["ilvl_123"]
* })
* .then(({ created, updated, deleted }) => {
* console.log(created, updated, deleted)
* })
*/
async batchInventoryItemLocationLevels(
id: string,
body: HttpTypes.AdminBatchInventoryItemLocationLevels,
headers?: ClientHeaders
) {
return await this.client.fetch<HttpTypes.AdminBatchInventoryItemLocationLevelsResponse>(
`/admin/inventory-items/${id}/location-levels/batch`,
{
method: "POST",
headers,
body,
}
)
}
/**
* This method manages the inventory levels of multiple inventory items.
*
* @param body - The inventory levels to create, update or delete, and an optional `force` flag.
* @param headers - Headers to pass in the request
* @returns The inventory item's details.
*
* @example
* sdk.admin.inventoryItem.batchInventoryItemsLocationLevels({
* create: [{
* inventory_item_id: "iitem_123",
* location_id: "sloc_123",
* stocked_quantity: 10
* }],
* delete: ["ilvl_123"]
* })
* .then(({ created, updated, deleted }) => {
* console.log(created, updated, deleted)
* })
*/
async batchInventoryItemsLocationLevels(
body: HttpTypes.AdminBatchInventoryItemsLocationLevels,
headers?: ClientHeaders
) {
return await this.client.fetch<HttpTypes.AdminBatchInventoryItemsLocationLevelsResponse>(
`/admin/inventory-items/location-levels/batch`,
{
method: "POST",
headers,
body,
}
)
}
}