@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.
- package/.medusa/server/src/admin/index.js +744 -742
- package/.medusa/server/src/admin/index.mjs +745 -743
- package/package.json +16 -31
|
@@ -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,
|
|
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:
|
|
352
|
+
baseUrl: backendUrl,
|
|
350
353
|
auth: {
|
|
351
|
-
type:
|
|
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:
|
|
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
|
|
10822
|
-
|
|
10823
|
-
|
|
10824
|
-
|
|
10825
|
-
|
|
10826
|
-
|
|
10827
|
-
|
|
10828
|
-
|
|
10829
|
-
|
|
10830
|
-
|
|
10831
|
-
|
|
10832
|
-
|
|
10833
|
-
|
|
10834
|
-
|
|
10835
|
-
|
|
10836
|
-
|
|
10837
|
-
|
|
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
|
-
|
|
10871
|
-
|
|
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 =
|
|
10874
|
-
return /* @__PURE__ */ jsxs(RouteDrawer, { children: [
|
|
10875
|
-
/* @__PURE__ */
|
|
10876
|
-
|
|
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
|
|
10883
|
-
const
|
|
10884
|
-
const
|
|
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
|
|
10887
|
-
const
|
|
10888
|
-
const
|
|
10889
|
-
|
|
10890
|
-
|
|
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
|
-
|
|
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
|
|
10895
|
-
|
|
10896
|
-
|
|
10802
|
+
const add = async (value) => {
|
|
10803
|
+
if (!value) {
|
|
10804
|
+
return;
|
|
10805
|
+
}
|
|
10806
|
+
addPromotions(
|
|
10897
10807
|
{
|
|
10898
|
-
|
|
10808
|
+
promo_codes: [value]
|
|
10899
10809
|
},
|
|
10900
10810
|
{
|
|
10901
|
-
|
|
10902
|
-
toast.
|
|
10903
|
-
|
|
10811
|
+
onError: (e) => {
|
|
10812
|
+
toast.error(e.message);
|
|
10813
|
+
comboboxData.onSearchValueChange("");
|
|
10814
|
+
setComboboxValue("");
|
|
10904
10815
|
},
|
|
10905
|
-
|
|
10906
|
-
|
|
10816
|
+
onSuccess: () => {
|
|
10817
|
+
comboboxData.onSearchValueChange("");
|
|
10818
|
+
setComboboxValue("");
|
|
10907
10819
|
}
|
|
10908
10820
|
}
|
|
10909
10821
|
);
|
|
10910
|
-
}
|
|
10911
|
-
const {
|
|
10912
|
-
|
|
10913
|
-
|
|
10914
|
-
|
|
10915
|
-
|
|
10916
|
-
|
|
10917
|
-
|
|
10918
|
-
|
|
10919
|
-
|
|
10920
|
-
|
|
10921
|
-
|
|
10922
|
-
}
|
|
10923
|
-
}
|
|
10924
|
-
|
|
10925
|
-
|
|
10926
|
-
|
|
10927
|
-
|
|
10928
|
-
|
|
10929
|
-
|
|
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__ */
|
|
10933
|
-
|
|
10934
|
-
|
|
10935
|
-
|
|
10936
|
-
|
|
10937
|
-
|
|
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(
|
|
11067
|
-
|
|
11068
|
-
|
|
11069
|
-
|
|
11070
|
-
|
|
11071
|
-
|
|
11072
|
-
|
|
11073
|
-
|
|
11074
|
-
|
|
11075
|
-
|
|
11076
|
-
|
|
11077
|
-
|
|
11078
|
-
|
|
11079
|
-
|
|
11080
|
-
|
|
11081
|
-
|
|
11082
|
-
|
|
11083
|
-
|
|
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
|
|
11099
|
-
|
|
11100
|
-
|
|
11101
|
-
|
|
11102
|
-
|
|
11103
|
-
|
|
11104
|
-
|
|
11105
|
-
|
|
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
|
|
11009
|
+
const Email = () => {
|
|
11449
11010
|
const { id } = useParams();
|
|
11450
|
-
const {
|
|
11451
|
-
|
|
11452
|
-
|
|
11453
|
-
|
|
11454
|
-
|
|
11455
|
-
|
|
11456
|
-
|
|
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$
|
|
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$
|
|
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$
|
|
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$
|
|
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
|
|
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
|
-
|
|
12448
|
+
"input",
|
|
12501
12449
|
{
|
|
12502
|
-
|
|
12503
|
-
|
|
12504
|
-
|
|
12505
|
-
|
|
12506
|
-
|
|
12507
|
-
|
|
12508
|
-
|
|
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
|
|
12536
|
-
|
|
12537
|
-
|
|
12538
|
-
|
|
12539
|
-
|
|
12540
|
-
|
|
12541
|
-
|
|
12542
|
-
|
|
12543
|
-
|
|
12544
|
-
|
|
12545
|
-
|
|
12546
|
-
|
|
12547
|
-
|
|
12548
|
-
|
|
12549
|
-
|
|
12550
|
-
|
|
12551
|
-
|
|
12552
|
-
|
|
12553
|
-
|
|
12554
|
-
|
|
12555
|
-
|
|
12556
|
-
|
|
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
|
};
|