feat(admin-ui): Add Sales Channel filter (#3897)
* feat(admin-ui): Add Sales Channel filter * Create silver-wombats-camp.md * filter out null children
This commit is contained in:
1 parent
491566df6b
commit
0be6816578
5 files changed
+62
-2
No files matched your search
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
"@medusajs/admin-ui": patch
|
||||||
|
"@medusajs/admin": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
feat(admin-ui): Add Sales Channel filter
|
||||||
@@ -74,7 +74,7 @@ const FilterDropdownContainer = ({
|
|||||||
Apply
|
Apply
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
{React.Children.map(children, (child) => {
|
{React.Children.toArray(children).filter(Boolean).map((child) => {
|
||||||
return (
|
return (
|
||||||
<div className="border-grey-20 border-b py-2 px-4 last:border-0 last:pb-0">
|
<div className="border-grey-20 border-b py-2 px-4 last:border-0 last:pb-0">
|
||||||
{child}
|
{child}
|
||||||
|
|||||||
@@ -1,13 +1,16 @@
|
|||||||
import clsx from "clsx"
|
import clsx from "clsx"
|
||||||
import { useAdminRegions } from "medusa-react"
|
import { useAdminRegions, useAdminSalesChannels } from "medusa-react"
|
||||||
import { useEffect, useState } from "react"
|
import { useEffect, useState } from "react"
|
||||||
import FilterDropdownContainer from "../../../components/molecules/filter-dropdown/container"
|
import FilterDropdownContainer from "../../../components/molecules/filter-dropdown/container"
|
||||||
import FilterDropdownItem from "../../../components/molecules/filter-dropdown/item"
|
import FilterDropdownItem from "../../../components/molecules/filter-dropdown/item"
|
||||||
import SaveFilterItem from "../../../components/molecules/filter-dropdown/save-field"
|
import SaveFilterItem from "../../../components/molecules/filter-dropdown/save-field"
|
||||||
import TabFilter from "../../../components/molecules/filter-tab"
|
import TabFilter from "../../../components/molecules/filter-tab"
|
||||||
import PlusIcon from "../../fundamentals/icons/plus-icon"
|
import PlusIcon from "../../fundamentals/icons/plus-icon"
|
||||||
|
import FeatureToggle from "../../fundamentals/feature-toggle"
|
||||||
|
import { useFeatureFlag } from "../../../providers/feature-flag-provider"
|
||||||
|
|
||||||
const REGION_PAGE_SIZE = 10
|
const REGION_PAGE_SIZE = 10
|
||||||
|
const CHANNEL_PAGE_SIZE = 10
|
||||||
|
|
||||||
const statusFilters = [
|
const statusFilters = [
|
||||||
"completed",
|
"completed",
|
||||||
@@ -58,6 +61,9 @@ const OrderFilters = ({
|
|||||||
const [tempState, setTempState] = useState(filters)
|
const [tempState, setTempState] = useState(filters)
|
||||||
const [name, setName] = useState("")
|
const [name, setName] = useState("")
|
||||||
|
|
||||||
|
const { isFeatureEnabled } = useFeatureFlag()
|
||||||
|
const isSalesChannelsEnabled = isFeatureEnabled("sales_channels")
|
||||||
|
|
||||||
const handleRemoveTab = (val) => {
|
const handleRemoveTab = (val) => {
|
||||||
if (onRemoveTab) {
|
if (onRemoveTab) {
|
||||||
onRemoveTab(val)
|
onRemoveTab(val)
|
||||||
@@ -116,6 +122,12 @@ const OrderFilters = ({
|
|||||||
isLoading: isLoadingRegions,
|
isLoading: isLoadingRegions,
|
||||||
} = useAdminRegions(regionsPagination)
|
} = useAdminRegions(regionsPagination)
|
||||||
|
|
||||||
|
const { sales_channels, isLoading: isLoadingSalesChannels } =
|
||||||
|
useAdminSalesChannels(
|
||||||
|
{ limit: CHANNEL_PAGE_SIZE },
|
||||||
|
{ enabled: isSalesChannelsEnabled }
|
||||||
|
)
|
||||||
|
|
||||||
const handlePaginateRegions = (direction) => {
|
const handlePaginateRegions = (direction) => {
|
||||||
if (direction > 0) {
|
if (direction > 0) {
|
||||||
setRegionsPagination((prev) => ({
|
setRegionsPagination((prev) => ({
|
||||||
@@ -195,6 +207,21 @@ const OrderFilters = ({
|
|||||||
open={tempState.region.open}
|
open={tempState.region.open}
|
||||||
setFilter={(v) => setSingleFilter("region", v)}
|
setFilter={(v) => setSingleFilter("region", v)}
|
||||||
/>
|
/>
|
||||||
|
{isSalesChannelsEnabled && (
|
||||||
|
<FilterDropdownItem
|
||||||
|
filterTitle="Sales Channel"
|
||||||
|
options={
|
||||||
|
sales_channels?.map((salesChannel) => ({
|
||||||
|
value: salesChannel.id,
|
||||||
|
label: salesChannel.name,
|
||||||
|
})) || []
|
||||||
|
}
|
||||||
|
isLoading={isLoadingSalesChannels}
|
||||||
|
filters={tempState.salesChannel.filter}
|
||||||
|
open={tempState.salesChannel.open}
|
||||||
|
setFilter={(v) => setSingleFilter("salesChannel", v)}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
<FilterDropdownItem
|
<FilterDropdownItem
|
||||||
filterTitle="Date"
|
filterTitle="Date"
|
||||||
options={dateFilters}
|
options={dateFilters}
|
||||||
|
|||||||
@@ -33,7 +33,9 @@ const OrderTable = ({ setContextFilters }: OrderTableProps) => {
|
|||||||
|
|
||||||
let hiddenColumns = ["sales_channel"]
|
let hiddenColumns = ["sales_channel"]
|
||||||
if (isFeatureEnabled("sales_channels")) {
|
if (isFeatureEnabled("sales_channels")) {
|
||||||
|
if (!defaultQueryProps.expand.includes("sales_channel")) {
|
||||||
defaultQueryProps.expand = defaultQueryProps.expand + ",sales_channel"
|
defaultQueryProps.expand = defaultQueryProps.expand + ",sales_channel"
|
||||||
|
}
|
||||||
hiddenColumns = []
|
hiddenColumns = []
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,10 @@ interface OrderFilterState {
|
|||||||
open: boolean
|
open: boolean
|
||||||
filter: null | string[] | string
|
filter: null | string[] | string
|
||||||
}
|
}
|
||||||
|
salesChannel: {
|
||||||
|
open: boolean
|
||||||
|
filter: null | string[] | string
|
||||||
|
}
|
||||||
status: {
|
status: {
|
||||||
open: boolean
|
open: boolean
|
||||||
filter: null | string[] | string
|
filter: null | string[] | string
|
||||||
@@ -94,6 +98,7 @@ const reducer = (
|
|||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
region: action.payload.region,
|
region: action.payload.region,
|
||||||
|
salesChannel: action.payload.salesChannel,
|
||||||
fulfillment: action.payload.fulfillment,
|
fulfillment: action.payload.fulfillment,
|
||||||
payment: action.payload.payment,
|
payment: action.payload.payment,
|
||||||
status: action.payload.status,
|
status: action.payload.status,
|
||||||
@@ -236,6 +241,10 @@ export const useOrderFilters = (
|
|||||||
open: false,
|
open: false,
|
||||||
filter: null,
|
filter: null,
|
||||||
},
|
},
|
||||||
|
salesChannel: {
|
||||||
|
open: false,
|
||||||
|
filter: null,
|
||||||
|
},
|
||||||
date: {
|
date: {
|
||||||
open: false,
|
open: false,
|
||||||
filter: null,
|
filter: null,
|
||||||
@@ -414,6 +423,7 @@ export const useOrderFilters = (
|
|||||||
const clean = omit(repObj, ["limit", "offset"])
|
const clean = omit(repObj, ["limit", "offset"])
|
||||||
const repString = qs.stringify(clean, { skipNulls: true })
|
const repString = qs.stringify(clean, { skipNulls: true })
|
||||||
|
|
||||||
|
|
||||||
const storedString = localStorage.getItem("orders::filters")
|
const storedString = localStorage.getItem("orders::filters")
|
||||||
|
|
||||||
let existing: null | object = null
|
let existing: null | object = null
|
||||||
@@ -499,10 +509,12 @@ const filterStateMap = {
|
|||||||
payment_status: "payment",
|
payment_status: "payment",
|
||||||
created_at: "date",
|
created_at: "date",
|
||||||
region_id: "region",
|
region_id: "region",
|
||||||
|
sales_channel_id: "salesChannel",
|
||||||
}
|
}
|
||||||
|
|
||||||
const stateFilterMap = {
|
const stateFilterMap = {
|
||||||
region: "region_id",
|
region: "region_id",
|
||||||
|
salesChannel: "sales_channel_id",
|
||||||
status: "status",
|
status: "status",
|
||||||
fulfillment: "fulfillment_status",
|
fulfillment: "fulfillment_status",
|
||||||
payment: "payment_status",
|
payment: "payment_status",
|
||||||
@@ -526,6 +538,10 @@ const parseQueryString = (
|
|||||||
open: false,
|
open: false,
|
||||||
filter: null,
|
filter: null,
|
||||||
},
|
},
|
||||||
|
salesChannel: {
|
||||||
|
open: false,
|
||||||
|
filter: null,
|
||||||
|
},
|
||||||
payment: {
|
payment: {
|
||||||
open: false,
|
open: false,
|
||||||
filter: null,
|
filter: null,
|
||||||
@@ -589,6 +605,15 @@ const parseQueryString = (
|
|||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
case "sales_channel_id": {
|
||||||
|
if (typeof value === "string" || Array.isArray(value)) {
|
||||||
|
defaultVal.salesChannel = {
|
||||||
|
open: true,
|
||||||
|
filter: value,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
case "payment_status": {
|
case "payment_status": {
|
||||||
if (typeof value === "string" || Array.isArray(value)) {
|
if (typeof value === "string" || Array.isArray(value)) {
|
||||||
defaultVal.payment = {
|
defaultVal.payment = {
|
||||||
|
|||||||
Reference in new issue
Block a user