@medusajs/draft-order 2.12.0-preview-20251103150145 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,7 +9,7 @@ import Medusa from "@medusajs/js-sdk";
9
9
  import { format, formatDistance, sub, subDays, subMonths } from "date-fns";
10
10
  import { enUS } from "date-fns/locale";
11
11
  import { zodResolver } from "@hookform/resolvers/zod";
12
- import { FormProvider, Controller, useFormContext, useFormState, useForm, useWatch, useFieldArray } from "react-hook-form";
12
+ import { FormProvider, useFormContext, useFormState, Controller, useForm, useWatch, useFieldArray } from "react-hook-form";
13
13
  import { Slot, Collapsible, Accordion } from "radix-ui";
14
14
  import { ComboboxProvider, Combobox as Combobox$1, ComboboxDisclosure, ComboboxPopover, ComboboxItem, ComboboxItemCheck, ComboboxItemValue, Separator } from "@ariakit/react";
15
15
  import { matchSorter } from "match-sorter";
@@ -345,10 +345,14 @@ const DataTableAction = ({
345
345
  }
346
346
  return /* @__PURE__ */ jsx(Button, { ...buttonProps, onClick: props.onClick, children: label });
347
347
  };
348
+ const backendUrl = __BACKEND_URL__ ?? "/";
349
+ const authType = __AUTH_TYPE__ ?? "session";
350
+ const jwtTokenStorageKey = __JWT_TOKEN_STORAGE_KEY__ || void 0;
348
351
  const sdk = new Medusa({
349
- baseUrl: __BACKEND_URL__ || "/",
352
+ baseUrl: backendUrl,
350
353
  auth: {
351
- type: "session"
354
+ type: authType,
355
+ jwtTokenStorageKey
352
356
  }
353
357
  });
354
358
  const CUSTOMER_QUERY_KEY = "customers";
@@ -4647,9 +4651,6 @@ ZodReadonly.create = (type, params) => {
4647
4651
  ...processCreateParams(params)
4648
4652
  });
4649
4653
  };
4650
- ({
4651
- object: ZodObject.lazycreate
4652
- });
4653
4654
  var ZodFirstPartyTypeKind;
4654
4655
  (function(ZodFirstPartyTypeKind2) {
4655
4656
  ZodFirstPartyTypeKind2["ZodString"] = "ZodString";
@@ -4696,7 +4697,6 @@ const anyType = ZodAny.create;
4696
4697
  ZodNever.create;
4697
4698
  const arrayType = ZodArray.create;
4698
4699
  const objectType = ZodObject.create;
4699
- ZodObject.strictCreate;
4700
4700
  const unionType = ZodUnion.create;
4701
4701
  ZodIntersection.create;
4702
4702
  ZodTuple.create;
@@ -8722,7 +8722,7 @@ const Contact = ({ order }) => {
8722
8722
  children: phone
8723
8723
  }
8724
8724
  ),
8725
- /* @__PURE__ */ jsx("div", { className: "flex justify-end", children: /* @__PURE__ */ jsx(Copy, { content: email, className: "text-ui-fg-muted" }) })
8725
+ /* @__PURE__ */ jsx("div", { className: "flex justify-end", children: /* @__PURE__ */ jsx(Copy, { content: phone, className: "text-ui-fg-muted" }) })
8726
8726
  ] })
8727
8727
  ] })
8728
8728
  ] });
@@ -9755,95 +9755,6 @@ const BillingAddressForm = ({ order }) => {
9755
9755
  ) });
9756
9756
  };
9757
9757
  const schema$5 = addressSchema;
