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)) + ) +}