diff --git a/packages/admin-next/dashboard/src/components/layout/settings-layout/settings-layout.tsx b/packages/admin-next/dashboard/src/components/layout/settings-layout/settings-layout.tsx
index b56e9007ff..563c3e54f9 100644
--- a/packages/admin-next/dashboard/src/components/layout/settings-layout/settings-layout.tsx
+++ b/packages/admin-next/dashboard/src/components/layout/settings-layout/settings-layout.tsx
@@ -53,10 +53,6 @@ const useSettingRoutes = (): NavItemProps[] => {
label: t("productTypes.domain"),
to: "/settings/product-types",
},
- {
- label: t("shippingProfile.domain"),
- to: "/settings/shipping-profiles",
- },
{
label: t("stockLocations.domain"),
to: "/settings/locations",
diff --git a/packages/admin-next/dashboard/src/i18n/translations/en.json b/packages/admin-next/dashboard/src/i18n/translations/en.json
index 38377f5fda..b22f0e042b 100644
--- a/packages/admin-next/dashboard/src/i18n/translations/en.json
+++ b/packages/admin-next/dashboard/src/i18n/translations/en.json
@@ -804,6 +804,14 @@
"shipping": "Shipping was successfully enabled."
}
},
+ "sidebar": {
+ "shippingConfiguration": "Shipping configuration",
+ "shippingProfiles": "Shipping profiles",
+ "shippingProfilesDesc": "Shipping rules for different types of products",
+ "shippingOptionTypes": "Shipping Option Types",
+ "shippingOptionTypesDesc": "Group options based on characteristic"
+
+ },
"salesChannels": {
"header": "Sales Channels",
"label": "Connected sales channels",
diff --git a/packages/admin-next/dashboard/src/providers/router-provider/route-map.tsx b/packages/admin-next/dashboard/src/providers/router-provider/route-map.tsx
index 3490690e97..b5dd9eb506 100644
--- a/packages/admin-next/dashboard/src/providers/router-provider/route-map.tsx
+++ b/packages/admin-next/dashboard/src/providers/router-provider/route-map.tsx
@@ -747,6 +747,48 @@ export const RouteMap: RouteObject[] = [
path: "create",
lazy: () => import("../../routes/locations/location-create"),
},
+ {
+ path: "shipping-profiles",
+ element: ,
+ handle: {
+ crumb: () => "Shipping Profiles",
+ },
+ children: [
+ {
+ path: "",
+ lazy: () =>
+ import(
+ "../../routes/shipping-profiles/shipping-profiles-list"
+ ),
+ children: [
+ {
+ path: "create",
+ lazy: () =>
+ import(
+ "../../routes/shipping-profiles/shipping-profile-create"
+ ),
+ },
+ ],
+ },
+ {
+ path: ":id",
+ handle: {
+ crumb: (data) => data.shipping_profile.name,
+ },
+ lazy: () =>
+ import(
+ "../../routes/shipping-profiles/shipping-profile-detail"
+ ),
+ },
+ ],
+ },
+ {
+ path: "shipping-option-types",
+ element: ,
+ handle: {
+ crumb: () => "Shipping Option Types",
+ },
+ },
{
path: ":location_id",
lazy: () => import("../../routes/locations/location-detail"),
@@ -900,38 +942,7 @@ export const RouteMap: RouteObject[] = [
},
],
},
- {
- path: "shipping-profiles",
- element: ,
- handle: {
- crumb: () => "Shipping Profiles",
- },
- children: [
- {
- path: "",
- lazy: () =>
- import(
- "../../routes/shipping-profiles/shipping-profiles-list"
- ),
- children: [
- {
- path: "create",
- lazy: () =>
- import(
- "../../routes/shipping-profiles/shipping-profile-create"
- ),
- },
- ],
- },
- {
- path: ":id",
- lazy: () =>
- import(
- "../../routes/shipping-profiles/shipping-profile-detail"
- ),
- },
- ],
- },
+
{
path: "publishable-api-keys",
element: ,
diff --git a/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/inventory-item-variants/variants-section.tsx b/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/inventory-item-variants/variants-section.tsx
index 06a0c7bbf5..c26e2c00d6 100644
--- a/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/inventory-item-variants/variants-section.tsx
+++ b/packages/admin-next/dashboard/src/routes/inventory/inventory-detail/components/inventory-item-variants/variants-section.tsx
@@ -48,7 +48,11 @@ export const InventoryItemVariantsSection = ({
size="2xsmall"
variant="transparent"
type="button"
- onClick={() => navigate(`/products/${variant.product.id}`)} // TODO: navigate to variant details when implemented
+ onClick={() =>
+ navigate(
+ `/products/${variant.product.id}/variants/${variant.id}`
+ )
+ }
>
diff --git a/packages/admin-next/dashboard/src/routes/locations/location-list/location-list.tsx b/packages/admin-next/dashboard/src/routes/locations/location-list/location-list.tsx
index ebb7f9a3aa..5c5f04cbd2 100644
--- a/packages/admin-next/dashboard/src/routes/locations/location-list/location-list.tsx
+++ b/packages/admin-next/dashboard/src/routes/locations/location-list/location-list.tsx
@@ -1,4 +1,7 @@
-import { Outlet, useLoaderData } from "react-router-dom"
+import { Outlet, useLoaderData, useNavigate } from "react-router-dom"
+import { Container, Heading, IconButton } from "@medusajs/ui"
+import { ArrowUpRightOnBox, Buildings, ShoppingBag } from "@medusajs/icons"
+import { useTranslation } from "react-i18next"
import { useStockLocations } from "../../../hooks/api/stock-locations"
import LocationListItem from "./components/location-list-item/location-list-item"
@@ -30,28 +33,105 @@ export function LocationList() {
}
return (
-
- {before.widgets.map((w, i) => {
- return (
-
-
+
+
+
+ {before.widgets.map((w, i) => {
+ return (
+
+
+
+ )
+ })}
+
+
+ {stockLocations.map((location) => (
+
+ ))}
- )
- })}
-
-
- {stockLocations.map((location) => (
-
- ))}
+ {after.widgets.map((w, i) => {
+ return (
+
+
+
+ )
+ })}
+
+
+
+
+
- {after.widgets.map((w, i) => {
- return (
-
-
-
- )
- })}
)
}
+
+const LinksSection = () => {
+ const { t } = useTranslation()
+ const navigate = useNavigate()
+
+ return (
+
+
+
+ {t("stockLocations.sidebar.shippingConfiguration")}
+
+
+
+
+
+
+
+
+
+
+
+ {t("stockLocations.sidebar.shippingProfiles")}
+
+
+ {t("stockLocations.sidebar.shippingProfilesDesc")}
+
+
+
navigate(`/settings/locations/shipping-profiles`)}
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {t("stockLocations.sidebar.shippingOptionTypes")}
+
+
+ {t("stockLocations.sidebar.shippingOptionTypesDesc")}
+
+
+
+ navigate(`/settings/locations/shipping-option-types`)
+ }
+ >
+
+
+
+
+
+
+ )
+}
diff --git a/packages/admin-next/dashboard/src/routes/product-variants/product-variant-detail/components/variant-prices-section/variant-prices-section.tsx b/packages/admin-next/dashboard/src/routes/product-variants/product-variant-detail/components/variant-prices-section/variant-prices-section.tsx
index a48df2fa65..a27070411a 100644
--- a/packages/admin-next/dashboard/src/routes/product-variants/product-variant-detail/components/variant-prices-section/variant-prices-section.tsx
+++ b/packages/admin-next/dashboard/src/routes/product-variants/product-variant-detail/components/variant-prices-section/variant-prices-section.tsx
@@ -51,7 +51,10 @@ export function VariantPricesSection({ variant }: VariantPricesSectionProps) {
{!hasPrices &&
}
{displayPrices.map((price) => {
return (
-
+
{price.currency_code.toUpperCase()}
diff --git a/packages/admin-next/dashboard/src/routes/shipping-profiles/shipping-profile-create/components/create-shipping-profile-form/create-shipping-profile-form.tsx b/packages/admin-next/dashboard/src/routes/shipping-profiles/shipping-profile-create/components/create-shipping-profile-form/create-shipping-profile-form.tsx
index 70652891dd..336f1683d4 100644
--- a/packages/admin-next/dashboard/src/routes/shipping-profiles/shipping-profile-create/components/create-shipping-profile-form/create-shipping-profile-form.tsx
+++ b/packages/admin-next/dashboard/src/routes/shipping-profiles/shipping-profile-create/components/create-shipping-profile-form/create-shipping-profile-form.tsx
@@ -6,8 +6,8 @@ import * as zod from "zod"
import { Form } from "../../../../../components/common/form"
import {
- RouteFocusModal,
- useRouteModal,
+ RouteFocusModal,
+ useRouteModal,
} from "../../../../../components/route-modal"
import { useCreateShippingProfile } from "../../../../../hooks/api/shipping-profiles"
@@ -45,7 +45,9 @@ export function CreateShippingProfileForm() {
dismissLabel: t("actions.close"),
})
- handleSuccess(`/settings/shipping-profiles/${shipping_profile.id}`)
+ handleSuccess(
+ `/settings/locations/shipping-profiles/${shipping_profile.id}`
+ )
},
onError: (error) => {
toast.error(t("general.error"), {
diff --git a/packages/admin-next/dashboard/src/routes/shipping-profiles/shipping-profile-detail/components/shipping-profile-general-section/shipping-profile-general-section.tsx b/packages/admin-next/dashboard/src/routes/shipping-profiles/shipping-profile-detail/components/shipping-profile-general-section/shipping-profile-general-section.tsx
index 9eac64407e..05ce6e10c5 100644
--- a/packages/admin-next/dashboard/src/routes/shipping-profiles/shipping-profile-detail/components/shipping-profile-general-section/shipping-profile-general-section.tsx
+++ b/packages/admin-next/dashboard/src/routes/shipping-profiles/shipping-profile-detail/components/shipping-profile-general-section/shipping-profile-general-section.tsx
@@ -45,7 +45,7 @@ export const ShippingProfileGeneralSection = ({
dismissLabel: t("actions.close"),
})
- navigate("/settings/shipping-profiles", { replace: true })
+ navigate("/settings/locations/shipping-profiles", { replace: true })
},
onError: (error) => {
toast.error(t("general.error"), {
diff --git a/packages/admin-next/dashboard/src/routes/shipping-profiles/shipping-profile-detail/index.ts b/packages/admin-next/dashboard/src/routes/shipping-profiles/shipping-profile-detail/index.ts
index 2d352f3b8e..c3508861c8 100644
--- a/packages/admin-next/dashboard/src/routes/shipping-profiles/shipping-profile-detail/index.ts
+++ b/packages/admin-next/dashboard/src/routes/shipping-profiles/shipping-profile-detail/index.ts
@@ -1 +1,2 @@
+export { shippingProfileLoader as loader } from "./loader"
export { ShippingProfileDetail as Component } from "./shipping-profile-detail"
diff --git a/packages/admin-next/dashboard/src/routes/shipping-profiles/shipping-profile-detail/loader.ts b/packages/admin-next/dashboard/src/routes/shipping-profiles/shipping-profile-detail/loader.ts
new file mode 100644
index 0000000000..2c5115afc2
--- /dev/null
+++ b/packages/admin-next/dashboard/src/routes/shipping-profiles/shipping-profile-detail/loader.ts
@@ -0,0 +1,22 @@
+import { HttpTypes } from "@medusajs/types"
+import { LoaderFunctionArgs } from "react-router-dom"
+
+import { sdk } from "../../../lib/client"
+import { queryClient } from "../../../lib/query-client"
+import { shippingProfileQueryKeys } from "../../../hooks/api/shipping-profiles"
+
+const shippingProfileQuery = (id: string) => ({
+ queryKey: shippingProfileQueryKeys.detail(id),
+ queryFn: async () => sdk.admin.shippingProfile.retrieve(id),
+})
+
+export const shippingProfileLoader = async ({ params }: LoaderFunctionArgs) => {
+ const id = params.id
+ const query = shippingProfileQuery(id!)
+
+ return (
+ queryClient.getQueryData<{
+ shipping_profile: HttpTypes.AdminShippingProfile
+ }>(query.queryKey) ?? (await queryClient.fetchQuery(query))
+ )
+}