9758
- const CustomItems = () => {
9759
- return /* @__PURE__ */ jsxs(RouteDrawer, { children: [
9760
- /* @__PURE__ */ jsx(RouteDrawer.Header, { children: /* @__PURE__ */ jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsx(Heading, { children: "Edit Custom Items" }) }) }),
9761
- /* @__PURE__ */ jsx(CustomItemsForm, {})
9762
- ] });
9763
- };
9764
- const CustomItemsForm = () => {
9765
- const form = useForm({
9766
- resolver: zodResolver(schema$4)
9767
- });
9768
- return /* @__PURE__ */ jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxs(KeyboundForm, { className: "flex flex-1 flex-col", children: [
9769
- /* @__PURE__ */ jsx(RouteDrawer.Body, {}),
9770
- /* @__PURE__ */ jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-2", children: [
9771
- /* @__PURE__ */ jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsx(Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
9772
- /* @__PURE__ */ jsx(Button, { size: "small", type: "submit", children: "Save" })
9773
- ] }) })
9774
- ] }) });
9775
- };
9776
- const schema$4 = objectType({
9777
- email: stringType().email()
9778
- });
9779
- const Email = () => {
9780
- const { id } = useParams();
9781
- const { order, isPending, isError, error } = useOrder(id, {
9782
- fields: "+email"
9783
- });
9784
- if (isError) {
9785
- throw error;
9786
- }
9787
- const isReady = !isPending && !!order;
9788
- return /* @__PURE__ */ jsxs(RouteDrawer, { children: [
9789
- /* @__PURE__ */ jsxs(RouteDrawer.Header, { children: [
9790
- /* @__PURE__ */ jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsx(Heading, { children: "Edit Email" }) }),
9791
- /* @__PURE__ */ jsx(RouteDrawer.Description, { asChild: true, children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Edit the email for the draft order" }) })
9792
- ] }),
9793
- isReady && /* @__PURE__ */ jsx(EmailForm, { order })
9794
- ] });
9795
- };
9796
- const EmailForm = ({ order }) => {
9797
- const form = useForm({
9798
- defaultValues: {
9799
- email: order.email ?? ""
9800
- },
9801
- resolver: zodResolver(schema$3)
9802
- });
9803
- const { mutateAsync, isPending } = useUpdateDraftOrder(order.id);
9804
- const { handleSuccess } = useRouteModal();
9805
- const onSubmit = form.handleSubmit(async (data) => {
9806
- await mutateAsync(
9807
- { email: data.email },
9808
- {
9809
- onSuccess: () => {
9810
- handleSuccess();
9811
- },
9812
- onError: (error) => {
9813
- toast.error(error.message);
9814
- }
9815
- }
9816
- );
9817
- });
9818
- return /* @__PURE__ */ jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxs(
9819
- KeyboundForm,
9820
- {
9821
- className: "flex flex-1 flex-col overflow-hidden",
9822
- onSubmit,
9823
- children: [
9824
- /* @__PURE__ */ jsx(RouteDrawer.Body, { className: "flex flex-col gap-y-6 overflow-y-auto", children: /* @__PURE__ */ jsx(
9825
- Form$2.Field,
9826
- {
9827
- control: form.control,
9828
- name: "email",
9829
- render: ({ field }) => /* @__PURE__ */ jsxs(Form$2.Item, { children: [
9830
- /* @__PURE__ */ jsx(Form$2.Label, { children: "Email" }),
9831
- /* @__PURE__ */ jsx(Form$2.Control, { children: /* @__PURE__ */ jsx(Input, { ...field }) }),
9832
- /* @__PURE__ */ jsx(Form$2.ErrorMessage, {})
9833
- ] })
9834
- }
9835
- ) }),
9836
- /* @__PURE__ */ jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-2", children: [
9837
- /* @__PURE__ */ jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsx(Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
9838
- /* @__PURE__ */ jsx(Button, { size: "small", type: "submit", isLoading: isPending, children: "Save" })
9839
- ] }) })
9840
- ]
9841
- }
9842
- ) });
9843
- };
9844
- const schema$3 = objectType({
9845
- email: stringType().email()
9846
- });
9847
9758
  const NumberInput = forwardRef(
9848
9759
  ({
9849
9760
  value,
@@ -10818,536 +10729,186 @@ const customItemSchema = objectType({
10818
10729
  quantity: numberType(),
10819
10730
  unit_price: unionType([numberType(), stringType()])
10820
10731
  });
10821
- const InlineTip = forwardRef(
10822
- ({ variant = "tip", label, className, children, ...props }, ref) => {
10823
- const labelValue = label || (variant === "warning" ? "Warning" : "Tip");
10824
- return /* @__PURE__ */ jsxs(
10825
- "div",
10826
- {
10827
- ref,
10828
- className: clx(
10829
- "bg-ui-bg-component txt-small text-ui-fg-subtle grid grid-cols-[4px_1fr] items-start gap-3 rounded-lg border p-3",
10830
- className
10831
- ),
10832
- ...props,
10833
- children: [
10834
- /* @__PURE__ */ jsx(
10835
- "div",
10836
- {
10837
- role: "presentation",
10838
- className: clx("w-4px bg-ui-tag-neutral-icon h-full rounded-full", {
10839
- "bg-ui-tag-orange-icon": variant === "warning"
10840
- })
10841
- }
10842
- ),
10843
- /* @__PURE__ */ jsxs("div", { className: "text-pretty", children: [
10844
- /* @__PURE__ */ jsxs("strong", { className: "txt-small-plus text-ui-fg-base", children: [
10845
- labelValue,
10846
- ":"
10847
- ] }),
10848
- " ",
10849
- children
10850
- ] })
10851
- ]
10852
- }
10853
- );
10854
- }
10855
- );
10856
- InlineTip.displayName = "InlineTip";
10857
- const MetadataFieldSchema = objectType({
10858
- key: stringType(),
10859
- disabled: booleanType().optional(),
10860
- value: anyType()
10861
- });
10862
- const MetadataSchema = objectType({
10863
- metadata: arrayType(MetadataFieldSchema)
10864
- });
10865
- const Metadata = () => {
10866
- const { id } = useParams();
10867
- const { order, isPending, isError, error } = useOrder(id, {
10868
- fields: "metadata"
10732
+ const PROMOTION_QUERY_KEY = "promotions";
10733
+ const promotionsQueryKeys = {
10734
+ list: (query2) => [
10735
+ PROMOTION_QUERY_KEY,
10736
+ query2 ? query2 : void 0
10737
+ ],
10738
+ detail: (id, query2) => [
10739
+ PROMOTION_QUERY_KEY,
10740
+ id,
10741
+ query2 ? query2 : void 0
10742
+ ]
10743
+ };
10744
+ const usePromotions = (query2, options) => {
10745
+ const { data, ...rest } = useQuery({
10746
+ queryKey: promotionsQueryKeys.list(query2),
10747
+ queryFn: async () => sdk.admin.promotion.list(query2),
10748
+ ...options
10869
10749
  });
10870
- if (isError) {
10871
- throw error;
10750
+ return { ...data, ...rest };
10751
+ };
10752
+ const Promotions = () => {
10753
+ const { id } = useParams();
10754
+ const {
10755
+ order: preview,
10756
+ isError: isPreviewError,
10757
+ error: previewError
10758
+ } = useOrderPreview(id, void 0);
10759
+ useInitiateOrderEdit({ preview });
10760
+ const { onCancel } = useCancelOrderEdit({ preview });
10761
+ if (isPreviewError) {
10762
+ throw previewError;
10872
10763
  }
10873
- const isReady = !isPending && !!order;
10874
- return /* @__PURE__ */ jsxs(RouteDrawer, { children: [
10875
- /* @__PURE__ */ jsxs(RouteDrawer.Header, { children: [
10876
- /* @__PURE__ */ jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsx(Heading, { children: "Metadata" }) }),
10877
- /* @__PURE__ */ jsx(RouteDrawer.Description, { asChild: true, children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Add metadata to the draft order." }) })
10878
- ] }),
10879
- !isReady ? /* @__PURE__ */ jsx(PlaceholderInner, {}) : /* @__PURE__ */ jsx(MetadataForm, { orderId: id, metadata: order == null ? void 0 : order.metadata })
10764
+ const isReady = !!preview;
10765
+ return /* @__PURE__ */ jsxs(RouteDrawer, { onClose: onCancel, children: [
10766
+ /* @__PURE__ */ jsx(RouteDrawer.Header, { children: /* @__PURE__ */ jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsx(Heading, { children: "Edit Promotions" }) }) }),
10767
+ isReady && /* @__PURE__ */ jsx(PromotionForm, { preview })
10880
10768
  ] });
10881
10769
  };
10882
- const METADATA_KEY_LABEL_ID = "metadata-form-key-label";
10883
- const METADATA_VALUE_LABEL_ID = "metadata-form-value-label";
10884
- const MetadataForm = ({ orderId, metadata }) => {
10770
+ const PromotionForm = ({ preview }) => {
10771
+ const { items, shipping_methods } = preview;
10772
+ const [isSubmitting, setIsSubmitting] = useState(false);
10773
+ const [comboboxValue, setComboboxValue] = useState("");
10885
10774
  const { handleSuccess } = useRouteModal();
10886
- const hasUneditableRows = getHasUneditableRows(metadata);
10887
- const { mutateAsync, isPending } = useUpdateDraftOrder(orderId);
10888
- const form = useForm({
10889
- defaultValues: {
10890
- metadata: getDefaultValues(metadata)
10775
+ const { mutateAsync: addPromotions, isPending: isAddingPromotions } = useDraftOrderAddPromotions(preview.id);
10776
+ const promoIds = getPromotionIds(items, shipping_methods);
10777
+ const { promotions, isPending, isError, error } = usePromotions(
10778
+ {
10779
+ id: promoIds
10891
10780
  },
10892
- resolver: zodResolver(MetadataSchema)
10781
+ {
10782
+ enabled: !!promoIds.length
10783
+ }
10784
+ );
10785
+ const comboboxData = useComboboxData({
10786
+ queryKey: ["promotions", "combobox", promoIds],
10787
+ queryFn: async (params) => {
10788
+ return await sdk.admin.promotion.list({
10789
+ ...params,
10790
+ id: {
10791
+ $nin: promoIds
10792
+ }
10793
+ });
10794
+ },
10795
+ getOptions: (data) => {
10796
+ return data.promotions.map((promotion) => ({
10797
+ label: promotion.code,
10798
+ value: promotion.code
10799
+ }));
10800
+ }
10893
10801
  });
10894
- const handleSubmit = form.handleSubmit(async (data) => {
10895
- const parsedData = parseValues(data);
10896
- await mutateAsync(
10802
+ const add = async (value) => {
10803
+ if (!value) {
10804
+ return;
10805
+ }
10806
+ addPromotions(
10897
10807
  {
10898
- metadata: parsedData
10808
+ promo_codes: [value]
10899
10809
  },
10900
10810
  {
10901
- onSuccess: () => {
10902
- toast.success("Metadata updated");
10903
- handleSuccess();
10811
+ onError: (e) => {
10812
+ toast.error(e.message);
10813
+ comboboxData.onSearchValueChange("");
10814
+ setComboboxValue("");
10904
10815
  },
10905
- onError: (error) => {
10906
- toast.error(error.message);
10816
+ onSuccess: () => {
10817
+ comboboxData.onSearchValueChange("");
10818
+ setComboboxValue("");
10907
10819
  }
10908
10820
  }
10909
10821
  );
10910
- });
10911
- const { fields, insert, remove } = useFieldArray({
10912
- control: form.control,
10913
- name: "metadata"
10914
- });
10915
- function deleteRow(index) {
10916
- remove(index);
10917
- if (fields.length === 1) {
10918
- insert(0, {
10919
- key: "",
10920
- value: "",
10921
- disabled: false
10922
- });
10923
- }
10924
- }
10925
- function insertRow(index, position) {
10926
- insert(index + (position === "above" ? 0 : 1), {
10927
- key: "",
10928
- value: "",
10929
- disabled: false
10822
+ };
10823
+ const { mutateAsync: confirmOrderEdit } = useDraftOrderConfirmEdit(preview.id);
10824
+ const { mutateAsync: requestOrderEdit } = useOrderEditRequest(preview.id);
10825
+ const onSubmit = async () => {
10826
+ setIsSubmitting(true);
10827
+ let requestSucceeded = false;
10828
+ await requestOrderEdit(void 0, {
10829
+ onError: (e) => {
10830
+ toast.error(e.message);
10831
+ },
10832
+ onSuccess: () => {
10833
+ requestSucceeded = true;
10834
+ }
10835
+ });
10836
+ if (!requestSucceeded) {
10837
+ setIsSubmitting(false);
10838
+ return;
10839
+ }
10840
+ await confirmOrderEdit(void 0, {
10841
+ onError: (e) => {
10842
+ toast.error(e.message);
10843
+ },
10844
+ onSuccess: () => {
10845
+ handleSuccess();
10846
+ },
10847
+ onSettled: () => {
10848
+ setIsSubmitting(false);
10849
+ }
10930
10850
  });
10851
+ };
10852
+ if (isError) {
10853
+ throw error;
10931
10854
  }
10932
- return /* @__PURE__ */ jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxs(
10933
- KeyboundForm,
10934
- {
10935
- onSubmit: handleSubmit,
10936
- className: "flex flex-1 flex-col overflow-hidden",
10937
- children: [
10938
- /* @__PURE__ */ jsxs(RouteDrawer.Body, { className: "flex flex-1 flex-col gap-y-8 overflow-y-auto", children: [
10939
- /* @__PURE__ */ jsxs("div", { className: "bg-ui-bg-base shadow-elevation-card-rest grid grid-cols-1 divide-y rounded-lg", children: [
10940
- /* @__PURE__ */ jsxs("div", { className: "bg-ui-bg-subtle grid grid-cols-2 divide-x rounded-t-lg", children: [
10941
- /* @__PURE__ */ jsx("div", { className: "txt-compact-small-plus text-ui-fg-subtle px-2 py-1.5", children: /* @__PURE__ */ jsx("label", { id: METADATA_KEY_LABEL_ID, children: "Key" }) }),
10942
- /* @__PURE__ */ jsx("div", { className: "txt-compact-small-plus text-ui-fg-subtle px-2 py-1.5", children: /* @__PURE__ */ jsx("label", { id: METADATA_VALUE_LABEL_ID, children: "Value" }) })
10943
- ] }),
10944
- fields.map((field, index) => {
10945
- const isDisabled = field.disabled || false;
10946
- let placeholder = "-";
10947
- if (typeof field.value === "object") {
10948
- placeholder = "{ ... }";
10949
- }
10950
- if (Array.isArray(field.value)) {
10951
- placeholder = "[ ... ]";
10952
- }
10953
- return /* @__PURE__ */ jsx(
10954
- ConditionalTooltip,
10955
- {
10956
- showTooltip: isDisabled,
10957
- content: "This row is disabled because it contains non-primitive data.",
10958
- children: /* @__PURE__ */ jsxs("div", { className: "group/table relative", children: [
10959
- /* @__PURE__ */ jsxs(
10960
- "div",
10961
- {
10962
- className: clx("grid grid-cols-2 divide-x", {
10963
- "overflow-hidden rounded-b-lg": index === fields.length - 1
10964
- }),
10965
- children: [
10966
- /* @__PURE__ */ jsx(
10967
- Form$2.Field,
10968
- {
10969
- control: form.control,
10970
- name: `metadata.${index}.key`,
10971
- render: ({ field: field2 }) => {
10972
- return /* @__PURE__ */ jsx(Form$2.Item, { children: /* @__PURE__ */ jsx(Form$2.Control, { children: /* @__PURE__ */ jsx(
10973
- GridInput,
10974
- {
10975
- "aria-labelledby": METADATA_KEY_LABEL_ID,
10976
- ...field2,
10977
- disabled: isDisabled,
10978
- placeholder: "Key"
10979
- }
10980
- ) }) });
10981
- }
10982
- }
10983
- ),
10984
- /* @__PURE__ */ jsx(
10985
- Form$2.Field,
10986
- {
10987
- control: form.control,
10988
- name: `metadata.${index}.value`,
10989
- render: ({ field: { value, ...field2 } }) => {
10990
- return /* @__PURE__ */ jsx(Form$2.Item, { children: /* @__PURE__ */ jsx(Form$2.Control, { children: /* @__PURE__ */ jsx(
10991
- GridInput,
10992
- {
10993
- "aria-labelledby": METADATA_VALUE_LABEL_ID,
10994
- ...field2,
10995
- value: isDisabled ? placeholder : value,
10996
- disabled: isDisabled,
10997
- placeholder: "Value"
10998
- }
10999
- ) }) });
11000
- }
11001
- }
11002
- )
11003
- ]
11004
- }
11005
- ),
11006
- /* @__PURE__ */ jsxs(DropdownMenu, { children: [
11007
- /* @__PURE__ */ jsx(
11008
- DropdownMenu.Trigger,
11009
- {
11010
- className: clx(
11011
- "invisible absolute inset-y-0 -right-2.5 my-auto group-hover/table:visible data-[state='open']:visible",
11012
- {
11013
- hidden: isDisabled
11014
- }
11015
- ),
11016
- disabled: isDisabled,
11017
- asChild: true,
11018
- children: /* @__PURE__ */ jsx(IconButton, { size: "2xsmall", children: /* @__PURE__ */ jsx(EllipsisVertical, {}) })
11019
- }
11020
- ),
11021
- /* @__PURE__ */ jsxs(DropdownMenu.Content, { children: [
11022
- /* @__PURE__ */ jsxs(
11023
- DropdownMenu.Item,
11024
- {
11025
- className: "gap-x-2",
11026
- onClick: () => insertRow(index, "above"),
11027
- children: [
11028
- /* @__PURE__ */ jsx(ArrowUpMini, { className: "text-ui-fg-subtle" }),
11029
- "Insert row above"
11030
- ]
11031
- }
11032
- ),
11033
- /* @__PURE__ */ jsxs(
11034
- DropdownMenu.Item,
11035
- {
11036
- className: "gap-x-2",
11037
- onClick: () => insertRow(index, "below"),
11038
- children: [
11039
- /* @__PURE__ */ jsx(ArrowDownMini, { className: "text-ui-fg-subtle" }),
11040
- "Insert row below"
11041
- ]
11042
- }
11043
- ),
11044
- /* @__PURE__ */ jsx(DropdownMenu.Separator, {}),
11045
- /* @__PURE__ */ jsxs(
11046
- DropdownMenu.Item,
11047
- {
11048
- className: "gap-x-2",
11049
- onClick: () => deleteRow(index),
11050
- children: [
11051
- /* @__PURE__ */ jsx(Trash, { className: "text-ui-fg-subtle" }),
11052
- "Delete row"
11053
- ]
11054
- }
11055
- )
11056
- ] })
11057
- ] })
11058
- ] })
11059
- },
11060
- field.id
11061
- );
11062
- })
11063
- ] }),
11064
- hasUneditableRows && /* @__PURE__ */ jsx(InlineTip, { variant: "warning", label: "Some rows are disabled", children: "This object contains non-primitive metadata, such as arrays or objects, that can't be edited here. To edit the disabled rows, use the API directly." })
10855
+ return /* @__PURE__ */ jsxs(KeyboundForm, { className: "flex flex-1 flex-col", onSubmit, children: [
10856
+ /* @__PURE__ */ jsx(RouteDrawer.Body, { children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
10857
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3", children: [
10858
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
10859
+ /* @__PURE__ */ jsx(Label$1, { size: "small", weight: "plus", htmlFor: "promotion-combobox", children: "Apply promotions" }),
10860
+ /* @__PURE__ */ jsx(Hint$1, { id: "promotion-combobox-hint", children: "Manage promotions that should be applied to the order." })
11065
10861
  ] }),
11066
- /* @__PURE__ */ jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
11067
- /* @__PURE__ */ jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsx(Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
11068
- /* @__PURE__ */ jsx(Button, { size: "small", type: "submit", isLoading: isPending, children: "Save" })
11069
- ] }) })
11070
- ]
11071
- }
11072
- ) });
11073
- };
11074
- const GridInput = forwardRef(({ className, ...props }, ref) => {
11075
- return /* @__PURE__ */ jsx(
11076
- "input",
11077
- {
11078
- ref,
11079
- ...props,
11080
- autoComplete: "off",
11081
- className: clx(
11082
- "txt-compact-small text-ui-fg-base placeholder:text-ui-fg-muted disabled:text-ui-fg-disabled disabled:bg-ui-bg-base bg-transparent px-2 py-1.5 outline-none",
11083
- className
10862
+ /* @__PURE__ */ jsx(
10863
+ Combobox,
10864
+ {
10865
+ id: "promotion-combobox",
10866
+ "aria-describedby": "promotion-combobox-hint",
10867
+ isFetchingNextPage: comboboxData.isFetchingNextPage,
10868
+ fetchNextPage: comboboxData.fetchNextPage,
10869
+ options: comboboxData.options,
10870
+ onSearchValueChange: comboboxData.onSearchValueChange,
10871
+ searchValue: comboboxData.searchValue,
10872
+ disabled: comboboxData.disabled || isAddingPromotions,
10873
+ onChange: add,
10874
+ value: comboboxValue
10875
+ }
10876
+ )
10877
+ ] }),
10878
+ /* @__PURE__ */ jsx(Divider, { variant: "dashed" }),
10879
+ /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2", children: promotions == null ? void 0 : promotions.map((promotion) => /* @__PURE__ */ jsx(
10880
+ PromotionItem,
10881
+ {
10882
+ promotion,
10883
+ orderId: preview.id,
10884
+ isLoading: isPending
10885
+ },
10886
+ promotion.id
10887
+ )) })
10888
+ ] }) }),
10889
+ /* @__PURE__ */ jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-2", children: [
10890
+ /* @__PURE__ */ jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsx(Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
10891
+ /* @__PURE__ */ jsx(
10892
+ Button,
10893
+ {
10894
+ size: "small",
10895
+ type: "submit",
10896
+ isLoading: isSubmitting || isAddingPromotions,
10897
+ children: "Save"
10898
+ }
11084
10899
  )
11085
- }
11086
- );
11087
- });
11088
- GridInput.displayName = "MetadataForm.GridInput";
11089
- const PlaceholderInner = () => {
11090
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-col overflow-hidden", children: [
11091
- /* @__PURE__ */ jsx(RouteDrawer.Body, { children: /* @__PURE__ */ jsx(Skeleton, { className: "h-[148ox] w-full rounded-lg" }) }),
11092
- /* @__PURE__ */ jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
11093
- /* @__PURE__ */ jsx(Skeleton, { className: "h-7 w-12 rounded-md" }),
11094
- /* @__PURE__ */ jsx(Skeleton, { className: "h-7 w-12 rounded-md" })
11095
10900
  ] }) })
11096
10901
  ] });
