@medusajs/draft-order 2.10.4-preview-20251011030926 → 2.10.4-preview-20251011090154
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 +366 -366
- package/.medusa/server/src/admin/index.mjs +366 -366
- package/package.json +16 -16
|
@@ -10826,283 +10826,6 @@ const customItemSchema = objectType({
|
|
|
10826
10826
|
quantity: numberType(),
|
|
10827
10827
|
unit_price: unionType([numberType(), stringType()])
|
|
10828
10828
|
});
|
|
10829
|
-
const PROMOTION_QUERY_KEY = "promotions";
|
|
10830
|
-
const promotionsQueryKeys = {
|
|
10831
|
-
list: (query2) => [
|
|
10832
|
-
PROMOTION_QUERY_KEY,
|
|
10833
|
-
query2 ? query2 : void 0
|
|
10834
|
-
],
|
|
10835
|
-
detail: (id, query2) => [
|
|
10836
|
-
PROMOTION_QUERY_KEY,
|
|
10837
|
-
id,
|
|
10838
|
-
query2 ? query2 : void 0
|
|
10839
|
-
]
|
|
10840
|
-
};
|
|
10841
|
-
const usePromotions = (query2, options) => {
|
|
10842
|
-
const { data, ...rest } = reactQuery.useQuery({
|
|
10843
|
-
queryKey: promotionsQueryKeys.list(query2),
|
|
10844
|
-
queryFn: async () => sdk.admin.promotion.list(query2),
|
|
10845
|
-
...options
|
|
10846
|
-
});
|
|
10847
|
-
return { ...data, ...rest };
|
|
10848
|
-
};
|
|
10849
|
-
const Promotions = () => {
|
|
10850
|
-
const { id } = reactRouterDom.useParams();
|
|
10851
|
-
const {
|
|
10852
|
-
order: preview,
|
|
10853
|
-
isError: isPreviewError,
|
|
10854
|
-
error: previewError
|
|
10855
|
-
} = useOrderPreview(id, void 0);
|
|
10856
|
-
useInitiateOrderEdit({ preview });
|
|
10857
|
-
const { onCancel } = useCancelOrderEdit({ preview });
|
|
10858
|
-
if (isPreviewError) {
|
|
10859
|
-
throw previewError;
|
|
10860
|
-
}
|
|
10861
|
-
const isReady = !!preview;
|
|
10862
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { onClose: onCancel, children: [
|
|
10863
|
-
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Promotions" }) }) }),
|
|
10864
|
-
isReady && /* @__PURE__ */ jsxRuntime.jsx(PromotionForm, { preview })
|
|
10865
|
-
] });
|
|
10866
|
-
};
|
|
10867
|
-
const PromotionForm = ({ preview }) => {
|
|
10868
|
-
const { items, shipping_methods } = preview;
|
|
10869
|
-
const [isSubmitting, setIsSubmitting] = React.useState(false);
|
|
10870
|
-
const [comboboxValue, setComboboxValue] = React.useState("");
|
|
10871
|
-
const { handleSuccess } = useRouteModal();
|
|
10872
|
-
const { mutateAsync: addPromotions, isPending: isAddingPromotions } = useDraftOrderAddPromotions(preview.id);
|
|
10873
|
-
const promoIds = getPromotionIds(items, shipping_methods);
|
|
10874
|
-
const { promotions, isPending, isError, error } = usePromotions(
|
|
10875
|
-
{
|
|
10876
|
-
id: promoIds
|
|
10877
|
-
},
|
|
10878
|
-
{
|
|
10879
|
-
enabled: !!promoIds.length
|
|
10880
|
-
}
|
|
10881
|
-
);
|
|
10882
|
-
const comboboxData = useComboboxData({
|
|
10883
|
-
queryKey: ["promotions", "combobox", promoIds],
|
|
10884
|
-
queryFn: async (params) => {
|
|
10885
|
-
return await sdk.admin.promotion.list({
|
|
10886
|
-
...params,
|
|
10887
|
-
id: {
|
|
10888
|
-
$nin: promoIds
|
|
10889
|
-
}
|
|
10890
|
-
});
|
|
10891
|
-
},
|
|
10892
|
-
getOptions: (data) => {
|
|
10893
|
-
return data.promotions.map((promotion) => ({
|
|
10894
|
-
label: promotion.code,
|
|
10895
|
-
value: promotion.code
|
|
10896
|
-
}));
|
|
10897
|
-
}
|
|
10898
|
-
});
|
|
10899
|
-
const add = async (value) => {
|
|
10900
|
-
if (!value) {
|
|
10901
|
-
return;
|
|
10902
|
-
}
|
|
10903
|
-
addPromotions(
|
|
10904
|
-
{
|
|
10905
|
-
promo_codes: [value]
|
|
10906
|
-
},
|
|
10907
|
-
{
|
|
10908
|
-
onError: (e) => {
|
|
10909
|
-
ui.toast.error(e.message);
|
|
10910
|
-
comboboxData.onSearchValueChange("");
|
|
10911
|
-
setComboboxValue("");
|
|
10912
|
-
},
|
|
10913
|
-
onSuccess: () => {
|
|
10914
|
-
comboboxData.onSearchValueChange("");
|
|
10915
|
-
setComboboxValue("");
|
|
10916
|
-
}
|
|
10917
|
-
}
|
|
10918
|
-
);
|
|
10919
|
-
};
|
|
10920
|
-
const { mutateAsync: confirmOrderEdit } = useDraftOrderConfirmEdit(preview.id);
|
|
10921
|
-
const { mutateAsync: requestOrderEdit } = useOrderEditRequest(preview.id);
|
|
10922
|
-
const onSubmit = async () => {
|
|
10923
|
-
setIsSubmitting(true);
|
|
10924
|
-
let requestSucceeded = false;
|
|
10925
|
-
await requestOrderEdit(void 0, {
|
|
10926
|
-
onError: (e) => {
|
|
10927
|
-
ui.toast.error(e.message);
|
|
10928
|
-
},
|
|
10929
|
-
onSuccess: () => {
|
|
10930
|
-
requestSucceeded = true;
|
|
10931
|
-
}
|
|
10932
|
-
});
|
|
10933
|
-
if (!requestSucceeded) {
|
|
10934
|
-
setIsSubmitting(false);
|
|
10935
|
-
return;
|
|
10936
|
-
}
|
|
10937
|
-
await confirmOrderEdit(void 0, {
|
|
10938
|
-
onError: (e) => {
|
|
10939
|
-
ui.toast.error(e.message);
|
|
10940
|
-
},
|
|
10941
|
-
onSuccess: () => {
|
|
10942
|
-
handleSuccess();
|
|
10943
|
-
},
|
|
10944
|
-
onSettled: () => {
|
|
10945
|
-
setIsSubmitting(false);
|
|
10946
|
-
}
|
|
10947
|
-
});
|
|
10948
|
-
};
|
|
10949
|
-
if (isError) {
|
|
10950
|
-
throw error;
|
|
10951
|
-
}
|
|
10952
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(KeyboundForm, { className: "flex flex-1 flex-col", onSubmit, children: [
|
|
10953
|
-
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Body, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4", children: [
|
|
10954
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3", children: [
|
|
10955
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
|
|
10956
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Label, { size: "small", weight: "plus", htmlFor: "promotion-combobox", children: "Apply promotions" }),
|
|
10957
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Hint, { id: "promotion-combobox-hint", children: "Manage promotions that should be applied to the order." })
|
|
10958
|
-
] }),
|
|
10959
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10960
|
-
Combobox,
|
|
10961
|
-
{
|
|
10962
|
-
id: "promotion-combobox",
|
|
10963
|
-
"aria-describedby": "promotion-combobox-hint",
|
|
10964
|
-
isFetchingNextPage: comboboxData.isFetchingNextPage,
|
|
10965
|
-
fetchNextPage: comboboxData.fetchNextPage,
|
|
10966
|
-
options: comboboxData.options,
|
|
10967
|
-
onSearchValueChange: comboboxData.onSearchValueChange,
|
|
10968
|
-
searchValue: comboboxData.searchValue,
|
|
10969
|
-
disabled: comboboxData.disabled || isAddingPromotions,
|
|
10970
|
-
onChange: add,
|
|
10971
|
-
value: comboboxValue
|
|
10972
|
-
}
|
|
10973
|
-
)
|
|
10974
|
-
] }),
|
|
10975
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
|
|
10976
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-2", children: promotions == null ? void 0 : promotions.map((promotion) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
10977
|
-
PromotionItem,
|
|
10978
|
-
{
|
|
10979
|
-
promotion,
|
|
10980
|
-
orderId: preview.id,
|
|
10981
|
-
isLoading: isPending
|
|
10982
|
-
},
|
|
10983
|
-
promotion.id
|
|
10984
|
-
)) })
|
|
10985
|
-
] }) }),
|
|
10986
|
-
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2", children: [
|
|
10987
|
-
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
|
|
10988
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10989
|
-
ui.Button,
|
|
10990
|
-
{
|
|
10991
|
-
size: "small",
|
|
10992
|
-
type: "submit",
|
|
10993
|
-
isLoading: isSubmitting || isAddingPromotions,
|
|
10994
|
-
children: "Save"
|
|
10995
|
-
}
|
|
10996
|
-
)
|
|
10997
|
-
] }) })
|
|
10998
|
-
] });
|
|
10999
|
-
};
|
|
11000
|
-
const PromotionItem = ({
|
|
11001
|
-
promotion,
|
|
11002
|
-
orderId,
|
|
11003
|
-
isLoading
|
|
11004
|
-
}) => {
|
|
11005
|
-
var _a;
|
|
11006
|
-
const { mutateAsync: removePromotions, isPending } = useDraftOrderRemovePromotions(orderId);
|
|
11007
|
-
const onRemove = async () => {
|
|
11008
|
-
removePromotions(
|
|
11009
|
-
{
|
|
11010
|
-
promo_codes: [promotion.code]
|
|
11011
|
-
},
|
|
11012
|
-
{
|
|
11013
|
-
onError: (e) => {
|
|
11014
|
-
ui.toast.error(e.message);
|
|
11015
|
-
}
|
|
11016
|
-
}
|
|
11017
|
-
);
|
|
11018
|
-
};
|
|
11019
|
-
const displayValue = getDisplayValue(promotion);
|
|
11020
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
11021
|
-
"div",
|
|
11022
|
-
{
|
|
11023
|
-
className: ui.clx(
|
|
11024
|
-
"bg-ui-bg-component shadow-elevation-card-rest flex items-center justify-between rounded-lg px-3 py-2",
|
|
11025
|
-
{
|
|
11026
|
-
"animate-pulse": isLoading
|
|
11027
|
-
}
|
|
11028
|
-
),
|
|
11029
|
-
children: [
|
|
11030
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
11031
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: promotion.code }),
|
|
11032
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-ui-fg-subtle flex items-center gap-1.5", children: [
|
|
11033
|
-
displayValue && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
11034
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", leading: "compact", children: displayValue }),
|
|
11035
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", leading: "compact", children: "·" })
|
|
11036
|
-
] }),
|
|
11037
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", leading: "compact", className: "capitalize", children: (_a = promotion.application_method) == null ? void 0 : _a.allocation })
|
|
11038
|
-
] })
|
|
11039
|
-
] }),
|
|
11040
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11041
|
-
ui.IconButton,
|
|
11042
|
-
{
|
|
11043
|
-
size: "small",
|
|
11044
|
-
type: "button",
|
|
11045
|
-
variant: "transparent",
|
|
11046
|
-
onClick: onRemove,
|
|
11047
|
-
isLoading: isPending || isLoading,
|
|
11048
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(icons.XMark, {})
|
|
11049
|
-
}
|
|
11050
|
-
)
|
|
11051
|
-
]
|
|
11052
|
-
},
|
|
11053
|
-
promotion.id
|
|
11054
|
-
);
|
|
11055
|
-
};
|
|
11056
|
-
function getDisplayValue(promotion) {
|
|
11057
|
-
var _a, _b, _c, _d;
|
|
11058
|
-
const value = (_a = promotion.application_method) == null ? void 0 : _a.value;
|
|
11059
|
-
if (!value) {
|
|
11060
|
-
return null;
|
|
11061
|
-
}
|
|
11062
|
-
if (((_b = promotion.application_method) == null ? void 0 : _b.type) === "fixed") {
|
|
11063
|
-
const currency = (_c = promotion.application_method) == null ? void 0 : _c.currency_code;
|
|
11064
|
-
if (!currency) {
|
|
11065
|
-
return null;
|
|
11066
|
-
}
|
|
11067
|
-
return getLocaleAmount(value, currency);
|
|
11068
|
-
} else if (((_d = promotion.application_method) == null ? void 0 : _d.type) === "percentage") {
|
|
11069
|
-
return formatPercentage(value);
|
|
11070
|
-
}
|
|
11071
|
-
return null;
|
|
11072
|
-
}
|
|
11073
|
-
const formatter = new Intl.NumberFormat([], {
|
|
11074
|
-
style: "percent",
|
|
11075
|
-
minimumFractionDigits: 2
|
|
11076
|
-
});
|
|
11077
|
-
const formatPercentage = (value, isPercentageValue = false) => {
|
|
11078
|
-
let val = value || 0;
|
|
11079
|
-
if (!isPercentageValue) {
|
|
11080
|
-
val = val / 100;
|
|
11081
|
-
}
|
|
11082
|
-
return formatter.format(val);
|
|
11083
|
-
};
|
|
11084
|
-
function getPromotionIds(items, shippingMethods) {
|
|
11085
|
-
const promotionIds = /* @__PURE__ */ new Set();
|
|
11086
|
-
for (const item of items) {
|
|
11087
|
-
if (item.adjustments) {
|
|
11088
|
-
for (const adjustment of item.adjustments) {
|
|
11089
|
-
if (adjustment.promotion_id) {
|
|
11090
|
-
promotionIds.add(adjustment.promotion_id);
|
|
11091
|
-
}
|
|
11092
|
-
}
|
|
11093
|
-
}
|
|
11094
|
-
}
|
|
11095
|
-
for (const shippingMethod of shippingMethods) {
|
|
11096
|
-
if (shippingMethod.adjustments) {
|
|
11097
|
-
for (const adjustment of shippingMethod.adjustments) {
|
|
11098
|
-
if (adjustment.promotion_id) {
|
|
11099
|
-
promotionIds.add(adjustment.promotion_id);
|
|
11100
|
-
}
|
|
11101
|
-
}
|
|
11102
|
-
}
|
|
11103
|
-
}
|
|
11104
|
-
return Array.from(promotionIds);
|
|
11105
|
-
}
|
|
11106
10829
|
const InlineTip = React.forwardRef(
|
|
11107
10830
|
({ variant = "tip", label, className, children, ...props }, ref) => {
|
|
11108
10831
|
const labelValue = label || (variant === "warning" ? "Warning" : "Tip");
|
|
@@ -11453,112 +11176,283 @@ function getHasUneditableRows(metadata) {
|
|
|
11453
11176
|
(value) => !EDITABLE_TYPES.includes(typeof value)
|
|
11454
11177
|
);
|
|
11455
11178
|
}
|
|
11456
|
-
const
|
|
11457
|
-
|
|
11458
|
-
|
|
11179
|
+
const PROMOTION_QUERY_KEY = "promotions";
|
|
11180
|
+
const promotionsQueryKeys = {
|
|
11181
|
+
list: (query2) => [
|
|
11182
|
+
PROMOTION_QUERY_KEY,
|
|
11183
|
+
query2 ? query2 : void 0
|
|
11184
|
+
],
|
|
11185
|
+
detail: (id, query2) => [
|
|
11186
|
+
PROMOTION_QUERY_KEY,
|
|
11459
11187
|
id,
|
|
11188
|
+
query2 ? query2 : void 0
|
|
11189
|
+
]
|
|
11190
|
+
};
|
|
11191
|
+
const usePromotions = (query2, options) => {
|
|
11192
|
+
const { data, ...rest } = reactQuery.useQuery({
|
|
11193
|
+
queryKey: promotionsQueryKeys.list(query2),
|
|
11194
|
+
queryFn: async () => sdk.admin.promotion.list(query2),
|
|
11195
|
+
...options
|
|
11196
|
+
});
|
|
11197
|
+
return { ...data, ...rest };
|
|
11198
|
+
};
|
|
11199
|
+
const Promotions = () => {
|
|
11200
|
+
const { id } = reactRouterDom.useParams();
|
|
11201
|
+
const {
|
|
11202
|
+
order: preview,
|
|
11203
|
+
isError: isPreviewError,
|
|
11204
|
+
error: previewError
|
|
11205
|
+
} = useOrderPreview(id, void 0);
|
|
11206
|
+
useInitiateOrderEdit({ preview });
|
|
11207
|
+
const { onCancel } = useCancelOrderEdit({ preview });
|
|
11208
|
+
if (isPreviewError) {
|
|
11209
|
+
throw previewError;
|
|
11210
|
+
}
|
|
11211
|
+
const isReady = !!preview;
|
|
11212
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { onClose: onCancel, children: [
|
|
11213
|
+
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Promotions" }) }) }),
|
|
11214
|
+
isReady && /* @__PURE__ */ jsxRuntime.jsx(PromotionForm, { preview })
|
|
11215
|
+
] });
|
|
11216
|
+
};
|
|
11217
|
+
const PromotionForm = ({ preview }) => {
|
|
11218
|
+
const { items, shipping_methods } = preview;
|
|
11219
|
+
const [isSubmitting, setIsSubmitting] = React.useState(false);
|
|
11220
|
+
const [comboboxValue, setComboboxValue] = React.useState("");
|
|
11221
|
+
const { handleSuccess } = useRouteModal();
|
|
11222
|
+
const { mutateAsync: addPromotions, isPending: isAddingPromotions } = useDraftOrderAddPromotions(preview.id);
|
|
11223
|
+
const promoIds = getPromotionIds(items, shipping_methods);
|
|
11224
|
+
const { promotions, isPending, isError, error } = usePromotions(
|
|
11460
11225
|
{
|
|
11461
|
-
|
|
11226
|
+
id: promoIds
|
|
11462
11227
|
},
|
|
11463
11228
|
{
|
|
11464
|
-
enabled: !!
|
|
11229
|
+
enabled: !!promoIds.length
|
|
11465
11230
|
}
|
|
11466
11231
|
);
|
|
11467
|
-
|
|
11468
|
-
|
|
11469
|
-
|
|
11470
|
-
|
|
11471
|
-
|
|
11472
|
-
|
|
11473
|
-
|
|
11474
|
-
|
|
11475
|
-
|
|
11476
|
-
ISrEADY && /* @__PURE__ */ jsxRuntime.jsx(SalesChannelForm, { order: draft_order })
|
|
11477
|
-
] });
|
|
11478
|
-
};
|
|
11479
|
-
const SalesChannelForm = ({ order }) => {
|
|
11480
|
-
const form = reactHookForm.useForm({
|
|
11481
|
-
defaultValues: {
|
|
11482
|
-
sales_channel_id: order.sales_channel_id || ""
|
|
11232
|
+
const comboboxData = useComboboxData({
|
|
11233
|
+
queryKey: ["promotions", "combobox", promoIds],
|
|
11234
|
+
queryFn: async (params) => {
|
|
11235
|
+
return await sdk.admin.promotion.list({
|
|
11236
|
+
...params,
|
|
11237
|
+
id: {
|
|
11238
|
+
$nin: promoIds
|
|
11239
|
+
}
|
|
11240
|
+
});
|
|
11483
11241
|
},
|
|
11484
|
-
|
|
11242
|
+
getOptions: (data) => {
|
|
11243
|
+
return data.promotions.map((promotion) => ({
|
|
11244
|
+
label: promotion.code,
|
|
11245
|
+
value: promotion.code
|
|
11246
|
+
}));
|
|
11247
|
+
}
|
|
11485
11248
|
});
|
|
11486
|
-
const
|
|
11487
|
-
|
|
11488
|
-
|
|
11489
|
-
|
|
11249
|
+
const add = async (value) => {
|
|
11250
|
+
if (!value) {
|
|
11251
|
+
return;
|
|
11252
|
+
}
|
|
11253
|
+
addPromotions(
|
|
11490
11254
|
{
|
|
11491
|
-
|
|
11255
|
+
promo_codes: [value]
|
|
11492
11256
|
},
|
|
11493
11257
|
{
|
|
11258
|
+
onError: (e) => {
|
|
11259
|
+
ui.toast.error(e.message);
|
|
11260
|
+
comboboxData.onSearchValueChange("");
|
|
11261
|
+
setComboboxValue("");
|
|
11262
|
+
},
|
|
11494
11263
|
onSuccess: () => {
|
|
11495
|
-
|
|
11496
|
-
|
|
11264
|
+
comboboxData.onSearchValueChange("");
|
|
11265
|
+
setComboboxValue("");
|
|
11266
|
+
}
|
|
11267
|
+
}
|
|
11268
|
+
);
|
|
11269
|
+
};
|
|
11270
|
+
const { mutateAsync: confirmOrderEdit } = useDraftOrderConfirmEdit(preview.id);
|
|
11271
|
+
const { mutateAsync: requestOrderEdit } = useOrderEditRequest(preview.id);
|
|
11272
|
+
const onSubmit = async () => {
|
|
11273
|
+
setIsSubmitting(true);
|
|
11274
|
+
let requestSucceeded = false;
|
|
11275
|
+
await requestOrderEdit(void 0, {
|
|
11276
|
+
onError: (e) => {
|
|
11277
|
+
ui.toast.error(e.message);
|
|
11278
|
+
},
|
|
11279
|
+
onSuccess: () => {
|
|
11280
|
+
requestSucceeded = true;
|
|
11281
|
+
}
|
|
11282
|
+
});
|
|
11283
|
+
if (!requestSucceeded) {
|
|
11284
|
+
setIsSubmitting(false);
|
|
11285
|
+
return;
|
|
11286
|
+
}
|
|
11287
|
+
await confirmOrderEdit(void 0, {
|
|
11288
|
+
onError: (e) => {
|
|
11289
|
+
ui.toast.error(e.message);
|
|
11290
|
+
},
|
|
11291
|
+
onSuccess: () => {
|
|
11292
|
+
handleSuccess();
|
|
11293
|
+
},
|
|
11294
|
+
onSettled: () => {
|
|
11295
|
+
setIsSubmitting(false);
|
|
11296
|
+
}
|
|
11297
|
+
});
|
|
11298
|
+
};
|
|
11299
|
+
if (isError) {
|
|
11300
|
+
throw error;
|
|
11301
|
+
}
|
|
11302
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(KeyboundForm, { className: "flex flex-1 flex-col", onSubmit, children: [
|
|
11303
|
+
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Body, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4", children: [
|
|
11304
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3", children: [
|
|
11305
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
|
|
11306
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Label, { size: "small", weight: "plus", htmlFor: "promotion-combobox", children: "Apply promotions" }),
|
|
11307
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Hint, { id: "promotion-combobox-hint", children: "Manage promotions that should be applied to the order." })
|
|
11308
|
+
] }),
|
|
11309
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11310
|
+
Combobox,
|
|
11311
|
+
{
|
|
11312
|
+
id: "promotion-combobox",
|
|
11313
|
+
"aria-describedby": "promotion-combobox-hint",
|
|
11314
|
+
isFetchingNextPage: comboboxData.isFetchingNextPage,
|
|
11315
|
+
fetchNextPage: comboboxData.fetchNextPage,
|
|
11316
|
+
options: comboboxData.options,
|
|
11317
|
+
onSearchValueChange: comboboxData.onSearchValueChange,
|
|
11318
|
+
searchValue: comboboxData.searchValue,
|
|
11319
|
+
disabled: comboboxData.disabled || isAddingPromotions,
|
|
11320
|
+
onChange: add,
|
|
11321
|
+
value: comboboxValue
|
|
11322
|
+
}
|
|
11323
|
+
)
|
|
11324
|
+
] }),
|
|
11325
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
|
|
11326
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-2", children: promotions == null ? void 0 : promotions.map((promotion) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
11327
|
+
PromotionItem,
|
|
11328
|
+
{
|
|
11329
|
+
promotion,
|
|
11330
|
+
orderId: preview.id,
|
|
11331
|
+
isLoading: isPending
|
|
11497
11332
|
},
|
|
11498
|
-
|
|
11499
|
-
|
|
11333
|
+
promotion.id
|
|
11334
|
+
)) })
|
|
11335
|
+
] }) }),
|
|
11336
|
+
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2", children: [
|
|
11337
|
+
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
|
|
11338
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11339
|
+
ui.Button,
|
|
11340
|
+
{
|
|
11341
|
+
size: "small",
|
|
11342
|
+
type: "submit",
|
|
11343
|
+
isLoading: isSubmitting || isAddingPromotions,
|
|
11344
|
+
children: "Save"
|
|
11345
|
+
}
|
|
11346
|
+
)
|
|
11347
|
+
] }) })
|
|
11348
|
+
] });
|
|
11349
|
+
};
|
|
11350
|
+
const PromotionItem = ({
|
|
11351
|
+
promotion,
|
|
11352
|
+
orderId,
|
|
11353
|
+
isLoading
|
|
11354
|
+
}) => {
|
|
11355
|
+
var _a;
|
|
11356
|
+
const { mutateAsync: removePromotions, isPending } = useDraftOrderRemovePromotions(orderId);
|
|
11357
|
+
const onRemove = async () => {
|
|
11358
|
+
removePromotions(
|
|
11359
|
+
{
|
|
11360
|
+
promo_codes: [promotion.code]
|
|
11361
|
+
},
|
|
11362
|
+
{
|
|
11363
|
+
onError: (e) => {
|
|
11364
|
+
ui.toast.error(e.message);
|
|
11500
11365
|
}
|
|
11501
11366
|
}
|
|
11502
11367
|
);
|
|
11503
|
-
}
|
|
11504
|
-
|
|
11505
|
-
|
|
11368
|
+
};
|
|
11369
|
+
const displayValue = getDisplayValue(promotion);
|
|
11370
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
11371
|
+
"div",
|
|
11506
11372
|
{
|
|
11507
|
-
className:
|
|
11508
|
-
|
|
11373
|
+
className: ui.clx(
|
|
11374
|
+
"bg-ui-bg-component shadow-elevation-card-rest flex items-center justify-between rounded-lg px-3 py-2",
|
|
11375
|
+
{
|
|
11376
|
+
"animate-pulse": isLoading
|
|
11377
|
+
}
|
|
11378
|
+
),
|
|
11509
11379
|
children: [
|
|
11510
|
-
/* @__PURE__ */ jsxRuntime.
|
|
11511
|
-
|
|
11512
|
-
/* @__PURE__ */ jsxRuntime.
|
|
11513
|
-
|
|
11514
|
-
|
|
11380
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
11381
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: promotion.code }),
|
|
11382
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-ui-fg-subtle flex items-center gap-1.5", children: [
|
|
11383
|
+
displayValue && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [
|
|
11384
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", leading: "compact", children: displayValue }),
|
|
11385
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", leading: "compact", children: "·" })
|
|
11386
|
+
] }),
|
|
11387
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", leading: "compact", className: "capitalize", children: (_a = promotion.application_method) == null ? void 0 : _a.allocation })
|
|
11388
|
+
] })
|
|
11389
|
+
] }),
|
|
11390
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11391
|
+
ui.IconButton,
|
|
11392
|
+
{
|
|
11393
|
+
size: "small",
|
|
11394
|
+
type: "button",
|
|
11395
|
+
variant: "transparent",
|
|
11396
|
+
onClick: onRemove,
|
|
11397
|
+
isLoading: isPending || isLoading,
|
|
11398
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(icons.XMark, {})
|
|
11399
|
+
}
|
|
11400
|
+
)
|
|
11515
11401
|
]
|
|
11516
|
-
}
|
|
11517
|
-
) });
|
|
11518
|
-
};
|
|
11519
|
-
const SalesChannelField = ({ control, order }) => {
|
|
11520
|
-
const salesChannels = useComboboxData({
|
|
11521
|
-
queryFn: async (params) => {
|
|
11522
|
-
return await sdk.admin.salesChannel.list(params);
|
|
11523
|
-
},
|
|
11524
|
-
queryKey: ["sales-channels"],
|
|
11525
|
-
getOptions: (data) => {
|
|
11526
|
-
return data.sales_channels.map((salesChannel) => ({
|
|
11527
|
-
label: salesChannel.name,
|
|
11528
|
-
value: salesChannel.id
|
|
11529
|
-
}));
|
|
11530
11402
|
},
|
|
11531
|
-
|
|
11532
|
-
});
|
|
11533
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
11534
|
-
Form$2.Field,
|
|
11535
|
-
{
|
|
11536
|
-
control,
|
|
11537
|
-
name: "sales_channel_id",
|
|
11538
|
-
render: ({ field }) => {
|
|
11539
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
|
|
11540
|
-
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Sales Channel" }),
|
|
11541
|
-
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
11542
|
-
Combobox,
|
|
11543
|
-
{
|
|
11544
|
-
options: salesChannels.options,
|
|
11545
|
-
fetchNextPage: salesChannels.fetchNextPage,
|
|
11546
|
-
isFetchingNextPage: salesChannels.isFetchingNextPage,
|
|
11547
|
-
searchValue: salesChannels.searchValue,
|
|
11548
|
-
onSearchValueChange: salesChannels.onSearchValueChange,
|
|
11549
|
-
placeholder: "Select sales channel",
|
|
11550
|
-
...field
|
|
11551
|
-
}
|
|
11552
|
-
) }),
|
|
11553
|
-
/* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
|
|
11554
|
-
] });
|
|
11555
|
-
}
|
|
11556
|
-
}
|
|
11403
|
+
promotion.id
|
|
11557
11404
|
);
|
|
11558
11405
|
};
|
|
11559
|
-
|
|
11560
|
-
|
|
11406
|
+
function getDisplayValue(promotion) {
|
|
11407
|
+
var _a, _b, _c, _d;
|
|
11408
|
+
const value = (_a = promotion.application_method) == null ? void 0 : _a.value;
|
|
11409
|
+
if (!value) {
|
|
11410
|
+
return null;
|
|
11411
|
+
}
|
|
11412
|
+
if (((_b = promotion.application_method) == null ? void 0 : _b.type) === "fixed") {
|
|
11413
|
+
const currency = (_c = promotion.application_method) == null ? void 0 : _c.currency_code;
|
|
11414
|
+
if (!currency) {
|
|
11415
|
+
return null;
|
|
11416
|
+
}
|
|
11417
|
+
return getLocaleAmount(value, currency);
|
|
11418
|
+
} else if (((_d = promotion.application_method) == null ? void 0 : _d.type) === "percentage") {
|
|
11419
|
+
return formatPercentage(value);
|
|
11420
|
+
}
|
|
11421
|
+
return null;
|
|
11422
|
+
}
|
|
11423
|
+
const formatter = new Intl.NumberFormat([], {
|
|
11424
|
+
style: "percent",
|
|
11425
|
+
minimumFractionDigits: 2
|
|
11561
11426
|
});
|
|
11427
|
+
const formatPercentage = (value, isPercentageValue = false) => {
|
|
11428
|
+
let val = value || 0;
|
|
11429
|
+
if (!isPercentageValue) {
|
|
11430
|
+
val = val / 100;
|
|
11431
|
+
}
|
|
11432
|
+
return formatter.format(val);
|
|
11433
|
+
};
|
|
11434
|
+
function getPromotionIds(items, shippingMethods) {
|
|
11435
|
+
const promotionIds = /* @__PURE__ */ new Set();
|
|
11436
|
+
for (const item of items) {
|
|
11437
|
+
if (item.adjustments) {
|
|
11438
|
+
for (const adjustment of item.adjustments) {
|
|
11439
|
+
if (adjustment.promotion_id) {
|
|
11440
|
+
promotionIds.add(adjustment.promotion_id);
|
|
11441
|
+
}
|
|
11442
|
+
}
|
|
11443
|
+
}
|
|
11444
|
+
}
|
|
11445
|
+
for (const shippingMethod of shippingMethods) {
|
|
11446
|
+
if (shippingMethod.adjustments) {
|
|
11447
|
+
for (const adjustment of shippingMethod.adjustments) {
|
|
11448
|
+
if (adjustment.promotion_id) {
|
|
11449
|
+
promotionIds.add(adjustment.promotion_id);
|
|
11450
|
+
}
|
|
11451
|
+
}
|
|
11452
|
+
}
|
|
11453
|
+
}
|
|
11454
|
+
return Array.from(promotionIds);
|
|
11455
|
+
}
|
|
11562
11456
|
const STACKED_FOCUS_MODAL_ID = "shipping-form";
|
|
11563
11457
|
const Shipping = () => {
|
|
11564
11458
|
var _a;
|
|
@@ -12366,6 +12260,112 @@ const CustomAmountField = ({
|
|
|
12366
12260
|
}
|
|
12367
12261
|
);
|
|
12368
12262
|
};
|
|
12263
|
+
const SalesChannel = () => {
|
|
12264
|
+
const { id } = reactRouterDom.useParams();
|
|
12265
|
+
const { draft_order, isPending, isError, error } = useDraftOrder(
|
|
12266
|
+
id,
|
|
12267
|
+
{
|
|
12268
|
+
fields: "+sales_channel_id"
|
|
12269
|
+
},
|
|
12270
|
+
{
|
|
12271
|
+
enabled: !!id
|
|
12272
|
+
}
|
|
12273
|
+
);
|
|
12274
|
+
if (isError) {
|
|
12275
|
+
throw error;
|
|
12276
|
+
}
|
|
12277
|
+
const ISrEADY = !!draft_order && !isPending;
|
|
12278
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { children: [
|
|
12279
|
+
/* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer.Header, { children: [
|
|
12280
|
+
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Sales Channel" }) }),
|
|
12281
|
+
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Update which sales channel the draft order is associated with" }) })
|
|
12282
|
+
] }),
|
|
12283
|
+
ISrEADY && /* @__PURE__ */ jsxRuntime.jsx(SalesChannelForm, { order: draft_order })
|
|
12284
|
+
] });
|
|
12285
|
+
};
|
|
12286
|
+
const SalesChannelForm = ({ order }) => {
|
|
12287
|
+
const form = reactHookForm.useForm({
|
|
12288
|
+
defaultValues: {
|
|
12289
|
+
sales_channel_id: order.sales_channel_id || ""
|
|
12290
|
+
},
|
|
12291
|
+
resolver: zod.zodResolver(schema$2)
|
|
12292
|
+
});
|
|
12293
|
+
const { mutateAsync, isPending } = useUpdateDraftOrder(order.id);
|
|
12294
|
+
const { handleSuccess } = useRouteModal();
|
|
12295
|
+
const onSubmit = form.handleSubmit(async (data) => {
|
|
12296
|
+
await mutateAsync(
|
|
12297
|
+
{
|
|
12298
|
+
sales_channel_id: data.sales_channel_id
|
|
12299
|
+
},
|
|
12300
|
+
{
|
|
12301
|
+
onSuccess: () => {
|
|
12302
|
+
ui.toast.success("Sales channel updated");
|
|
12303
|
+
handleSuccess();
|
|
12304
|
+
},
|
|
12305
|
+
onError: (error) => {
|
|
12306
|
+
ui.toast.error(error.message);
|
|
12307
|
+
}
|
|
12308
|
+
}
|
|
12309
|
+
);
|
|
12310
|
+
});
|
|
12311
|
+
return /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
12312
|
+
KeyboundForm,
|
|
12313
|
+
{
|
|
12314
|
+
className: "flex flex-1 flex-col overflow-hidden",
|
|
12315
|
+
onSubmit,
|
|
12316
|
+
children: [
|
|
12317
|
+
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Body, { className: "flex flex-col gap-y-6 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx(SalesChannelField, { control: form.control, order }) }),
|
|
12318
|
+
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2", children: [
|
|
12319
|
+
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
|
|
12320
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "submit", isLoading: isPending, children: "Save" })
|
|
12321
|
+
] }) })
|
|
12322
|
+
]
|
|
12323
|
+
}
|
|
12324
|
+
) });
|
|
12325
|
+
};
|
|
12326
|
+
const SalesChannelField = ({ control, order }) => {
|
|
12327
|
+
const salesChannels = useComboboxData({
|
|
12328
|
+
queryFn: async (params) => {
|
|
12329
|
+
return await sdk.admin.salesChannel.list(params);
|
|
12330
|
+
},
|
|
12331
|
+
queryKey: ["sales-channels"],
|
|
12332
|
+
getOptions: (data) => {
|
|
12333
|
+
return data.sales_channels.map((salesChannel) => ({
|
|
12334
|
+
label: salesChannel.name,
|
|
12335
|
+
value: salesChannel.id
|
|
12336
|
+
}));
|
|
12337
|
+
},
|
|
12338
|
+
defaultValue: order.sales_channel_id || void 0
|
|
12339
|
+
});
|
|
12340
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
12341
|
+
Form$2.Field,
|
|
12342
|
+
{
|
|
12343
|
+
control,
|
|
12344
|
+
name: "sales_channel_id",
|
|
12345
|
+
render: ({ field }) => {
|
|
12346
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
|
|
12347
|
+
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Sales Channel" }),
|
|
12348
|
+
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
12349
|
+
Combobox,
|
|
12350
|
+
{
|
|
12351
|
+
options: salesChannels.options,
|
|
12352
|
+
fetchNextPage: salesChannels.fetchNextPage,
|
|
12353
|
+
isFetchingNextPage: salesChannels.isFetchingNextPage,
|
|
12354
|
+
searchValue: salesChannels.searchValue,
|
|
12355
|
+
onSearchValueChange: salesChannels.onSearchValueChange,
|
|
12356
|
+
placeholder: "Select sales channel",
|
|
12357
|
+
...field
|
|
12358
|
+
}
|
|
12359
|
+
) }),
|
|
12360
|
+
/* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
|
|
12361
|
+
] });
|
|
12362
|
+
}
|
|
12363
|
+
}
|
|
12364
|
+
);
|
|
12365
|
+
};
|
|
12366
|
+
const schema$2 = objectType({
|
|
12367
|
+
sales_channel_id: stringType().min(1)
|
|
12368
|
+
});
|
|
12369
12369
|
const ShippingAddress = () => {
|
|
12370
12370
|
const { id } = reactRouterDom.useParams();
|
|
12371
12371
|
const { order, isPending, isError, error } = useOrder(id, {
|
|
@@ -13081,22 +13081,22 @@ const routeModule = {
|
|
|
13081
13081
|
Component: Items,
|
|
13082
13082
|
path: "/draft-orders/:id/items"
|
|
13083
13083
|
},
|
|
13084
|
-
{
|
|
13085
|
-
Component: Promotions,
|
|
13086
|
-
path: "/draft-orders/:id/promotions"
|
|
13087
|
-
},
|
|
13088
13084
|
{
|
|
13089
13085
|
Component: Metadata,
|
|
13090
13086
|
path: "/draft-orders/:id/metadata"
|
|
13091
13087
|
},
|
|
13092
13088
|
{
|
|
13093
|
-
Component:
|
|
13094
|
-
path: "/draft-orders/:id/
|
|
13089
|
+
Component: Promotions,
|
|
13090
|
+
path: "/draft-orders/:id/promotions"
|
|
13095
13091
|
},
|
|
13096
13092
|
{
|
|
13097
13093
|
Component: Shipping,
|
|
13098
13094
|
path: "/draft-orders/:id/shipping"
|
|
13099
13095
|
},
|
|
13096
|
+
{
|
|
13097
|
+
Component: SalesChannel,
|
|
13098
|
+
path: "/draft-orders/:id/sales-channel"
|
|
13099
|
+
},
|
|
13100
13100
|
{
|
|
13101
13101
|
Component: ShippingAddress,
|
|
13102
13102
|
path: "/draft-orders/:id/shipping-address"
|