@medusajs/draft-order 3.0.0-snapshot-20251202134037 → 3.0.0-snapshot-20251202223100
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 +565 -565
- package/.medusa/server/src/admin/index.mjs +565 -565
- package/package.json +16 -16
|
@@ -10818,632 +10818,632 @@ const customItemSchema = objectType({
|
|
|
10818
10818
|
quantity: numberType(),
|
|
10819
10819
|
unit_price: unionType([numberType(), stringType()])
|
|
10820
10820
|
});
|
|
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"
|
|
10821
|
+
const PROMOTION_QUERY_KEY = "promotions";
|
|
10822
|
+
const promotionsQueryKeys = {
|
|
10823
|
+
list: (query2) => [
|
|
10824
|
+
PROMOTION_QUERY_KEY,
|
|
10825
|
+
query2 ? query2 : void 0
|
|
10826
|
+
],
|
|
10827
|
+
detail: (id, query2) => [
|
|
10828
|
+
PROMOTION_QUERY_KEY,
|
|
10829
|
+
id,
|
|
10830
|
+
query2 ? query2 : void 0
|
|
10831
|
+
]
|
|
10832
|
+
};
|
|
10833
|
+
const usePromotions = (query2, options) => {
|
|
10834
|
+
const { data, ...rest } = useQuery({
|
|
10835
|
+
queryKey: promotionsQueryKeys.list(query2),
|
|
10836
|
+
queryFn: async () => sdk.admin.promotion.list(query2),
|
|
10837
|
+
...options
|
|
10869
10838
|
});
|
|
10870
|
-
|
|
10871
|
-
|
|
10839
|
+
return { ...data, ...rest };
|
|
10840
|
+
};
|
|
10841
|
+
const Promotions = () => {
|
|
10842
|
+
const { id } = useParams();
|
|
10843
|
+
const {
|
|
10844
|
+
order: preview,
|
|
10845
|
+
isError: isPreviewError,
|
|
10846
|
+
error: previewError
|
|
10847
|
+
} = useOrderPreview(id, void 0);
|
|
10848
|
+
useInitiateOrderEdit({ preview });
|
|
10849
|
+
const { onCancel } = useCancelOrderEdit({ preview });
|
|
10850
|
+
if (isPreviewError) {
|
|
10851
|
+
throw previewError;
|
|
10872
10852
|
}
|
|
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 })
|
|
10853
|
+
const isReady = !!preview;
|
|
10854
|
+
return /* @__PURE__ */ jsxs(RouteDrawer, { onClose: onCancel, children: [
|
|
10855
|
+
/* @__PURE__ */ jsx(RouteDrawer.Header, { children: /* @__PURE__ */ jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsx(Heading, { children: "Edit Promotions" }) }) }),
|
|
10856
|
+
isReady && /* @__PURE__ */ jsx(PromotionForm, { preview })
|
|
10880
10857
|
] });
|
|
10881
10858
|
};
|
|
10882
|
-
const
|
|
10883
|
-
const
|
|
10884
|
-
const
|
|
10859
|
+
const PromotionForm = ({ preview }) => {
|
|
10860
|
+
const { items, shipping_methods } = preview;
|
|
10861
|
+
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
10862
|
+
const [comboboxValue, setComboboxValue] = useState("");
|
|
10885
10863
|
const { handleSuccess } = useRouteModal();
|
|
10886
|
-
const
|
|
10887
|
-
const
|
|
10888
|
-
const
|
|
10889
|
-
|
|
10890
|
-
|
|
10864
|
+
const { mutateAsync: addPromotions, isPending: isAddingPromotions } = useDraftOrderAddPromotions(preview.id);
|
|
10865
|
+
const promoIds = getPromotionIds(items, shipping_methods);
|
|
10866
|
+
const { promotions, isPending, isError, error } = usePromotions(
|
|
10867
|
+
{
|
|
10868
|
+
id: promoIds
|
|
10891
10869
|
},
|
|
10892
|
-
|
|
10870
|
+
{
|
|
10871
|
+
enabled: !!promoIds.length
|
|
10872
|
+
}
|
|
10873
|
+
);
|
|
10874
|
+
const comboboxData = useComboboxData({
|
|
10875
|
+
queryKey: ["promotions", "combobox", promoIds],
|
|
10876
|
+
queryFn: async (params) => {
|
|
10877
|
+
return await sdk.admin.promotion.list({
|
|
10878
|
+
...params,
|
|
10879
|
+
id: {
|
|
10880
|
+
$nin: promoIds
|
|
10881
|
+
}
|
|
10882
|
+
});
|
|
10883
|
+
},
|
|
10884
|
+
getOptions: (data) => {
|
|
10885
|
+
return data.promotions.map((promotion) => ({
|
|
10886
|
+
label: promotion.code,
|
|
10887
|
+
value: promotion.code
|
|
10888
|
+
}));
|
|
10889
|
+
}
|
|
10893
10890
|
});
|
|
10894
|
-
const
|
|
10895
|
-
|
|
10896
|
-
|
|
10891
|
+
const add = async (value) => {
|
|
10892
|
+
if (!value) {
|
|
10893
|
+
return;
|
|
10894
|
+
}
|
|
10895
|
+
addPromotions(
|
|
10897
10896
|
{
|
|
10898
|
-
|
|
10897
|
+
promo_codes: [value]
|
|
10899
10898
|
},
|
|
10900
10899
|
{
|
|
10901
|
-
|
|
10902
|
-
toast.
|
|
10903
|
-
|
|
10900
|
+
onError: (e) => {
|
|
10901
|
+
toast.error(e.message);
|
|
10902
|
+
comboboxData.onSearchValueChange("");
|
|
10903
|
+
setComboboxValue("");
|
|
10904
10904
|
},
|
|
10905
|
-
|
|
10906
|
-
|
|
10905
|
+
onSuccess: () => {
|
|
10906
|
+
comboboxData.onSearchValueChange("");
|
|
10907
|
+
setComboboxValue("");
|
|
10907
10908
|
}
|
|
10908
10909
|
}
|
|
10909
10910
|
);
|
|
10910
|
-
}
|
|
10911
|
-
const {
|
|
10912
|
-
|
|
10913
|
-
|
|
10914
|
-
|
|
10915
|
-
|
|
10916
|
-
|
|
10917
|
-
|
|
10918
|
-
|
|
10919
|
-
|
|
10920
|
-
|
|
10921
|
-
|
|
10922
|
-
}
|
|
10911
|
+
};
|
|
10912
|
+
const { mutateAsync: confirmOrderEdit } = useDraftOrderConfirmEdit(preview.id);
|
|
10913
|
+
const { mutateAsync: requestOrderEdit } = useOrderEditRequest(preview.id);
|
|
10914
|
+
const onSubmit = async () => {
|
|
10915
|
+
setIsSubmitting(true);
|
|
10916
|
+
let requestSucceeded = false;
|
|
10917
|
+
await requestOrderEdit(void 0, {
|
|
10918
|
+
onError: (e) => {
|
|
10919
|
+
toast.error(e.message);
|
|
10920
|
+
},
|
|
10921
|
+
onSuccess: () => {
|
|
10922
|
+
requestSucceeded = true;
|
|
10923
|
+
}
|
|
10924
|
+
});
|
|
10925
|
+
if (!requestSucceeded) {
|
|
10926
|
+
setIsSubmitting(false);
|
|
10927
|
+
return;
|
|
10923
10928
|
}
|
|
10924
|
-
|
|
10925
|
-
|
|
10926
|
-
|
|
10927
|
-
|
|
10928
|
-
|
|
10929
|
-
|
|
10929
|
+
await confirmOrderEdit(void 0, {
|
|
10930
|
+
onError: (e) => {
|
|
10931
|
+
toast.error(e.message);
|
|
10932
|
+
},
|
|
10933
|
+
onSuccess: () => {
|
|
10934
|
+
handleSuccess();
|
|
10935
|
+
},
|
|
10936
|
+
onSettled: () => {
|
|
10937
|
+
setIsSubmitting(false);
|
|
10938
|
+
}
|
|
10930
10939
|
});
|
|
10940
|
+
};
|
|
10941
|
+
if (isError) {
|
|
10942
|
+
throw error;
|
|
10931
10943
|
}
|
|
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." })
|
|
10944
|
+
return /* @__PURE__ */ jsxs(KeyboundForm, { className: "flex flex-1 flex-col", onSubmit, children: [
|
|
10945
|
+
/* @__PURE__ */ jsx(RouteDrawer.Body, { children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
|
|
10946
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3", children: [
|
|
10947
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
|
|
10948
|
+
/* @__PURE__ */ jsx(Label$1, { size: "small", weight: "plus", htmlFor: "promotion-combobox", children: "Apply promotions" }),
|
|
10949
|
+
/* @__PURE__ */ jsx(Hint$1, { id: "promotion-combobox-hint", children: "Manage promotions that should be applied to the order." })
|
|
11065
10950
|
] }),
|
|
11066
|
-
/* @__PURE__ */ jsx(
|
|
11067
|
-
|
|
11068
|
-
|
|
11069
|
-
|
|
11070
|
-
|
|
11071
|
-
|
|
11072
|
-
|
|
11073
|
-
|
|
11074
|
-
|
|
11075
|
-
|
|
11076
|
-
|
|
11077
|
-
|
|
11078
|
-
|
|
11079
|
-
|
|
11080
|
-
|
|
11081
|
-
|
|
11082
|
-
|
|
11083
|
-
|
|
10951
|
+
/* @__PURE__ */ jsx(
|
|
10952
|
+
Combobox,
|
|
10953
|
+
{
|
|
10954
|
+
id: "promotion-combobox",
|
|
10955
|
+
"aria-describedby": "promotion-combobox-hint",
|
|
10956
|
+
isFetchingNextPage: comboboxData.isFetchingNextPage,
|
|
10957
|
+
fetchNextPage: comboboxData.fetchNextPage,
|
|
10958
|
+
options: comboboxData.options,
|
|
10959
|
+
onSearchValueChange: comboboxData.onSearchValueChange,
|
|
10960
|
+
searchValue: comboboxData.searchValue,
|
|
10961
|
+
disabled: comboboxData.disabled || isAddingPromotions,
|
|
10962
|
+
onChange: add,
|
|
10963
|
+
value: comboboxValue
|
|
10964
|
+
}
|
|
10965
|
+
)
|
|
10966
|
+
] }),
|
|
10967
|
+
/* @__PURE__ */ jsx(Divider, { variant: "dashed" }),
|
|
10968
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2", children: promotions == null ? void 0 : promotions.map((promotion) => /* @__PURE__ */ jsx(
|
|
10969
|
+
PromotionItem,
|
|
10970
|
+
{
|
|
10971
|
+
promotion,
|
|
10972
|
+
orderId: preview.id,
|
|
10973
|
+
isLoading: isPending
|
|
10974
|
+
},
|
|
10975
|
+
promotion.id
|
|
10976
|
+
)) })
|
|
10977
|
+
] }) }),
|
|
10978
|
+
/* @__PURE__ */ jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-2", children: [
|
|
10979
|
+
/* @__PURE__ */ jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsx(Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
|
|
10980
|
+
/* @__PURE__ */ jsx(
|
|
10981
|
+
Button,
|
|
10982
|
+
{
|
|
10983
|
+
size: "small",
|
|
10984
|
+
type: "submit",
|
|
10985
|
+
isLoading: isSubmitting || isAddingPromotions,
|
|
10986
|
+
children: "Save"
|
|
10987
|
+
}
|
|
11084
10988
|
)
|
|
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
10989
|
] }) })
|
|
11096
10990
|
] });
|
|
11097
10991
|
};
|
|
11098
|
-
const
|
|
11099
|
-
|
|
11100
|
-
|
|
11101
|
-
|
|
10992
|
+
const PromotionItem = ({
|
|
10993
|
+
promotion,
|
|
10994
|
+
orderId,
|
|
10995
|
+
isLoading
|
|
10996
|
+
}) => {
|
|
10997
|
+
var _a;
|
|
10998
|
+
const { mutateAsync: removePromotions, isPending } = useDraftOrderRemovePromotions(orderId);
|
|
10999
|
+
const onRemove = async () => {
|
|
11000
|
+
removePromotions(
|
|
11102
11001
|
{
|
|
11103
|
-
|
|
11104
|
-
|
|
11105
|
-
|
|
11002
|
+
promo_codes: [promotion.code]
|
|
11003
|
+
},
|
|
11004
|
+
{
|
|
11005
|
+
onError: (e) => {
|
|
11006
|
+
toast.error(e.message);
|
|
11007
|
+
}
|
|
11106
11008
|
}
|
|
11107
|
-
|
|
11009
|
+
);
|
|
11010
|
+
};
|
|
11011
|
+
const displayValue = getDisplayValue(promotion);
|
|
11012
|
+
return /* @__PURE__ */ jsxs(
|
|
11013
|
+
"div",
|
|
11014
|
+
{
|
|
11015
|
+
className: clx(
|
|
11016
|
+
"bg-ui-bg-component shadow-elevation-card-rest flex items-center justify-between rounded-lg px-3 py-2",
|
|
11017
|
+
{
|
|
11018
|
+
"animate-pulse": isLoading
|
|
11019
|
+
}
|
|
11020
|
+
),
|
|
11021
|
+
children: [
|
|
11022
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
11023
|
+
/* @__PURE__ */ jsx(Text, { size: "small", weight: "plus", leading: "compact", children: promotion.code }),
|
|
11024
|
+
/* @__PURE__ */ jsxs("div", { className: "text-ui-fg-subtle flex items-center gap-1.5", children: [
|
|
11025
|
+
displayValue && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
11026
|
+
/* @__PURE__ */ jsx(Text, { size: "small", leading: "compact", children: displayValue }),
|
|
11027
|
+
/* @__PURE__ */ jsx(Text, { size: "small", leading: "compact", children: "·" })
|
|
11028
|
+
] }),
|
|
11029
|
+
/* @__PURE__ */ jsx(Text, { size: "small", leading: "compact", className: "capitalize", children: (_a = promotion.application_method) == null ? void 0 : _a.allocation })
|
|
11030
|
+
] })
|
|
11031
|
+
] }),
|
|
11032
|
+
/* @__PURE__ */ jsx(
|
|
11033
|
+
IconButton,
|
|
11034
|
+
{
|
|
11035
|
+
size: "small",
|
|
11036
|
+
type: "button",
|
|
11037
|
+
variant: "transparent",
|
|
11038
|
+
onClick: onRemove,
|
|
11039
|
+
isLoading: isPending || isLoading,
|
|
11040
|
+
children: /* @__PURE__ */ jsx(XMark, {})
|
|
11041
|
+
}
|
|
11042
|
+
)
|
|
11043
|
+
]
|
|
11044
|
+
},
|
|
11045
|
+
promotion.id
|
|
11046
|
+
);
|
|
11047
|
+
};
|
|
11048
|
+
function getDisplayValue(promotion) {
|
|
11049
|
+
var _a, _b, _c, _d;
|
|
11050
|
+
const value = (_a = promotion.application_method) == null ? void 0 : _a.value;
|
|
11051
|
+
if (!value) {
|
|
11052
|
+
return null;
|
|
11108
11053
|
}
|
|
11109
|
-
|
|
11110
|
-
|
|
11111
|
-
|
|
11112
|
-
|
|
11113
|
-
value,
|
|
11114
|
-
disabled: true
|
|
11115
|
-
};
|
|
11116
|
-
}
|
|
11117
|
-
let stringValue = value;
|
|
11118
|
-
if (typeof value !== "string") {
|
|
11119
|
-
stringValue = JSON.stringify(value);
|
|
11054
|
+
if (((_b = promotion.application_method) == null ? void 0 : _b.type) === "fixed") {
|
|
11055
|
+
const currency = (_c = promotion.application_method) == null ? void 0 : _c.currency_code;
|
|
11056
|
+
if (!currency) {
|
|
11057
|
+
return null;
|
|
11120
11058
|
}
|
|
11121
|
-
return
|
|
11122
|
-
|
|
11123
|
-
|
|
11124
|
-
|
|
11125
|
-
|
|
11126
|
-
});
|
|
11059
|
+
return getLocaleAmount(value, currency);
|
|
11060
|
+
} else if (((_d = promotion.application_method) == null ? void 0 : _d.type) === "percentage") {
|
|
11061
|
+
return formatPercentage(value);
|
|
11062
|
+
}
|
|
11063
|
+
return null;
|
|
11127
11064
|
}
|
|
11128
|
-
|
|
11129
|
-
|
|
11130
|
-
|
|
11131
|
-
|
|
11132
|
-
|
|
11065
|
+
const formatter = new Intl.NumberFormat([], {
|
|
11066
|
+
style: "percent",
|
|
11067
|
+
minimumFractionDigits: 2
|
|
11068
|
+
});
|
|
11069
|
+
const formatPercentage = (value, isPercentageValue = false) => {
|
|
11070
|
+
let val = value || 0;
|
|
11071
|
+
if (!isPercentageValue) {
|
|
11072
|
+
val = val / 100;
|
|
11133
11073
|
}
|
|
11134
|
-
|
|
11135
|
-
|
|
11136
|
-
|
|
11137
|
-
|
|
11138
|
-
|
|
11139
|
-
if (
|
|
11140
|
-
|
|
11141
|
-
|
|
11142
|
-
|
|
11143
|
-
|
|
11144
|
-
|
|
11074
|
+
return formatter.format(val);
|
|
11075
|
+
};
|
|
11076
|
+
function getPromotionIds(items, shippingMethods) {
|
|
11077
|
+
const promotionIds = /* @__PURE__ */ new Set();
|
|
11078
|
+
for (const item of items) {
|
|
11079
|
+
if (item.adjustments) {
|
|
11080
|
+
for (const adjustment of item.adjustments) {
|
|
11081
|
+
if (adjustment.promotion_id) {
|
|
11082
|
+
promotionIds.add(adjustment.promotion_id);
|
|
11083
|
+
}
|
|
11084
|
+
}
|
|
11145
11085
|
}
|
|
11146
|
-
|
|
11147
|
-
|
|
11148
|
-
if (
|
|
11149
|
-
|
|
11150
|
-
|
|
11151
|
-
|
|
11152
|
-
|
|
11153
|
-
const parsedNumber = parseFloat(value);
|
|
11154
|
-
if (!isNaN(parsedNumber)) {
|
|
11155
|
-
update[key] = parsedNumber;
|
|
11156
|
-
} else {
|
|
11157
|
-
update[key] = value;
|
|
11086
|
+
}
|
|
11087
|
+
for (const shippingMethod of shippingMethods) {
|
|
11088
|
+
if (shippingMethod.adjustments) {
|
|
11089
|
+
for (const adjustment of shippingMethod.adjustments) {
|
|
11090
|
+
if (adjustment.promotion_id) {
|
|
11091
|
+
promotionIds.add(adjustment.promotion_id);
|
|
11092
|
+
}
|
|
11158
11093
|
}
|
|
11159
11094
|
}
|
|
11160
|
-
});
|
|
11161
|
-
return update;
|
|
11162
|
-
}
|
|
11163
|
-
function getHasUneditableRows(metadata) {
|
|
11164
|
-
if (!metadata) {
|
|
11165
|
-
return false;
|
|
11166
11095
|
}
|
|
11167
|
-
return
|
|
11168
|
-
(value) => !EDITABLE_TYPES.includes(typeof value)
|
|
11169
|
-
);
|
|
11096
|
+
return Array.from(promotionIds);
|
|
11170
11097
|
}
|
|
11171
|
-
const
|
|
11172
|
-
|
|
11173
|
-
|
|
11174
|
-
|
|
11175
|
-
|
|
11176
|
-
|
|
11177
|
-
|
|
11178
|
-
|
|
11179
|
-
|
|
11180
|
-
|
|
11181
|
-
|
|
11182
|
-
|
|
11183
|
-
|
|
11184
|
-
|
|
11185
|
-
|
|
11186
|
-
|
|
11187
|
-
|
|
11188
|
-
|
|
11189
|
-
|
|
11190
|
-
}
|
|
11191
|
-
|
|
11098
|
+
const InlineTip = forwardRef(
|
|
11099
|
+
({ variant = "tip", label, className, children, ...props }, ref) => {
|
|
11100
|
+
const labelValue = label || (variant === "warning" ? "Warning" : "Tip");
|
|
11101
|
+
return /* @__PURE__ */ jsxs(
|
|
11102
|
+
"div",
|
|
11103
|
+
{
|
|
11104
|
+
ref,
|
|
11105
|
+
className: clx(
|
|
11106
|
+
"bg-ui-bg-component txt-small text-ui-fg-subtle grid grid-cols-[4px_1fr] items-start gap-3 rounded-lg border p-3",
|
|
11107
|
+
className
|
|
11108
|
+
),
|
|
11109
|
+
...props,
|
|
11110
|
+
children: [
|
|
11111
|
+
/* @__PURE__ */ jsx(
|
|
11112
|
+
"div",
|
|
11113
|
+
{
|
|
11114
|
+
role: "presentation",
|
|
11115
|
+
className: clx("w-4px bg-ui-tag-neutral-icon h-full rounded-full", {
|
|
11116
|
+
"bg-ui-tag-orange-icon": variant === "warning"
|
|
11117
|
+
})
|
|
11118
|
+
}
|
|
11119
|
+
),
|
|
11120
|
+
/* @__PURE__ */ jsxs("div", { className: "text-pretty", children: [
|
|
11121
|
+
/* @__PURE__ */ jsxs("strong", { className: "txt-small-plus text-ui-fg-base", children: [
|
|
11122
|
+
labelValue,
|
|
11123
|
+
":"
|
|
11124
|
+
] }),
|
|
11125
|
+
" ",
|
|
11126
|
+
children
|
|
11127
|
+
] })
|
|
11128
|
+
]
|
|
11129
|
+
}
|
|
11130
|
+
);
|
|
11131
|
+
}
|
|
11132
|
+
);
|
|
11133
|
+
InlineTip.displayName = "InlineTip";
|
|
11134
|
+
const MetadataFieldSchema = objectType({
|
|
11135
|
+
key: stringType(),
|
|
11136
|
+
disabled: booleanType().optional(),
|
|
11137
|
+
value: anyType()
|
|
11138
|
+
});
|
|
11139
|
+
const MetadataSchema = objectType({
|
|
11140
|
+
metadata: arrayType(MetadataFieldSchema)
|
|
11141
|
+
});
|
|
11142
|
+
const Metadata = () => {
|
|
11192
11143
|
const { id } = useParams();
|
|
11193
|
-
const {
|
|
11194
|
-
|
|
11195
|
-
|
|
11196
|
-
|
|
11197
|
-
|
|
11198
|
-
useInitiateOrderEdit({ preview });
|
|
11199
|
-
const { onCancel } = useCancelOrderEdit({ preview });
|
|
11200
|
-
if (isPreviewError) {
|
|
11201
|
-
throw previewError;
|
|
11144
|
+
const { order, isPending, isError, error } = useOrder(id, {
|
|
11145
|
+
fields: "metadata"
|
|
11146
|
+
});
|
|
11147
|
+
if (isError) {
|
|
11148
|
+
throw error;
|
|
11202
11149
|
}
|
|
11203
|
-
const isReady = !!
|
|
11204
|
-
return /* @__PURE__ */ jsxs(RouteDrawer, {
|
|
11205
|
-
/* @__PURE__ */
|
|
11206
|
-
|
|
11150
|
+
const isReady = !isPending && !!order;
|
|
11151
|
+
return /* @__PURE__ */ jsxs(RouteDrawer, { children: [
|
|
11152
|
+
/* @__PURE__ */ jsxs(RouteDrawer.Header, { children: [
|
|
11153
|
+
/* @__PURE__ */ jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsx(Heading, { children: "Metadata" }) }),
|
|
11154
|
+
/* @__PURE__ */ jsx(RouteDrawer.Description, { asChild: true, children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Add metadata to the draft order." }) })
|
|
11155
|
+
] }),
|
|
11156
|
+
!isReady ? /* @__PURE__ */ jsx(PlaceholderInner, {}) : /* @__PURE__ */ jsx(MetadataForm, { orderId: id, metadata: order == null ? void 0 : order.metadata })
|
|
11207
11157
|
] });
|
|
11208
11158
|
};
|
|
11209
|
-
const
|
|
11210
|
-
|
|
11211
|
-
|
|
11212
|
-
const [comboboxValue, setComboboxValue] = useState("");
|
|
11159
|
+
const METADATA_KEY_LABEL_ID = "metadata-form-key-label";
|
|
11160
|
+
const METADATA_VALUE_LABEL_ID = "metadata-form-value-label";
|
|
11161
|
+
const MetadataForm = ({ orderId, metadata }) => {
|
|
11213
11162
|
const { handleSuccess } = useRouteModal();
|
|
11214
|
-
const
|
|
11215
|
-
const
|
|
11216
|
-
const
|
|
11217
|
-
{
|
|
11218
|
-
|
|
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
|
-
});
|
|
11163
|
+
const hasUneditableRows = getHasUneditableRows(metadata);
|
|
11164
|
+
const { mutateAsync, isPending } = useUpdateDraftOrder(orderId);
|
|
11165
|
+
const form = useForm({
|
|
11166
|
+
defaultValues: {
|
|
11167
|
+
metadata: getDefaultValues(metadata)
|
|
11233
11168
|
},
|
|
11234
|
-
|
|
11235
|
-
return data.promotions.map((promotion) => ({
|
|
11236
|
-
label: promotion.code,
|
|
11237
|
-
value: promotion.code
|
|
11238
|
-
}));
|
|
11239
|
-
}
|
|
11169
|
+
resolver: zodResolver(MetadataSchema)
|
|
11240
11170
|
});
|
|
11241
|
-
const
|
|
11242
|
-
|
|
11243
|
-
|
|
11244
|
-
}
|
|
11245
|
-
addPromotions(
|
|
11171
|
+
const handleSubmit = form.handleSubmit(async (data) => {
|
|
11172
|
+
const parsedData = parseValues(data);
|
|
11173
|
+
await mutateAsync(
|
|
11246
11174
|
{
|
|
11247
|
-
|
|
11175
|
+
metadata: parsedData
|
|
11248
11176
|
},
|
|
11249
11177
|
{
|
|
11250
|
-
onError: (e) => {
|
|
11251
|
-
toast.error(e.message);
|
|
11252
|
-
comboboxData.onSearchValueChange("");
|
|
11253
|
-
setComboboxValue("");
|
|
11254
|
-
},
|
|
11255
11178
|
onSuccess: () => {
|
|
11256
|
-
|
|
11257
|
-
|
|
11179
|
+
toast.success("Metadata updated");
|
|
11180
|
+
handleSuccess();
|
|
11181
|
+
},
|
|
11182
|
+
onError: (error) => {
|
|
11183
|
+
toast.error(error.message);
|
|
11258
11184
|
}
|
|
11259
11185
|
}
|
|
11260
11186
|
);
|
|
11261
|
-
};
|
|
11262
|
-
const {
|
|
11263
|
-
|
|
11264
|
-
|
|
11265
|
-
|
|
11266
|
-
|
|
11267
|
-
|
|
11268
|
-
|
|
11269
|
-
|
|
11270
|
-
|
|
11271
|
-
|
|
11272
|
-
|
|
11273
|
-
}
|
|
11274
|
-
});
|
|
11275
|
-
if (!requestSucceeded) {
|
|
11276
|
-
setIsSubmitting(false);
|
|
11277
|
-
return;
|
|
11187
|
+
});
|
|
11188
|
+
const { fields, insert, remove } = useFieldArray({
|
|
11189
|
+
control: form.control,
|
|
11190
|
+
name: "metadata"
|
|
11191
|
+
});
|
|
11192
|
+
function deleteRow(index) {
|
|
11193
|
+
remove(index);
|
|
11194
|
+
if (fields.length === 1) {
|
|
11195
|
+
insert(0, {
|
|
11196
|
+
key: "",
|
|
11197
|
+
value: "",
|
|
11198
|
+
disabled: false
|
|
11199
|
+
});
|
|
11278
11200
|
}
|
|
11279
|
-
|
|
11280
|
-
|
|
11281
|
-
|
|
11282
|
-
|
|
11283
|
-
|
|
11284
|
-
|
|
11285
|
-
},
|
|
11286
|
-
onSettled: () => {
|
|
11287
|
-
setIsSubmitting(false);
|
|
11288
|
-
}
|
|
11201
|
+
}
|
|
11202
|
+
function insertRow(index, position) {
|
|
11203
|
+
insert(index + (position === "above" ? 0 : 1), {
|
|
11204
|
+
key: "",
|
|
11205
|
+
value: "",
|
|
11206
|
+
disabled: false
|
|
11289
11207
|
});
|
|
11290
|
-
};
|
|
11291
|
-
if (isError) {
|
|
11292
|
-
throw error;
|
|
11293
11208
|
}
|
|
11294
|
-
return /* @__PURE__ */
|
|
11295
|
-
|
|
11296
|
-
|
|
11297
|
-
|
|
11298
|
-
|
|
11299
|
-
|
|
11209
|
+
return /* @__PURE__ */ jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxs(
|
|
11210
|
+
KeyboundForm,
|
|
11211
|
+
{
|
|
11212
|
+
onSubmit: handleSubmit,
|
|
11213
|
+
className: "flex flex-1 flex-col overflow-hidden",
|
|
11214
|
+
children: [
|
|
11215
|
+
/* @__PURE__ */ jsxs(RouteDrawer.Body, { className: "flex flex-1 flex-col gap-y-8 overflow-y-auto", children: [
|
|
11216
|
+
/* @__PURE__ */ jsxs("div", { className: "bg-ui-bg-base shadow-elevation-card-rest grid grid-cols-1 divide-y rounded-lg", children: [
|
|
11217
|
+
/* @__PURE__ */ jsxs("div", { className: "bg-ui-bg-subtle grid grid-cols-2 divide-x rounded-t-lg", children: [
|
|
11218
|
+
/* @__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" }) }),
|
|
11219
|
+
/* @__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" }) })
|
|
11220
|
+
] }),
|
|
11221
|
+
fields.map((field, index) => {
|
|
11222
|
+
const isDisabled = field.disabled || false;
|
|
11223
|
+
let placeholder = "-";
|
|
11224
|
+
if (typeof field.value === "object") {
|
|
11225
|
+
placeholder = "{ ... }";
|
|
11226
|
+
}
|
|
11227
|
+
if (Array.isArray(field.value)) {
|
|
11228
|
+
placeholder = "[ ... ]";
|
|
11229
|
+
}
|
|
11230
|
+
return /* @__PURE__ */ jsx(
|
|
11231
|
+
ConditionalTooltip,
|
|
11232
|
+
{
|
|
11233
|
+
showTooltip: isDisabled,
|
|
11234
|
+
content: "This row is disabled because it contains non-primitive data.",
|
|
11235
|
+
children: /* @__PURE__ */ jsxs("div", { className: "group/table relative", children: [
|
|
11236
|
+
/* @__PURE__ */ jsxs(
|
|
11237
|
+
"div",
|
|
11238
|
+
{
|
|
11239
|
+
className: clx("grid grid-cols-2 divide-x", {
|
|
11240
|
+
"overflow-hidden rounded-b-lg": index === fields.length - 1
|
|
11241
|
+
}),
|
|
11242
|
+
children: [
|
|
11243
|
+
/* @__PURE__ */ jsx(
|
|
11244
|
+
Form$2.Field,
|
|
11245
|
+
{
|
|
11246
|
+
control: form.control,
|
|
11247
|
+
name: `metadata.${index}.key`,
|
|
11248
|
+
render: ({ field: field2 }) => {
|
|
11249
|
+
return /* @__PURE__ */ jsx(Form$2.Item, { children: /* @__PURE__ */ jsx(Form$2.Control, { children: /* @__PURE__ */ jsx(
|
|
11250
|
+
GridInput,
|
|
11251
|
+
{
|
|
11252
|
+
"aria-labelledby": METADATA_KEY_LABEL_ID,
|
|
11253
|
+
...field2,
|
|
11254
|
+
disabled: isDisabled,
|
|
11255
|
+
placeholder: "Key"
|
|
11256
|
+
}
|
|
11257
|
+
) }) });
|
|
11258
|
+
}
|
|
11259
|
+
}
|
|
11260
|
+
),
|
|
11261
|
+
/* @__PURE__ */ jsx(
|
|
11262
|
+
Form$2.Field,
|
|
11263
|
+
{
|
|
11264
|
+
control: form.control,
|
|
11265
|
+
name: `metadata.${index}.value`,
|
|
11266
|
+
render: ({ field: { value, ...field2 } }) => {
|
|
11267
|
+
return /* @__PURE__ */ jsx(Form$2.Item, { children: /* @__PURE__ */ jsx(Form$2.Control, { children: /* @__PURE__ */ jsx(
|
|
11268
|
+
GridInput,
|
|
11269
|
+
{
|
|
11270
|
+
"aria-labelledby": METADATA_VALUE_LABEL_ID,
|
|
11271
|
+
...field2,
|
|
11272
|
+
value: isDisabled ? placeholder : value,
|
|
11273
|
+
disabled: isDisabled,
|
|
11274
|
+
placeholder: "Value"
|
|
11275
|
+
}
|
|
11276
|
+
) }) });
|
|
11277
|
+
}
|
|
11278
|
+
}
|
|
11279
|
+
)
|
|
11280
|
+
]
|
|
11281
|
+
}
|
|
11282
|
+
),
|
|
11283
|
+
/* @__PURE__ */ jsxs(DropdownMenu, { children: [
|
|
11284
|
+
/* @__PURE__ */ jsx(
|
|
11285
|
+
DropdownMenu.Trigger,
|
|
11286
|
+
{
|
|
11287
|
+
className: clx(
|
|
11288
|
+
"invisible absolute inset-y-0 -right-2.5 my-auto group-hover/table:visible data-[state='open']:visible",
|
|
11289
|
+
{
|
|
11290
|
+
hidden: isDisabled
|
|
11291
|
+
}
|
|
11292
|
+
),
|
|
11293
|
+
disabled: isDisabled,
|
|
11294
|
+
asChild: true,
|
|
11295
|
+
children: /* @__PURE__ */ jsx(IconButton, { size: "2xsmall", children: /* @__PURE__ */ jsx(EllipsisVertical, {}) })
|
|
11296
|
+
}
|
|
11297
|
+
),
|
|
11298
|
+
/* @__PURE__ */ jsxs(DropdownMenu.Content, { children: [
|
|
11299
|
+
/* @__PURE__ */ jsxs(
|
|
11300
|
+
DropdownMenu.Item,
|
|
11301
|
+
{
|
|
11302
|
+
className: "gap-x-2",
|
|
11303
|
+
onClick: () => insertRow(index, "above"),
|
|
11304
|
+
children: [
|
|
11305
|
+
/* @__PURE__ */ jsx(ArrowUpMini, { className: "text-ui-fg-subtle" }),
|
|
11306
|
+
"Insert row above"
|
|
11307
|
+
]
|
|
11308
|
+
}
|
|
11309
|
+
),
|
|
11310
|
+
/* @__PURE__ */ jsxs(
|
|
11311
|
+
DropdownMenu.Item,
|
|
11312
|
+
{
|
|
11313
|
+
className: "gap-x-2",
|
|
11314
|
+
onClick: () => insertRow(index, "below"),
|
|
11315
|
+
children: [
|
|
11316
|
+
/* @__PURE__ */ jsx(ArrowDownMini, { className: "text-ui-fg-subtle" }),
|
|
11317
|
+
"Insert row below"
|
|
11318
|
+
]
|
|
11319
|
+
}
|
|
11320
|
+
),
|
|
11321
|
+
/* @__PURE__ */ jsx(DropdownMenu.Separator, {}),
|
|
11322
|
+
/* @__PURE__ */ jsxs(
|
|
11323
|
+
DropdownMenu.Item,
|
|
11324
|
+
{
|
|
11325
|
+
className: "gap-x-2",
|
|
11326
|
+
onClick: () => deleteRow(index),
|
|
11327
|
+
children: [
|
|
11328
|
+
/* @__PURE__ */ jsx(Trash, { className: "text-ui-fg-subtle" }),
|
|
11329
|
+
"Delete row"
|
|
11330
|
+
]
|
|
11331
|
+
}
|
|
11332
|
+
)
|
|
11333
|
+
] })
|
|
11334
|
+
] })
|
|
11335
|
+
] })
|
|
11336
|
+
},
|
|
11337
|
+
field.id
|
|
11338
|
+
);
|
|
11339
|
+
})
|
|
11340
|
+
] }),
|
|
11341
|
+
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." })
|
|
11300
11342
|
] }),
|
|
11301
|
-
/* @__PURE__ */ jsx(
|
|
11302
|
-
|
|
11303
|
-
{
|
|
11304
|
-
|
|
11305
|
-
|
|
11306
|
-
|
|
11307
|
-
|
|
11308
|
-
|
|
11309
|
-
|
|
11310
|
-
|
|
11311
|
-
|
|
11312
|
-
|
|
11313
|
-
|
|
11314
|
-
|
|
11315
|
-
|
|
11316
|
-
|
|
11317
|
-
|
|
11318
|
-
|
|
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
|
-
}
|
|
11343
|
+
/* @__PURE__ */ jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
|
|
11344
|
+
/* @__PURE__ */ jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsx(Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
|
|
11345
|
+
/* @__PURE__ */ jsx(Button, { size: "small", type: "submit", isLoading: isPending, children: "Save" })
|
|
11346
|
+
] }) })
|
|
11347
|
+
]
|
|
11348
|
+
}
|
|
11349
|
+
) });
|
|
11350
|
+
};
|
|
11351
|
+
const GridInput = forwardRef(({ className, ...props }, ref) => {
|
|
11352
|
+
return /* @__PURE__ */ jsx(
|
|
11353
|
+
"input",
|
|
11354
|
+
{
|
|
11355
|
+
ref,
|
|
11356
|
+
...props,
|
|
11357
|
+
autoComplete: "off",
|
|
11358
|
+
className: clx(
|
|
11359
|
+
"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",
|
|
11360
|
+
className
|
|
11338
11361
|
)
|
|
11362
|
+
}
|
|
11363
|
+
);
|
|
11364
|
+
});
|
|
11365
|
+
GridInput.displayName = "MetadataForm.GridInput";
|
|
11366
|
+
const PlaceholderInner = () => {
|
|
11367
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-col overflow-hidden", children: [
|
|
11368
|
+
/* @__PURE__ */ jsx(RouteDrawer.Body, { children: /* @__PURE__ */ jsx(Skeleton, { className: "h-[148ox] w-full rounded-lg" }) }),
|
|
11369
|
+
/* @__PURE__ */ jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
|
|
11370
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-7 w-12 rounded-md" }),
|
|
11371
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-7 w-12 rounded-md" })
|
|
11339
11372
|
] }) })
|
|
11340
11373
|
] });
|
|
11341
11374
|
};
|
|
11342
|
-
const
|
|
11343
|
-
|
|
11344
|
-
|
|
11345
|
-
|
|
11346
|
-
}) => {
|
|
11347
|
-
var _a;
|
|
11348
|
-
const { mutateAsync: removePromotions, isPending } = useDraftOrderRemovePromotions(orderId);
|
|
11349
|
-
const onRemove = async () => {
|
|
11350
|
-
removePromotions(
|
|
11351
|
-
{
|
|
11352
|
-
promo_codes: [promotion.code]
|
|
11353
|
-
},
|
|
11375
|
+
const EDITABLE_TYPES = ["string", "number", "boolean"];
|
|
11376
|
+
function getDefaultValues(metadata) {
|
|
11377
|
+
if (!metadata || !Object.keys(metadata).length) {
|
|
11378
|
+
return [
|
|
11354
11379
|
{
|
|
11355
|
-
|
|
11356
|
-
|
|
11357
|
-
|
|
11380
|
+
key: "",
|
|
11381
|
+
value: "",
|
|
11382
|
+
disabled: false
|
|
11358
11383
|
}
|
|
11359
|
-
|
|
11360
|
-
};
|
|
11361
|
-
const displayValue = getDisplayValue(promotion);
|
|
11362
|
-
return /* @__PURE__ */ jsxs(
|
|
11363
|
-
"div",
|
|
11364
|
-
{
|
|
11365
|
-
className: clx(
|
|
11366
|
-
"bg-ui-bg-component shadow-elevation-card-rest flex items-center justify-between rounded-lg px-3 py-2",
|
|
11367
|
-
{
|
|
11368
|
-
"animate-pulse": isLoading
|
|
11369
|
-
}
|
|
11370
|
-
),
|
|
11371
|
-
children: [
|
|
11372
|
-
/* @__PURE__ */ jsxs("div", { children: [
|
|
11373
|
-
/* @__PURE__ */ jsx(Text, { size: "small", weight: "plus", leading: "compact", children: promotion.code }),
|
|
11374
|
-
/* @__PURE__ */ jsxs("div", { className: "text-ui-fg-subtle flex items-center gap-1.5", children: [
|
|
11375
|
-
displayValue && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
11376
|
-
/* @__PURE__ */ jsx(Text, { size: "small", leading: "compact", children: displayValue }),
|
|
11377
|
-
/* @__PURE__ */ jsx(Text, { size: "small", leading: "compact", children: "·" })
|
|
11378
|
-
] }),
|
|
11379
|
-
/* @__PURE__ */ jsx(Text, { size: "small", leading: "compact", className: "capitalize", children: (_a = promotion.application_method) == null ? void 0 : _a.allocation })
|
|
11380
|
-
] })
|
|
11381
|
-
] }),
|
|
11382
|
-
/* @__PURE__ */ jsx(
|
|
11383
|
-
IconButton,
|
|
11384
|
-
{
|
|
11385
|
-
size: "small",
|
|
11386
|
-
type: "button",
|
|
11387
|
-
variant: "transparent",
|
|
11388
|
-
onClick: onRemove,
|
|
11389
|
-
isLoading: isPending || isLoading,
|
|
11390
|
-
children: /* @__PURE__ */ jsx(XMark, {})
|
|
11391
|
-
}
|
|
11392
|
-
)
|
|
11393
|
-
]
|
|
11394
|
-
},
|
|
11395
|
-
promotion.id
|
|
11396
|
-
);
|
|
11397
|
-
};
|
|
11398
|
-
function getDisplayValue(promotion) {
|
|
11399
|
-
var _a, _b, _c, _d;
|
|
11400
|
-
const value = (_a = promotion.application_method) == null ? void 0 : _a.value;
|
|
11401
|
-
if (!value) {
|
|
11402
|
-
return null;
|
|
11384
|
+
];
|
|
11403
11385
|
}
|
|
11404
|
-
|
|
11405
|
-
|
|
11406
|
-
|
|
11407
|
-
|
|
11386
|
+
return Object.entries(metadata).map(([key, value]) => {
|
|
11387
|
+
if (!EDITABLE_TYPES.includes(typeof value)) {
|
|
11388
|
+
return {
|
|
11389
|
+
key,
|
|
11390
|
+
value,
|
|
11391
|
+
disabled: true
|
|
11392
|
+
};
|
|
11408
11393
|
}
|
|
11409
|
-
|
|
11410
|
-
|
|
11411
|
-
|
|
11412
|
-
|
|
11413
|
-
|
|
11394
|
+
let stringValue = value;
|
|
11395
|
+
if (typeof value !== "string") {
|
|
11396
|
+
stringValue = JSON.stringify(value);
|
|
11397
|
+
}
|
|
11398
|
+
return {
|
|
11399
|
+
key,
|
|
11400
|
+
value: stringValue,
|
|
11401
|
+
original_key: key
|
|
11402
|
+
};
|
|
11403
|
+
});
|
|
11414
11404
|
}
|
|
11415
|
-
|
|
11416
|
-
|
|
11417
|
-
|
|
11418
|
-
|
|
11419
|
-
|
|
11420
|
-
let val = value || 0;
|
|
11421
|
-
if (!isPercentageValue) {
|
|
11422
|
-
val = val / 100;
|
|
11405
|
+
function parseValues(values) {
|
|
11406
|
+
const metadata = values.metadata;
|
|
11407
|
+
const isEmpty = !metadata.length || metadata.length === 1 && !metadata[0].key && !metadata[0].value;
|
|
11408
|
+
if (isEmpty) {
|
|
11409
|
+
return null;
|
|
11423
11410
|
}
|
|
11424
|
-
|
|
11425
|
-
|
|
11426
|
-
|
|
11427
|
-
|
|
11428
|
-
|
|
11429
|
-
if (
|
|
11430
|
-
|
|
11431
|
-
if (adjustment.promotion_id) {
|
|
11432
|
-
promotionIds.add(adjustment.promotion_id);
|
|
11433
|
-
}
|
|
11434
|
-
}
|
|
11411
|
+
const update = {};
|
|
11412
|
+
metadata.forEach((field) => {
|
|
11413
|
+
let key = field.key;
|
|
11414
|
+
let value = field.value;
|
|
11415
|
+
const disabled = field.disabled;
|
|
11416
|
+
if (!key || !value) {
|
|
11417
|
+
return;
|
|
11435
11418
|
}
|
|
11436
|
-
|
|
11437
|
-
|
|
11438
|
-
|
|
11439
|
-
|
|
11440
|
-
|
|
11441
|
-
|
|
11442
|
-
|
|
11419
|
+
if (disabled) {
|
|
11420
|
+
update[key] = value;
|
|
11421
|
+
return;
|
|
11422
|
+
}
|
|
11423
|
+
key = key.trim();
|
|
11424
|
+
value = value.trim();
|
|
11425
|
+
if (value === "true") {
|
|
11426
|
+
update[key] = true;
|
|
11427
|
+
} else if (value === "false") {
|
|
11428
|
+
update[key] = false;
|
|
11429
|
+
} else {
|
|
11430
|
+
const parsedNumber = parseFloat(value);
|
|
11431
|
+
if (!isNaN(parsedNumber)) {
|
|
11432
|
+
update[key] = parsedNumber;
|
|
11433
|
+
} else {
|
|
11434
|
+
update[key] = value;
|
|
11443
11435
|
}
|
|
11444
11436
|
}
|
|
11437
|
+
});
|
|
11438
|
+
return update;
|
|
11439
|
+
}
|
|
11440
|
+
function getHasUneditableRows(metadata) {
|
|
11441
|
+
if (!metadata) {
|
|
11442
|
+
return false;
|
|
11445
11443
|
}
|
|
11446
|
-
return
|
|
11444
|
+
return Object.values(metadata).some(
|
|
11445
|
+
(value) => !EDITABLE_TYPES.includes(typeof value)
|
|
11446
|
+
);
|
|
11447
11447
|
}
|
|
11448
11448
|
const SalesChannel = () => {
|
|
11449
11449
|
const { id } = useParams();
|
|
@@ -13073,14 +13073,14 @@ const routeModule = {
|
|
|
13073
13073
|
Component: Items,
|
|
13074
13074
|
path: "/draft-orders/:id/items"
|
|
13075
13075
|
},
|
|
13076
|
-
{
|
|
13077
|
-
Component: Metadata,
|
|
13078
|
-
path: "/draft-orders/:id/metadata"
|
|
13079
|
-
},
|
|
13080
13076
|
{
|
|
13081
13077
|
Component: Promotions,
|
|
13082
13078
|
path: "/draft-orders/:id/promotions"
|
|
13083
13079
|
},
|
|
13080
|
+
{
|
|
13081
|
+
Component: Metadata,
|
|
13082
|
+
path: "/draft-orders/:id/metadata"
|
|
13083
|
+
},
|
|
13084
13084
|
{
|
|
13085
13085
|
Component: SalesChannel,
|
|
13086
13086
|
path: "/draft-orders/:id/sales-channel"
|