11097
10902
  };
11098
- const EDITABLE_TYPES = ["string", "number", "boolean"];
11099
- function getDefaultValues(metadata) {
11100
- if (!metadata || !Object.keys(metadata).length) {
11101
- return [
11102
- {
11103
- key: "",
11104
- value: "",
11105
- disabled: false
11106
- }
11107
- ];
11108
- }
11109
- return Object.entries(metadata).map(([key, value]) => {
11110
- if (!EDITABLE_TYPES.includes(typeof value)) {
11111
- return {
11112
- key,
11113
- value,
11114
- disabled: true
11115
- };
11116
- }
11117
- let stringValue = value;
11118
- if (typeof value !== "string") {
11119
- stringValue = JSON.stringify(value);
11120
- }
11121
- return {
11122
- key,
11123
- value: stringValue,
11124
- original_key: key
11125
- };
11126
- });
11127
- }
11128
- function parseValues(values) {
11129
- const metadata = values.metadata;
11130
- const isEmpty = !metadata.length || metadata.length === 1 && !metadata[0].key && !metadata[0].value;
11131
- if (isEmpty) {
11132
- return null;
11133
- }
11134
- const update = {};
11135
- metadata.forEach((field) => {
11136
- let key = field.key;
11137
- let value = field.value;
11138
- const disabled = field.disabled;
11139
- if (!key || !value) {
11140
- return;
11141
- }
11142
- if (disabled) {
11143
- update[key] = value;
11144
- return;
11145
- }
11146
- key = key.trim();
11147
- value = value.trim();
11148
- if (value === "true") {
11149
- update[key] = true;
11150
- } else if (value === "false") {
11151
- update[key] = false;
11152
- } else {
11153
- const parsedNumber = parseFloat(value);
11154
- if (!isNaN(parsedNumber)) {
11155
- update[key] = parsedNumber;
11156
- } else {
11157
- update[key] = value;
11158
- }
11159
- }
11160
- });
11161
- return update;
11162
- }
11163
- function getHasUneditableRows(metadata) {
11164
- if (!metadata) {
11165
- return false;
11166
- }
11167
- return Object.values(metadata).some(
11168
- (value) => !EDITABLE_TYPES.includes(typeof value)
11169
- );
11170
- }
11171
- const PROMOTION_QUERY_KEY = "promotions";
11172
- const promotionsQueryKeys = {
11173
- list: (query2) => [
11174
- PROMOTION_QUERY_KEY,
11175
- query2 ? query2 : void 0
11176
- ],
11177
- detail: (id, query2) => [
11178
- PROMOTION_QUERY_KEY,
11179
- id,
11180
- query2 ? query2 : void 0
11181
- ]
11182
- };
11183
- const usePromotions = (query2, options) => {
11184
- const { data, ...rest } = useQuery({
11185
- queryKey: promotionsQueryKeys.list(query2),
11186
- queryFn: async () => sdk.admin.promotion.list(query2),
11187
- ...options
11188
- });
11189
- return { ...data, ...rest };
11190
- };
11191
- const Promotions = () => {
11192
- const { id } = useParams();
11193
- const {
11194
- order: preview,
11195
- isError: isPreviewError,
11196
- error: previewError
11197
- } = useOrderPreview(id, void 0);
11198
- useInitiateOrderEdit({ preview });
11199
- const { onCancel } = useCancelOrderEdit({ preview });
11200
- if (isPreviewError) {
11201
- throw previewError;
11202
- }
11203
- const isReady = !!preview;
11204
- return /* @__PURE__ */ jsxs(RouteDrawer, { onClose: onCancel, children: [
11205
- /* @__PURE__ */ jsx(RouteDrawer.Header, { children: /* @__PURE__ */ jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsx(Heading, { children: "Edit Promotions" }) }) }),
11206
- isReady && /* @__PURE__ */ jsx(PromotionForm, { preview })
11207
- ] });
11208
- };
11209
- const PromotionForm = ({ preview }) => {
11210
- const { items, shipping_methods } = preview;
11211
- const [isSubmitting, setIsSubmitting] = useState(false);
11212
- const [comboboxValue, setComboboxValue] = useState("");
11213
- const { handleSuccess } = useRouteModal();
11214
- const { mutateAsync: addPromotions, isPending: isAddingPromotions } = useDraftOrderAddPromotions(preview.id);
11215
- const promoIds = getPromotionIds(items, shipping_methods);
11216
- const { promotions, isPending, isError, error } = usePromotions(
11217
- {
11218
- id: promoIds
11219
- },
11220
- {
11221
- enabled: !!promoIds.length
11222
- }
11223
- );
11224
- const comboboxData = useComboboxData({
11225
- queryKey: ["promotions", "combobox", promoIds],
11226
- queryFn: async (params) => {
11227
- return await sdk.admin.promotion.list({
11228
- ...params,
11229
- id: {
11230
- $nin: promoIds
11231
- }
11232
- });
11233
- },
11234
- getOptions: (data) => {
11235
- return data.promotions.map((promotion) => ({
11236
- label: promotion.code,
11237
- value: promotion.code
11238
- }));
11239
- }
11240
- });
11241
- const add = async (value) => {
11242
- if (!value) {
11243
- return;
11244
- }
11245
- addPromotions(
11246
- {
11247
- promo_codes: [value]
11248
- },
11249
- {
11250
- onError: (e) => {
11251
- toast.error(e.message);
11252
- comboboxData.onSearchValueChange("");
11253
- setComboboxValue("");
11254
- },
11255
- onSuccess: () => {
11256
- comboboxData.onSearchValueChange("");
11257
- setComboboxValue("");
11258
- }
11259
- }
11260
- );
11261
- };
11262
- const { mutateAsync: confirmOrderEdit } = useDraftOrderConfirmEdit(preview.id);
11263
- const { mutateAsync: requestOrderEdit } = useOrderEditRequest(preview.id);
11264
- const onSubmit = async () => {
11265
- setIsSubmitting(true);
11266
- let requestSucceeded = false;
11267
- await requestOrderEdit(void 0, {
11268
- onError: (e) => {
11269
- toast.error(e.message);
11270
- },
11271
- onSuccess: () => {
11272
- requestSucceeded = true;
11273
- }
11274
- });
11275
- if (!requestSucceeded) {
11276
- setIsSubmitting(false);
11277
- return;
11278
- }
11279
- await confirmOrderEdit(void 0, {
11280
- onError: (e) => {
11281
- toast.error(e.message);
11282
- },
11283
- onSuccess: () => {
11284
- handleSuccess();
11285
- },
11286
- onSettled: () => {
11287
- setIsSubmitting(false);
11288
- }
11289
- });
11290
- };
11291
- if (isError) {
11292
- throw error;
11293
- }
11294
- return /* @__PURE__ */ jsxs(KeyboundForm, { className: "flex flex-1 flex-col", onSubmit, children: [
11295
- /* @__PURE__ */ jsx(RouteDrawer.Body, { children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
11296
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3", children: [
11297
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
11298
- /* @__PURE__ */ jsx(Label$1, { size: "small", weight: "plus", htmlFor: "promotion-combobox", children: "Apply promotions" }),
11299
- /* @__PURE__ */ jsx(Hint$1, { id: "promotion-combobox-hint", children: "Manage promotions that should be applied to the order." })
11300
- ] }),
11301
- /* @__PURE__ */ jsx(
11302
- Combobox,
11303
- {
11304
- id: "promotion-combobox",
11305
- "aria-describedby": "promotion-combobox-hint",
11306
- isFetchingNextPage: comboboxData.isFetchingNextPage,
11307
- fetchNextPage: comboboxData.fetchNextPage,
11308
- options: comboboxData.options,
11309
- onSearchValueChange: comboboxData.onSearchValueChange,
11310
- searchValue: comboboxData.searchValue,
11311
- disabled: comboboxData.disabled || isAddingPromotions,
11312
- onChange: add,
11313
- value: comboboxValue
11314
- }
11315
- )
11316
- ] }),
11317
- /* @__PURE__ */ jsx(Divider, { variant: "dashed" }),
11318
- /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2", children: promotions == null ? void 0 : promotions.map((promotion) => /* @__PURE__ */ jsx(
11319
- PromotionItem,
11320
- {
11321
- promotion,
11322
- orderId: preview.id,
11323
- isLoading: isPending
11324
- },
11325
- promotion.id
11326
- )) })
11327
- ] }) }),
11328
- /* @__PURE__ */ jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-2", children: [
11329
- /* @__PURE__ */ jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsx(Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
11330
- /* @__PURE__ */ jsx(
11331
- Button,
11332
- {
11333
- size: "small",
11334
- type: "submit",
11335
- isLoading: isSubmitting || isAddingPromotions,
11336
- children: "Save"
11337
- }
11338
- )
11339
- ] }) })
11340
- ] });
11341
- };
11342
- const PromotionItem = ({
11343
- promotion,
11344
- orderId,
11345
- isLoading
11346
- }) => {
11347
- var _a;
11348
- const { mutateAsync: removePromotions, isPending } = useDraftOrderRemovePromotions(orderId);
11349
- const onRemove = async () => {
11350
- removePromotions(
10903
+ const PromotionItem = ({
10904
+ promotion,
10905
+ orderId,
10906
+ isLoading
10907
+ }) => {
10908
+ var _a;
10909
+ const { mutateAsync: removePromotions, isPending } = useDraftOrderRemovePromotions(orderId);
10910
+ const onRemove = async () => {
10911
+ removePromotions(
11351
10912
  {
11352
10913
  promo_codes: [promotion.code]
11353
10914
  },
@@ -11445,15 +11006,83 @@ function getPromotionIds(items, shippingMethods) {
11445
11006
  }
11446
11007
  return Array.from(promotionIds);
11447
11008
  }
11448
- const SalesChannel = () => {
11009
+ const Email = () => {
11449
11010
  const { id } = useParams();
11450
- const { draft_order, isPending, isError, error } = useDraftOrder(
11451
- id,
11452
- {
11453
- fields: "+sales_channel_id"
11454
- },
11455
- {
11456
- enabled: !!id
11011
+ const { order, isPending, isError, error } = useOrder(id, {
11012
+ fields: "+email"
11013
+ });
11014
+ if (isError) {
11015
+ throw error;
11016
+ }
11017
+ const isReady = !isPending && !!order;
11018
+ return /* @__PURE__ */ jsxs(RouteDrawer, { children: [
11019
+ /* @__PURE__ */ jsxs(RouteDrawer.Header, { children: [
11020
+ /* @__PURE__ */ jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsx(Heading, { children: "Edit Email" }) }),
11021
+ /* @__PURE__ */ jsx(RouteDrawer.Description, { asChild: true, children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Edit the email for the draft order" }) })
11022
+ ] }),
11023
+ isReady && /* @__PURE__ */ jsx(EmailForm, { order })
11024
+ ] });
11025
+ };
11026
+ const EmailForm = ({ order }) => {
11027
+ const form = useForm({
11028
+ defaultValues: {
11029
+ email: order.email ?? ""
11030
+ },
11031
+ resolver: zodResolver(schema$4)
11032
+ });
11033
+ const { mutateAsync, isPending } = useUpdateDraftOrder(order.id);
11034
+ const { handleSuccess } = useRouteModal();
11035
+ const onSubmit = form.handleSubmit(async (data) => {
11036
+ await mutateAsync(
11037
+ { email: data.email },
11038
+ {
11039
+ onSuccess: () => {
11040
+ handleSuccess();
11041
+ },
11042
+ onError: (error) => {
11043
+ toast.error(error.message);
11044
+ }
11045
+ }
11046
+ );
11047
+ });
11048
+ return /* @__PURE__ */ jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxs(
11049
+ KeyboundForm,
11050
+ {
11051
+ className: "flex flex-1 flex-col overflow-hidden",
11052
+ onSubmit,
11053
+ children: [
11054
+ /* @__PURE__ */ jsx(RouteDrawer.Body, { className: "flex flex-col gap-y-6 overflow-y-auto", children: /* @__PURE__ */ jsx(
11055
+ Form$2.Field,
11056
+ {
11057
+ control: form.control,
11058
+ name: "email",
11059
+ render: ({ field }) => /* @__PURE__ */ jsxs(Form$2.Item, { children: [
11060
+ /* @__PURE__ */ jsx(Form$2.Label, { children: "Email" }),
11061
+ /* @__PURE__ */ jsx(Form$2.Control, { children: /* @__PURE__ */ jsx(Input, { ...field }) }),
11062
+ /* @__PURE__ */ jsx(Form$2.ErrorMessage, {})
11063
+ ] })
11064
+ }
11065
+ ) }),
11066
+ /* @__PURE__ */ jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-2", children: [
11067
+ /* @__PURE__ */ jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsx(Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
11068
+ /* @__PURE__ */ jsx(Button, { size: "small", type: "submit", isLoading: isPending, children: "Save" })
11069
+ ] }) })
11070
+ ]
11071
+ }
11072
+ ) });
11073
+ };
11074
+ const schema$4 = objectType({
11075
+ email: stringType().email()
11076
+ });
11077
+ const SalesChannel = () => {
11078
+ const { id } = useParams();
11079
+ const { draft_order, isPending, isError, error } = useDraftOrder(
11080
+ id,
11081
+ {
11082
+ fields: "+sales_channel_id"
11083
+ },
11084
+ {
11085
+ enabled: !!id
11457
11086
  }
11458
11087
  );
11459
11088
  if (isError) {
@@ -11473,7 +11102,7 @@ const SalesChannelForm = ({ order }) => {
11473
11102
  defaultValues: {
11474
11103
  sales_channel_id: order.sales_channel_id || ""
11475
11104
  },
11476
- resolver: zodResolver(schema$2)
11105
+ resolver: zodResolver(schema$3)
11477
11106
  });
11478
11107
  const { mutateAsync, isPending } = useUpdateDraftOrder(order.id);
11479
11108
  const { handleSuccess } = useRouteModal();
@@ -11548,7 +11177,7 @@ const SalesChannelField = ({ control, order }) => {
11548
11177
  }
11549
11178
  );
11550
11179
  };
11551
- const schema$2 = objectType({
11180
+ const schema$3 = objectType({
11552
11181
  sales_channel_id: stringType().min(1)
11553
11182
  });
11554
11183
  const ShippingAddress = () => {
@@ -11583,7 +11212,7 @@ const ShippingAddressForm = ({ order }) => {
11583
11212
  postal_code: ((_i = order.shipping_address) == null ? void 0 : _i.postal_code) ?? "",
11584
11213
  phone: ((_j = order.shipping_address) == null ? void 0 : _j.phone) ?? ""
11585
11214
  },
11586
- resolver: zodResolver(schema$1)
11215
+ resolver: zodResolver(schema$2)
11587
11216
  });
11588
11217
  const { mutateAsync, isPending } = useUpdateDraftOrder(order.id);
11589
11218
  const { handleSuccess } = useRouteModal();
@@ -11753,7 +11382,7 @@ const ShippingAddressForm = ({ order }) => {
11753
11382
  }
11754
11383
  ) });
11755
11384
  };
11756
- const schema$1 = addressSchema;
11385
+ const schema$2 = addressSchema;
11757
11386
  const STACKED_FOCUS_MODAL_ID = "shipping-form";
11758
11387
  const Shipping = () => {
11759
11388
  var _a;
@@ -12438,129 +12067,500 @@ const LocationField = ({ control, setValue }) => {
12438
12067
  /* @__PURE__ */ jsx(Form$2.Label, { children: "Location" }),
12439
12068
  /* @__PURE__ */ jsx(Form$2.Hint, { children: "Choose where you want to ship the items from." })
12440
12069
  ] }),
12441
- /* @__PURE__ */ jsx(Form$2.Control, { children: /* @__PURE__ */ jsx(
12442
- Combobox,
12443
- {
12444
- options: locations.options,
12445
- fetchNextPage: locations.fetchNextPage,
12446
- isFetchingNextPage: locations.isFetchingNextPage,
12447
- searchValue: locations.searchValue,
12448
- onSearchValueChange: locations.onSearchValueChange,
12449
- placeholder: "Select location",
12450
- onChange: (value) => {
12451
- setValue("shipping_option_id", "", {
12452
- shouldDirty: true,
12453
- shouldTouch: true
12454
- });
12455
- onChange(value);
12456
- },
12457
- ...field
12458
- }
12459
- ) })
12460
- ] }) });
12461
- }
12070
+ /* @__PURE__ */ jsx(Form$2.Control, { children: /* @__PURE__ */ jsx(
12071
+ Combobox,
12072
+ {
12073
+ options: locations.options,
12074
+ fetchNextPage: locations.fetchNextPage,
12075
+ isFetchingNextPage: locations.isFetchingNextPage,
12076
+ searchValue: locations.searchValue,
12077
+ onSearchValueChange: locations.onSearchValueChange,
12078
+ placeholder: "Select location",
12079
+ onChange: (value) => {
12080
+ setValue("shipping_option_id", "", {
12081
+ shouldDirty: true,
12082
+ shouldTouch: true
12083
+ });
12084
+ onChange(value);
12085
+ },
12086
+ ...field
12087
+ }
12088
+ ) })
12089
+ ] }) });
12090
+ }
12091
+ }
12092
+ );
12093
+ };
12094
+ const ShippingOptionField = ({
12095
+ shippingProfileId,
12096
+ preview,
12097
+ control
12098
+ }) => {
12099
+ var _a;
12100
+ const locationId = useWatch({ control, name: "location_id" });
12101
+ const shippingOptions = useComboboxData({
12102
+ queryKey: ["shipping_options", locationId, shippingProfileId],
12103
+ queryFn: async (params) => {
12104
+ return await sdk.admin.shippingOption.list({
12105
+ ...params,
12106
+ stock_location_id: locationId,
12107
+ shipping_profile_id: shippingProfileId
12108
+ });
12109
+ },
12110
+ getOptions: (data) => {
12111
+ return data.shipping_options.map((option) => {
12112
+ var _a2;
12113
+ if ((_a2 = option.rules) == null ? void 0 : _a2.find(
12114
+ (r) => r.attribute === "is_return" && r.value === "true"
12115
+ )) {
12116
+ return void 0;
12117
+ }
12118
+ return {
12119
+ label: option.name,
12120
+ value: option.id
12121
+ };
12122
+ }).filter(Boolean);
12123
+ },
12124
+ enabled: !!locationId && !!shippingProfileId,
12125
+ defaultValue: ((_a = preview.shipping_methods[0]) == null ? void 0 : _a.shipping_option_id) || void 0
12126
+ });
12127
+ const tooltipContent = !locationId && !shippingProfileId ? "Choose a location and shipping profile first." : !locationId ? "Choose a location first." : "Choose a shipping profile first.";
12128
+ return /* @__PURE__ */ jsx(
12129
+ Form$2.Field,
12130
+ {
12131
+ control,
12132
+ name: "shipping_option_id",
12133
+ render: ({ field }) => {
12134
+ return /* @__PURE__ */ jsx(Form$2.Item, { children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
12135
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
12136
+ /* @__PURE__ */ jsx(Form$2.Label, { children: "Shipping option" }),
12137
+ /* @__PURE__ */ jsx(Form$2.Hint, { children: "Choose the shipping option to use." })
12138
+ ] }),
12139
+ /* @__PURE__ */ jsx(
12140
+ ConditionalTooltip,
12141
+ {
12142
+ content: tooltipContent,
12143
+ showTooltip: !locationId || !shippingProfileId,
12144
+ children: /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Form$2.Control, { children: /* @__PURE__ */ jsx(
12145
+ Combobox,
12146
+ {
12147
+ options: shippingOptions.options,
12148
+ fetchNextPage: shippingOptions.fetchNextPage,
12149
+ isFetchingNextPage: shippingOptions.isFetchingNextPage,
12150
+ searchValue: shippingOptions.searchValue,
12151
+ onSearchValueChange: shippingOptions.onSearchValueChange,
12152
+ placeholder: "Select shipping option",
12153
+ ...field,
12154
+ disabled: !locationId || !shippingProfileId
12155
+ }
12156
+ ) }) })
12157
+ }
12158
+ )
12159
+ ] }) });
12160
+ }
12161
+ }
12162
+ );
12163
+ };
12164
+ const CustomAmountField = ({
12165
+ control,
12166
+ currencyCode
12167
+ }) => {
12168
+ return /* @__PURE__ */ jsx(
12169
+ Form$2.Field,
12170
+ {
12171
+ control,
12172
+ name: "custom_amount",
12173
+ render: ({ field: { onChange, ...field } }) => {
12174
+ return /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
12175
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
12176
+ /* @__PURE__ */ jsx(Form$2.Label, { optional: true, children: "Custom amount" }),
12177
+ /* @__PURE__ */ jsx(Form$2.Hint, { children: "Set a custom amount for the shipping option." })
12178
+ ] }),
12179
+ /* @__PURE__ */ jsx(Form$2.Control, { children: /* @__PURE__ */ jsx(
12180
+ CurrencyInput,
12181
+ {
12182
+ ...field,
12183
+ onValueChange: (value) => onChange(value),
12184
+ symbol: getNativeSymbol(currencyCode),
12185
+ code: currencyCode
12186
+ }
12187
+ ) })
12188
+ ] });
12189
+ }
12190
+ }
12191
+ );
12192
+ };
12193
+ const InlineTip = forwardRef(
12194
+ ({ variant = "tip", label, className, children, ...props }, ref) => {
12195
+ const labelValue = label || (variant === "warning" ? "Warning" : "Tip");
12196
+ return /* @__PURE__ */ jsxs(
12197
+ "div",
12198
+ {
12199
+ ref,
12200
+ className: clx(
12201
+ "bg-ui-bg-component txt-small text-ui-fg-subtle grid grid-cols-[4px_1fr] items-start gap-3 rounded-lg border p-3",
12202
+ className
12203
+ ),
12204
+ ...props,
12205
+ children: [
12206
+ /* @__PURE__ */ jsx(
12207
+ "div",
12208
+ {
12209
+ role: "presentation",
12210
+ className: clx("w-4px bg-ui-tag-neutral-icon h-full rounded-full", {
12211
+ "bg-ui-tag-orange-icon": variant === "warning"
12212
+ })
12213
+ }
12214
+ ),
12215
+ /* @__PURE__ */ jsxs("div", { className: "text-pretty", children: [
12216
+ /* @__PURE__ */ jsxs("strong", { className: "txt-small-plus text-ui-fg-base", children: [
12217
+ labelValue,
12218
+ ":"
12219
+ ] }),
12220
+ " ",
12221
+ children
12222
+ ] })
12223
+ ]
12224
+ }
12225
+ );
12226
+ }
12227
+ );
12228
+ InlineTip.displayName = "InlineTip";
12229
+ const MetadataFieldSchema = objectType({
12230
+ key: stringType(),
12231
+ disabled: booleanType().optional(),
12232
+ value: anyType()
12233
+ });
12234
+ const MetadataSchema = objectType({
12235
+ metadata: arrayType(MetadataFieldSchema)
12236
+ });
12237
+ const Metadata = () => {
12238
+ const { id } = useParams();
12239
+ const { order, isPending, isError, error } = useOrder(id, {
12240
+ fields: "metadata"
12241
+ });
12242
+ if (isError) {
12243
+ throw error;
12244
+ }
12245
+ const isReady = !isPending && !!order;
12246
+ return /* @__PURE__ */ jsxs(RouteDrawer, { children: [
12247
+ /* @__PURE__ */ jsxs(RouteDrawer.Header, { children: [
12248
+ /* @__PURE__ */ jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsx(Heading, { children: "Metadata" }) }),
12249
+ /* @__PURE__ */ jsx(RouteDrawer.Description, { asChild: true, children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Add metadata to the draft order." }) })
12250
+ ] }),
12251
+ !isReady ? /* @__PURE__ */ jsx(PlaceholderInner, {}) : /* @__PURE__ */ jsx(MetadataForm, { orderId: id, metadata: order == null ? void 0 : order.metadata })
12252
+ ] });
12253
+ };
12254
+ const METADATA_KEY_LABEL_ID = "metadata-form-key-label";
12255
+ const METADATA_VALUE_LABEL_ID = "metadata-form-value-label";
12256
+ const MetadataForm = ({ orderId, metadata }) => {
12257
+ const { handleSuccess } = useRouteModal();
12258
+ const hasUneditableRows = getHasUneditableRows(metadata);
12259
+ const { mutateAsync, isPending } = useUpdateDraftOrder(orderId);
12260
+ const form = useForm({
12261
+ defaultValues: {
12262
+ metadata: getDefaultValues(metadata)
12263
+ },
12264
+ resolver: zodResolver(MetadataSchema)
12265
+ });
12266
+ const handleSubmit = form.handleSubmit(async (data) => {
12267
+ const parsedData = parseValues(data);
12268
+ await mutateAsync(
12269
+ {
12270
+ metadata: parsedData
12271
+ },
12272
+ {
12273
+ onSuccess: () => {
12274
+ toast.success("Metadata updated");
12275
+ handleSuccess();
12276
+ },
12277
+ onError: (error) => {
12278
+ toast.error(error.message);
12279
+ }
12280
+ }
12281
+ );
12282
+ });
12283
+ const { fields, insert, remove } = useFieldArray({
12284
+ control: form.control,
12285
+ name: "metadata"
12286
+ });
12287
+ function deleteRow(index) {
12288
+ remove(index);
12289
+ if (fields.length === 1) {
12290
+ insert(0, {
12291
+ key: "",
12292
+ value: "",
12293
+ disabled: false
12294
+ });
12295
+ }
12296
+ }
12297
+ function insertRow(index, position) {
12298
+ insert(index + (position === "above" ? 0 : 1), {
12299
+ key: "",
12300
+ value: "",
12301
+ disabled: false
12302
+ });
12303
+ }
12304
+ return /* @__PURE__ */ jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxs(
12305
+ KeyboundForm,
12306
+ {
12307
+ onSubmit: handleSubmit,
12308
+ className: "flex flex-1 flex-col overflow-hidden",
12309
+ children: [
12310
+ /* @__PURE__ */ jsxs(RouteDrawer.Body, { className: "flex flex-1 flex-col gap-y-8 overflow-y-auto", children: [
12311
+ /* @__PURE__ */ jsxs("div", { className: "bg-ui-bg-base shadow-elevation-card-rest grid grid-cols-1 divide-y rounded-lg", children: [
12312
+ /* @__PURE__ */ jsxs("div", { className: "bg-ui-bg-subtle grid grid-cols-2 divide-x rounded-t-lg", children: [
12313
+ /* @__PURE__ */ jsx("div", { className: "txt-compact-small-plus text-ui-fg-subtle px-2 py-1.5", children: /* @__PURE__ */ jsx("label", { id: METADATA_KEY_LABEL_ID, children: "Key" }) }),
12314
+ /* @__PURE__ */ jsx("div", { className: "txt-compact-small-plus text-ui-fg-subtle px-2 py-1.5", children: /* @__PURE__ */ jsx("label", { id: METADATA_VALUE_LABEL_ID, children: "Value" }) })
12315
+ ] }),
12316
+ fields.map((field, index) => {
12317
+ const isDisabled = field.disabled || false;
12318
+ let placeholder = "-";
12319
+ if (typeof field.value === "object") {
12320
+ placeholder = "{ ... }";
12321
+ }
12322
+ if (Array.isArray(field.value)) {
12323
+ placeholder = "[ ... ]";
12324
+ }
12325
+ return /* @__PURE__ */ jsx(
12326
+ ConditionalTooltip,
12327
+ {
12328
+ showTooltip: isDisabled,
12329
+ content: "This row is disabled because it contains non-primitive data.",
12330
+ children: /* @__PURE__ */ jsxs("div", { className: "group/table relative", children: [
12331
+ /* @__PURE__ */ jsxs(
12332
+ "div",
12333
+ {
12334
+ className: clx("grid grid-cols-2 divide-x", {
12335
+ "overflow-hidden rounded-b-lg": index === fields.length - 1
12336
+ }),
12337
+ children: [
12338
+ /* @__PURE__ */ jsx(
12339
+ Form$2.Field,
12340
+ {
12341
+ control: form.control,
12342
+ name: `metadata.${index}.key`,
12343
+ render: ({ field: field2 }) => {
12344
+ return /* @__PURE__ */ jsx(Form$2.Item, { children: /* @__PURE__ */ jsx(Form$2.Control, { children: /* @__PURE__ */ jsx(
12345
+ GridInput,
12346
+ {
12347
+ "aria-labelledby": METADATA_KEY_LABEL_ID,
12348
+ ...field2,
12349
+ disabled: isDisabled,
12350
+ placeholder: "Key"
12351
+ }
12352
+ ) }) });
12353
+ }
12354
+ }
12355
+ ),
12356
+ /* @__PURE__ */ jsx(
12357
+ Form$2.Field,
12358
+ {
12359
+ control: form.control,
12360
+ name: `metadata.${index}.value`,
12361
+ render: ({ field: { value, ...field2 } }) => {
12362
+ return /* @__PURE__ */ jsx(Form$2.Item, { children: /* @__PURE__ */ jsx(Form$2.Control, { children: /* @__PURE__ */ jsx(
12363
+ GridInput,
12364
+ {
12365
+ "aria-labelledby": METADATA_VALUE_LABEL_ID,
12366
+ ...field2,
12367
+ value: isDisabled ? placeholder : value,
12368
+ disabled: isDisabled,
12369
+ placeholder: "Value"
12370
+ }
12371
+ ) }) });
12372
+ }
12373
+ }
12374
+ )
12375
+ ]
12376
+ }
12377
+ ),
12378
+ /* @__PURE__ */ jsxs(DropdownMenu, { children: [
12379
+ /* @__PURE__ */ jsx(
12380
+ DropdownMenu.Trigger,
12381
+ {
12382
+ className: clx(
12383
+ "invisible absolute inset-y-0 -right-2.5 my-auto group-hover/table:visible data-[state='open']:visible",
12384
+ {
12385
+ hidden: isDisabled
12386
+ }
12387
+ ),
12388
+ disabled: isDisabled,
12389
+ asChild: true,
12390
+ children: /* @__PURE__ */ jsx(IconButton, { size: "2xsmall", children: /* @__PURE__ */ jsx(EllipsisVertical, {}) })
12391
+ }
12392
+ ),
12393
+ /* @__PURE__ */ jsxs(DropdownMenu.Content, { children: [
12394
+ /* @__PURE__ */ jsxs(
12395
+ DropdownMenu.Item,
12396
+ {
12397
+ className: "gap-x-2",
12398
+ onClick: () => insertRow(index, "above"),
12399
+ children: [
12400
+ /* @__PURE__ */ jsx(ArrowUpMini, { className: "text-ui-fg-subtle" }),
12401
+ "Insert row above"
12402
+ ]
12403
+ }
12404
+ ),
12405
+ /* @__PURE__ */ jsxs(
12406
+ DropdownMenu.Item,
12407
+ {
12408
+ className: "gap-x-2",
12409
+ onClick: () => insertRow(index, "below"),
12410
+ children: [
12411
+ /* @__PURE__ */ jsx(ArrowDownMini, { className: "text-ui-fg-subtle" }),
12412
+ "Insert row below"
12413
+ ]
12414
+ }
12415
+ ),
12416
+ /* @__PURE__ */ jsx(DropdownMenu.Separator, {}),
12417
+ /* @__PURE__ */ jsxs(
12418
+ DropdownMenu.Item,
12419
+ {
12420
+ className: "gap-x-2",
12421
+ onClick: () => deleteRow(index),
12422
+ children: [
12423
+ /* @__PURE__ */ jsx(Trash, { className: "text-ui-fg-subtle" }),
12424
+ "Delete row"
12425
+ ]
12426
+ }
12427
+ )
12428
+ ] })
12429
+ ] })
12430
+ ] })
12431
+ },
12432
+ field.id
12433
+ );
12434
+ })
12435
+ ] }),
12436
+ hasUneditableRows && /* @__PURE__ */ jsx(InlineTip, { variant: "warning", label: "Some rows are disabled", children: "This object contains non-primitive metadata, such as arrays or objects, that can't be edited here. To edit the disabled rows, use the API directly." })
12437
+ ] }),
12438
+ /* @__PURE__ */ jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
12439
+ /* @__PURE__ */ jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsx(Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
12440
+ /* @__PURE__ */ jsx(Button, { size: "small", type: "submit", isLoading: isPending, children: "Save" })
12441
+ ] }) })
12442
+ ]
12462
12443
  }
12463
- );
12444
+ ) });
12464
12445
  };
12465
- const ShippingOptionField = ({
12466
- shippingProfileId,
12467
- preview,
12468
- control
12469
- }) => {
12470
- var _a;
12471
- const locationId = useWatch({ control, name: "location_id" });
12472
- const shippingOptions = useComboboxData({
12473
- queryKey: ["shipping_options", locationId, shippingProfileId],
12474
- queryFn: async (params) => {
12475
- return await sdk.admin.shippingOption.list({
12476
- ...params,
12477
- stock_location_id: locationId,
12478
- shipping_profile_id: shippingProfileId
12479
- });
12480
- },
12481
- getOptions: (data) => {
12482
- return data.shipping_options.map((option) => {
12483
- var _a2;
12484
- if ((_a2 = option.rules) == null ? void 0 : _a2.find(
12485
- (r) => r.attribute === "is_return" && r.value === "true"
12486
- )) {
12487
- return void 0;
12488
- }
12489
- return {
12490
- label: option.name,
12491
- value: option.id
12492
- };
12493
- }).filter(Boolean);
12494
- },
12495
- enabled: !!locationId && !!shippingProfileId,
12496
- defaultValue: ((_a = preview.shipping_methods[0]) == null ? void 0 : _a.shipping_option_id) || void 0
12497
- });
12498
- const tooltipContent = !locationId && !shippingProfileId ? "Choose a location and shipping profile first." : !locationId ? "Choose a location first." : "Choose a shipping profile first.";
12446
+ const GridInput = forwardRef(({ className, ...props }, ref) => {
12499
12447
  return /* @__PURE__ */ jsx(
12500
- Form$2.Field,
12448
+ "input",
12501
12449
  {
12502
- control,
12503
- name: "shipping_option_id",
12504
- render: ({ field }) => {
12505
- return /* @__PURE__ */ jsx(Form$2.Item, { children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
12506
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
12507
- /* @__PURE__ */ jsx(Form$2.Label, { children: "Shipping option" }),
12508
- /* @__PURE__ */ jsx(Form$2.Hint, { children: "Choose the shipping option to use." })
12509
- ] }),
12510
- /* @__PURE__ */ jsx(
12511
- ConditionalTooltip,
12512
- {
12513
- content: tooltipContent,
12514
- showTooltip: !locationId || !shippingProfileId,
12515
- children: /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Form$2.Control, { children: /* @__PURE__ */ jsx(
12516
- Combobox,
12517
- {
12518
- options: shippingOptions.options,
12519
- fetchNextPage: shippingOptions.fetchNextPage,
12520
- isFetchingNextPage: shippingOptions.isFetchingNextPage,
12521
- searchValue: shippingOptions.searchValue,
12522
- onSearchValueChange: shippingOptions.onSearchValueChange,
12523
- placeholder: "Select shipping option",
12524
- ...field,
12525
- disabled: !locationId || !shippingProfileId
12526
- }
12527
- ) }) })
12528
- }
12529
- )
12530
- ] }) });
12531
- }
12450
+ ref,
12451
+ ...props,
12452
+ autoComplete: "off",
12453
+ className: clx(
12454
+ "txt-compact-small text-ui-fg-base placeholder:text-ui-fg-muted disabled:text-ui-fg-disabled disabled:bg-ui-bg-base bg-transparent px-2 py-1.5 outline-none",
12455
+ className
12456
+ )
12532
12457
  }
12533
12458
  );
12459
+ });
12460
+ GridInput.displayName = "MetadataForm.GridInput";
12461
+ const PlaceholderInner = () => {
12462
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-col overflow-hidden", children: [
12463
+ /* @__PURE__ */ jsx(RouteDrawer.Body, { children: /* @__PURE__ */ jsx(Skeleton, { className: "h-[148ox] w-full rounded-lg" }) }),
12464
+ /* @__PURE__ */ jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
12465
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-7 w-12 rounded-md" }),
12466
+ /* @__PURE__ */ jsx(Skeleton, { className: "h-7 w-12 rounded-md" })
12467
+ ] }) })
12468
+ ] });
12534
12469
  };
12535
- const CustomAmountField = ({
12536
- control,
12537
- currencyCode
12538
- }) => {
12539
- return /* @__PURE__ */ jsx(
12540
- Form$2.Field,
12541
- {
12542
- control,
12543
- name: "custom_amount",
12544
- render: ({ field: { onChange, ...field } }) => {
12545
- return /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
12546
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
12547
- /* @__PURE__ */ jsx(Form$2.Label, { optional: true, children: "Custom amount" }),
12548
- /* @__PURE__ */ jsx(Form$2.Hint, { children: "Set a custom amount for the shipping option." })
12549
- ] }),
12550
- /* @__PURE__ */ jsx(Form$2.Control, { children: /* @__PURE__ */ jsx(
12551
- CurrencyInput,
12552
- {
12553
- ...field,
12554
- onValueChange: (value) => onChange(value),
12555
- symbol: getNativeSymbol(currencyCode),
12556
- code: currencyCode
12557
- }
12558
- ) })
12559
- ] });
12470
+ const EDITABLE_TYPES = ["string", "number", "boolean"];
12471
+ function getDefaultValues(metadata) {
12472
+ if (!metadata || !Object.keys(metadata).length) {
12473
+ return [
12474
+ {
12475
+ key: "",
12476
+ value: "",
12477
+ disabled: false
12478
+ }
12479
+ ];
12480
+ }
12481
+ return Object.entries(metadata).map(([key, value]) => {
12482
+ if (!EDITABLE_TYPES.includes(typeof value)) {
12483
+ return {
12484
+ key,
12485
+ value,
12486
+ disabled: true
12487
+ };
12488
+ }
12489
+ let stringValue = value;
12490
+ if (typeof value !== "string") {
12491
+ stringValue = JSON.stringify(value);
12492
+ }
12493
+ return {
12494
+ key,
12495
+ value: stringValue,
12496
+ original_key: key
12497
+ };
12498
+ });
12499
+ }
12500
+ function parseValues(values) {
12501
+ const metadata = values.metadata;
12502
+ const isEmpty = !metadata.length || metadata.length === 1 && !metadata[0].key && !metadata[0].value;
12503
+ if (isEmpty) {
12504
+ return null;
12505
+ }
12506
+ const update = {};
12507
+ metadata.forEach((field) => {
12508
+ let key = field.key;
12509
+ let value = field.value;
12510
+ const disabled = field.disabled;
12511
+ if (!key || !value) {
12512
+ return;
12513
+ }
12514
+ if (disabled) {
12515
+ update[key] = value;
12516
+ return;
12517
+ }
12518
+ key = key.trim();
12519
+ value = value.trim();
12520
+ if (value === "true") {
12521
+ update[key] = true;
12522
+ } else if (value === "false") {
12523
+ update[key] = false;
12524
+ } else {
12525
+ const parsedNumber = parseFloat(value);
12526
+ if (!isNaN(parsedNumber)) {
12527
+ update[key] = parsedNumber;
12528
+ } else {
12529
+ update[key] = value;
12560
12530
  }
12561
12531
  }
12532
+ });
12533
+ return update;
12534
+ }
12535
+ function getHasUneditableRows(metadata) {
12536
+ if (!metadata) {
12537
+ return false;
12538
+ }
12539
+ return Object.values(metadata).some(
12540
+ (value) => !EDITABLE_TYPES.includes(typeof value)
12562
12541
  );
12542
+ }
12543
+ const CustomItems = () => {
12544
+ return /* @__PURE__ */ jsxs(RouteDrawer, { children: [
12545
+ /* @__PURE__ */ jsx(RouteDrawer.Header, { children: /* @__PURE__ */ jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsx(Heading, { children: "Edit Custom Items" }) }) }),
12546
+ /* @__PURE__ */ jsx(CustomItemsForm, {})
12547
+ ] });
12548
+ };
12549
+ const CustomItemsForm = () => {
12550
+ const form = useForm({
12551
+ resolver: zodResolver(schema$1)
12552
+ });
12553
+ return /* @__PURE__ */ jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxs(KeyboundForm, { className: "flex flex-1 flex-col", children: [
12554
+ /* @__PURE__ */ jsx(RouteDrawer.Body, {}),
12555
+ /* @__PURE__ */ jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-2", children: [
12556
+ /* @__PURE__ */ jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsx(Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
12557
+ /* @__PURE__ */ jsx(Button, { size: "small", type: "submit", children: "Save" })
12558
+ ] }) })
12559
+ ] }) });
12563
12560
  };
12561
+ const schema$1 = objectType({
12562
+ email: stringType().email()
12563
+ });
12564
12564
  const TransferOwnership = () => {
12565
12565
  const { id } = useParams();
12566
12566
  const { draft_order, isPending, isError, error } = useDraftOrder(id, {
@@ -13061,26 +13061,18 @@ const routeModule = {
13061
13061
  Component: BillingAddress,
13062
13062
  path: "/draft-orders/:id/billing-address"
13063
13063
  },
13064
- {
13065
- Component: CustomItems,
13066
- path: "/draft-orders/:id/custom-items"
13067
- },
13068
- {
13069
- Component: Email,
13070
- path: "/draft-orders/:id/email"
13071
- },
13072
13064
  {
13073
13065
  Component: Items,
13074
13066
  path: "/draft-orders/:id/items"
13075
13067
  },
13076
- {
13077
- Component: Metadata,
13078
- path: "/draft-orders/:id/metadata"
13079
- },
13080
13068
  {
13081
13069
  Component: Promotions,
13082
13070
  path: "/draft-orders/:id/promotions"
13083
13071
  },
13072
+ {
13073
+ Component: Email,
13074
+ path: "/draft-orders/:id/email"
13075
+ },
13084
13076
  {
13085
13077
  Component: SalesChannel,
13086
13078
  path: "/draft-orders/:id/sales-channel"
@@ -13093,6 +13085,14 @@ const routeModule = {
13093
13085
  Component: Shipping,
13094
13086
  path: "/draft-orders/:id/shipping"
13095
13087
  },
13088
+ {
13089
+ Component: Metadata,
13090
+ path: "/draft-orders/:id/metadata"
13091
+ },
13092
+ {
13093
+ Component: CustomItems,
13094
+ path: "/draft-orders/:id/custom-items"
13095
+ },
13096
13096
  {
13097
13097
  Component: TransferOwnership,
13098
13098
  path: "/draft-orders/:id/transfer-ownership"
@@ -13107,7 +13107,9 @@ const menuItemModule = {
13107
13107
  label: config.label,
13108
13108
  icon: void 0,
13109
13109
  path: "/draft-orders",
13110
- nested: "/orders"
13110
+ nested: "/orders",
13111
+ rank: void 0,
13112
+ translationNs: void 0
13111
13113
  }
13112
13114
  ]
13113
13115
  };