@medusajs/draft-order 2.11.0-preview-20251016000321 → 2.11.0-preview-20251016031628
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 +826 -826
- package/.medusa/server/src/admin/index.mjs +827 -827
- package/package.json +16 -16
|
@@ -9573,27 +9573,6 @@ const ID = () => {
|
|
|
9573
9573
|
/* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Outlet, {})
|
|
9574
9574
|
] });
|
|
9575
9575
|
};
|
|
9576
|
-
const CustomItems = () => {
|
|
9577
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { children: [
|
|
9578
|
-
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Custom Items" }) }) }),
|
|
9579
|
-
/* @__PURE__ */ jsxRuntime.jsx(CustomItemsForm, {})
|
|
9580
|
-
] });
|
|
9581
|
-
};
|
|
9582
|
-
const CustomItemsForm = () => {
|
|
9583
|
-
const form = reactHookForm.useForm({
|
|
9584
|
-
resolver: zod.zodResolver(schema$5)
|
|
9585
|
-
});
|
|
9586
|
-
return /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxRuntime.jsxs(KeyboundForm, { className: "flex flex-1 flex-col", children: [
|
|
9587
|
-
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Body, {}),
|
|
9588
|
-
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2", children: [
|
|
9589
|
-
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
|
|
9590
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "submit", children: "Save" })
|
|
9591
|
-
] }) })
|
|
9592
|
-
] }) });
|
|
9593
|
-
};
|
|
9594
|
-
const schema$5 = objectType({
|
|
9595
|
-
email: stringType().email()
|
|
9596
|
-
});
|
|
9597
9576
|
const BillingAddress = () => {
|
|
9598
9577
|
const { id } = reactRouterDom.useParams();
|
|
9599
9578
|
const { order, isPending, isError, error } = useOrder(id, {
|
|
@@ -9626,7 +9605,7 @@ const BillingAddressForm = ({ order }) => {
|
|
|
9626
9605
|
postal_code: ((_i = order.billing_address) == null ? void 0 : _i.postal_code) ?? "",
|
|
9627
9606
|
phone: ((_j = order.billing_address) == null ? void 0 : _j.phone) ?? ""
|
|
9628
9607
|
},
|
|
9629
|
-
resolver: zod.zodResolver(schema$
|
|
9608
|
+
resolver: zod.zodResolver(schema$5)
|
|
9630
9609
|
});
|
|
9631
9610
|
const { mutateAsync, isPending } = useUpdateDraftOrder(order.id);
|
|
9632
9611
|
const { handleSuccess } = useRouteModal();
|
|
@@ -9783,7 +9762,28 @@ const BillingAddressForm = ({ order }) => {
|
|
|
9783
9762
|
}
|
|
9784
9763
|
) });
|
|
9785
9764
|
};
|
|
9786
|
-
const schema$
|
|
9765
|
+
const schema$5 = addressSchema;
|
|
9766
|
+
const CustomItems = () => {
|
|
9767
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { children: [
|
|
9768
|
+
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Custom Items" }) }) }),
|
|
9769
|
+
/* @__PURE__ */ jsxRuntime.jsx(CustomItemsForm, {})
|
|
9770
|
+
] });
|
|
9771
|
+
};
|
|
9772
|
+
const CustomItemsForm = () => {
|
|
9773
|
+
const form = reactHookForm.useForm({
|
|
9774
|
+
resolver: zod.zodResolver(schema$4)
|
|
9775
|
+
});
|
|
9776
|
+
return /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxRuntime.jsxs(KeyboundForm, { className: "flex flex-1 flex-col", children: [
|
|
9777
|
+
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Body, {}),
|
|
9778
|
+
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2", children: [
|
|
9779
|
+
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
|
|
9780
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "submit", children: "Save" })
|
|
9781
|
+
] }) })
|
|
9782
|
+
] }) });
|
|
9783
|
+
};
|
|
9784
|
+
const schema$4 = objectType({
|
|
9785
|
+
email: stringType().email()
|
|
9786
|
+
});
|
|
9787
9787
|
const Email = () => {
|
|
9788
9788
|
const { id } = reactRouterDom.useParams();
|
|
9789
9789
|
const { order, isPending, isError, error } = useOrder(id, {
|
|
@@ -9852,494 +9852,144 @@ const EmailForm = ({ order }) => {
|
|
|
9852
9852
|
const schema$3 = objectType({
|
|
9853
9853
|
email: stringType().email()
|
|
9854
9854
|
});
|
|
9855
|
-
const
|
|
9856
|
-
({
|
|
9857
|
-
|
|
9855
|
+
const NumberInput = React.forwardRef(
|
|
9856
|
+
({
|
|
9857
|
+
value,
|
|
9858
|
+
onChange,
|
|
9859
|
+
size = "base",
|
|
9860
|
+
min = 0,
|
|
9861
|
+
max = 100,
|
|
9862
|
+
step = 1,
|
|
9863
|
+
className,
|
|
9864
|
+
disabled,
|
|
9865
|
+
...props
|
|
9866
|
+
}, ref) => {
|
|
9867
|
+
const handleChange = (event) => {
|
|
9868
|
+
const newValue = event.target.value === "" ? min : Number(event.target.value);
|
|
9869
|
+
if (!isNaN(newValue) && (max === void 0 || newValue <= max) && (min === void 0 || newValue >= min)) {
|
|
9870
|
+
onChange(newValue);
|
|
9871
|
+
}
|
|
9872
|
+
};
|
|
9873
|
+
const handleIncrement = () => {
|
|
9874
|
+
const newValue = value + step;
|
|
9875
|
+
if (max === void 0 || newValue <= max) {
|
|
9876
|
+
onChange(newValue);
|
|
9877
|
+
}
|
|
9878
|
+
};
|
|
9879
|
+
const handleDecrement = () => {
|
|
9880
|
+
const newValue = value - step;
|
|
9881
|
+
if (min === void 0 || newValue >= min) {
|
|
9882
|
+
onChange(newValue);
|
|
9883
|
+
}
|
|
9884
|
+
};
|
|
9858
9885
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9859
9886
|
"div",
|
|
9860
9887
|
{
|
|
9861
|
-
ref,
|
|
9862
9888
|
className: ui.clx(
|
|
9863
|
-
"
|
|
9889
|
+
"inline-flex rounded-md bg-ui-bg-field shadow-borders-base overflow-hidden divide-x transition-fg",
|
|
9890
|
+
"[&:has(input:focus)]:shadow-borders-interactive-with-active",
|
|
9891
|
+
{
|
|
9892
|
+
"h-7": size === "small",
|
|
9893
|
+
"h-8": size === "base"
|
|
9894
|
+
},
|
|
9864
9895
|
className
|
|
9865
9896
|
),
|
|
9866
|
-
...props,
|
|
9867
9897
|
children: [
|
|
9868
9898
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9869
|
-
"
|
|
9899
|
+
"input",
|
|
9870
9900
|
{
|
|
9871
|
-
|
|
9872
|
-
|
|
9873
|
-
|
|
9874
|
-
|
|
9901
|
+
ref,
|
|
9902
|
+
type: "number",
|
|
9903
|
+
value,
|
|
9904
|
+
onChange: handleChange,
|
|
9905
|
+
min,
|
|
9906
|
+
max,
|
|
9907
|
+
step,
|
|
9908
|
+
className: ui.clx(
|
|
9909
|
+
"flex-1 px-2 py-1 bg-transparent txt-compact-small text-ui-fg-base outline-none [appearance:textfield]",
|
|
9910
|
+
"[&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none",
|
|
9911
|
+
"placeholder:text-ui-fg-muted"
|
|
9912
|
+
),
|
|
9913
|
+
...props
|
|
9875
9914
|
}
|
|
9876
9915
|
),
|
|
9877
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
9878
|
-
|
|
9879
|
-
|
|
9880
|
-
|
|
9881
|
-
|
|
9882
|
-
|
|
9883
|
-
|
|
9884
|
-
|
|
9916
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
9917
|
+
"button",
|
|
9918
|
+
{
|
|
9919
|
+
className: ui.clx(
|
|
9920
|
+
"flex items-center justify-center outline-none transition-fg",
|
|
9921
|
+
"disabled:cursor-not-allowed disabled:text-ui-fg-muted",
|
|
9922
|
+
"focus:bg-ui-bg-field-component-hover",
|
|
9923
|
+
"hover:bg-ui-bg-field-component-hover",
|
|
9924
|
+
{
|
|
9925
|
+
"size-7": size === "small",
|
|
9926
|
+
"size-8": size === "base"
|
|
9927
|
+
}
|
|
9928
|
+
),
|
|
9929
|
+
type: "button",
|
|
9930
|
+
onClick: handleDecrement,
|
|
9931
|
+
disabled: min !== void 0 && value <= min || disabled,
|
|
9932
|
+
children: [
|
|
9933
|
+
/* @__PURE__ */ jsxRuntime.jsx(icons.Minus, {}),
|
|
9934
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: `Decrease by ${step}` })
|
|
9935
|
+
]
|
|
9936
|
+
}
|
|
9937
|
+
),
|
|
9938
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
9939
|
+
"button",
|
|
9940
|
+
{
|
|
9941
|
+
className: ui.clx(
|
|
9942
|
+
"flex items-center justify-center outline-none transition-fg",
|
|
9943
|
+
"disabled:cursor-not-allowed disabled:text-ui-fg-muted",
|
|
9944
|
+
"focus:bg-ui-bg-field-hover",
|
|
9945
|
+
"hover:bg-ui-bg-field-hover",
|
|
9946
|
+
{
|
|
9947
|
+
"size-7": size === "small",
|
|
9948
|
+
"size-8": size === "base"
|
|
9949
|
+
}
|
|
9950
|
+
),
|
|
9951
|
+
type: "button",
|
|
9952
|
+
onClick: handleIncrement,
|
|
9953
|
+
disabled: max !== void 0 && value >= max || disabled,
|
|
9954
|
+
children: [
|
|
9955
|
+
/* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}),
|
|
9956
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: `Increase by ${step}` })
|
|
9957
|
+
]
|
|
9958
|
+
}
|
|
9959
|
+
)
|
|
9885
9960
|
]
|
|
9886
9961
|
}
|
|
9887
9962
|
);
|
|
9888
9963
|
}
|
|
9889
9964
|
);
|
|
9890
|
-
|
|
9891
|
-
const
|
|
9892
|
-
|
|
9893
|
-
|
|
9894
|
-
|
|
9895
|
-
|
|
9896
|
-
const MetadataSchema = objectType({
|
|
9897
|
-
metadata: arrayType(MetadataFieldSchema)
|
|
9898
|
-
});
|
|
9899
|
-
const Metadata = () => {
|
|
9900
|
-
const { id } = reactRouterDom.useParams();
|
|
9901
|
-
const { order, isPending, isError, error } = useOrder(id, {
|
|
9902
|
-
fields: "metadata"
|
|
9903
|
-
});
|
|
9904
|
-
if (isError) {
|
|
9905
|
-
throw error;
|
|
9906
|
-
}
|
|
9907
|
-
const isReady = !isPending && !!order;
|
|
9908
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { children: [
|
|
9909
|
-
/* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer.Header, { children: [
|
|
9910
|
-
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Metadata" }) }),
|
|
9911
|
-
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Add metadata to the draft order." }) })
|
|
9912
|
-
] }),
|
|
9913
|
-
!isReady ? /* @__PURE__ */ jsxRuntime.jsx(PlaceholderInner, {}) : /* @__PURE__ */ jsxRuntime.jsx(MetadataForm, { orderId: id, metadata: order == null ? void 0 : order.metadata })
|
|
9914
|
-
] });
|
|
9965
|
+
const PRODUCT_VARIANTS_QUERY_KEY = "product-variants";
|
|
9966
|
+
const productVariantsQueryKeys = {
|
|
9967
|
+
list: (query2) => [
|
|
9968
|
+
PRODUCT_VARIANTS_QUERY_KEY,
|
|
9969
|
+
query2 ? query2 : void 0
|
|
9970
|
+
]
|
|
9915
9971
|
};
|
|
9916
|
-
const
|
|
9917
|
-
const
|
|
9918
|
-
|
|
9919
|
-
|
|
9920
|
-
|
|
9921
|
-
const { mutateAsync, isPending } = useUpdateDraftOrder(orderId);
|
|
9922
|
-
const form = reactHookForm.useForm({
|
|
9923
|
-
defaultValues: {
|
|
9924
|
-
metadata: getDefaultValues(metadata)
|
|
9925
|
-
},
|
|
9926
|
-
resolver: zod.zodResolver(MetadataSchema)
|
|
9972
|
+
const useProductVariants = (query2, options) => {
|
|
9973
|
+
const { data, ...rest } = reactQuery.useQuery({
|
|
9974
|
+
queryKey: productVariantsQueryKeys.list(query2),
|
|
9975
|
+
queryFn: async () => await sdk.admin.productVariant.list(query2),
|
|
9976
|
+
...options
|
|
9927
9977
|
});
|
|
9928
|
-
|
|
9929
|
-
|
|
9930
|
-
|
|
9931
|
-
|
|
9932
|
-
|
|
9978
|
+
return { ...data, ...rest };
|
|
9979
|
+
};
|
|
9980
|
+
const useCancelOrderEdit = ({ preview }) => {
|
|
9981
|
+
const { mutateAsync: cancelOrderEdit } = useDraftOrderCancelEdit(preview == null ? void 0 : preview.id);
|
|
9982
|
+
const onCancel = React.useCallback(async () => {
|
|
9983
|
+
if (!preview) {
|
|
9984
|
+
return true;
|
|
9985
|
+
}
|
|
9986
|
+
let res = false;
|
|
9987
|
+
await cancelOrderEdit(void 0, {
|
|
9988
|
+
onError: (e) => {
|
|
9989
|
+
ui.toast.error(e.message);
|
|
9933
9990
|
},
|
|
9934
|
-
{
|
|
9935
|
-
|
|
9936
|
-
ui.toast.success("Metadata updated");
|
|
9937
|
-
handleSuccess();
|
|
9938
|
-
},
|
|
9939
|
-
onError: (error) => {
|
|
9940
|
-
ui.toast.error(error.message);
|
|
9941
|
-
}
|
|
9942
|
-
}
|
|
9943
|
-
);
|
|
9944
|
-
});
|
|
9945
|
-
const { fields, insert, remove } = reactHookForm.useFieldArray({
|
|
9946
|
-
control: form.control,
|
|
9947
|
-
name: "metadata"
|
|
9948
|
-
});
|
|
9949
|
-
function deleteRow(index) {
|
|
9950
|
-
remove(index);
|
|
9951
|
-
if (fields.length === 1) {
|
|
9952
|
-
insert(0, {
|
|
9953
|
-
key: "",
|
|
9954
|
-
value: "",
|
|
9955
|
-
disabled: false
|
|
9956
|
-
});
|
|
9957
|
-
}
|
|
9958
|
-
}
|
|
9959
|
-
function insertRow(index, position) {
|
|
9960
|
-
insert(index + (position === "above" ? 0 : 1), {
|
|
9961
|
-
key: "",
|
|
9962
|
-
value: "",
|
|
9963
|
-
disabled: false
|
|
9964
|
-
});
|
|
9965
|
-
}
|
|
9966
|
-
return /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9967
|
-
KeyboundForm,
|
|
9968
|
-
{
|
|
9969
|
-
onSubmit: handleSubmit,
|
|
9970
|
-
className: "flex flex-1 flex-col overflow-hidden",
|
|
9971
|
-
children: [
|
|
9972
|
-
/* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer.Body, { className: "flex flex-1 flex-col gap-y-8 overflow-y-auto", children: [
|
|
9973
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-ui-bg-base shadow-elevation-card-rest grid grid-cols-1 divide-y rounded-lg", children: [
|
|
9974
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-ui-bg-subtle grid grid-cols-2 divide-x rounded-t-lg", children: [
|
|
9975
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "txt-compact-small-plus text-ui-fg-subtle px-2 py-1.5", children: /* @__PURE__ */ jsxRuntime.jsx("label", { id: METADATA_KEY_LABEL_ID, children: "Key" }) }),
|
|
9976
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "txt-compact-small-plus text-ui-fg-subtle px-2 py-1.5", children: /* @__PURE__ */ jsxRuntime.jsx("label", { id: METADATA_VALUE_LABEL_ID, children: "Value" }) })
|
|
9977
|
-
] }),
|
|
9978
|
-
fields.map((field, index) => {
|
|
9979
|
-
const isDisabled = field.disabled || false;
|
|
9980
|
-
let placeholder = "-";
|
|
9981
|
-
if (typeof field.value === "object") {
|
|
9982
|
-
placeholder = "{ ... }";
|
|
9983
|
-
}
|
|
9984
|
-
if (Array.isArray(field.value)) {
|
|
9985
|
-
placeholder = "[ ... ]";
|
|
9986
|
-
}
|
|
9987
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
9988
|
-
ConditionalTooltip,
|
|
9989
|
-
{
|
|
9990
|
-
showTooltip: isDisabled,
|
|
9991
|
-
content: "This row is disabled because it contains non-primitive data.",
|
|
9992
|
-
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "group/table relative", children: [
|
|
9993
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
9994
|
-
"div",
|
|
9995
|
-
{
|
|
9996
|
-
className: ui.clx("grid grid-cols-2 divide-x", {
|
|
9997
|
-
"overflow-hidden rounded-b-lg": index === fields.length - 1
|
|
9998
|
-
}),
|
|
9999
|
-
children: [
|
|
10000
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10001
|
-
Form$2.Field,
|
|
10002
|
-
{
|
|
10003
|
-
control: form.control,
|
|
10004
|
-
name: `metadata.${index}.key`,
|
|
10005
|
-
render: ({ field: field2 }) => {
|
|
10006
|
-
return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10007
|
-
GridInput,
|
|
10008
|
-
{
|
|
10009
|
-
"aria-labelledby": METADATA_KEY_LABEL_ID,
|
|
10010
|
-
...field2,
|
|
10011
|
-
disabled: isDisabled,
|
|
10012
|
-
placeholder: "Key"
|
|
10013
|
-
}
|
|
10014
|
-
) }) });
|
|
10015
|
-
}
|
|
10016
|
-
}
|
|
10017
|
-
),
|
|
10018
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10019
|
-
Form$2.Field,
|
|
10020
|
-
{
|
|
10021
|
-
control: form.control,
|
|
10022
|
-
name: `metadata.${index}.value`,
|
|
10023
|
-
render: ({ field: { value, ...field2 } }) => {
|
|
10024
|
-
return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10025
|
-
GridInput,
|
|
10026
|
-
{
|
|
10027
|
-
"aria-labelledby": METADATA_VALUE_LABEL_ID,
|
|
10028
|
-
...field2,
|
|
10029
|
-
value: isDisabled ? placeholder : value,
|
|
10030
|
-
disabled: isDisabled,
|
|
10031
|
-
placeholder: "Value"
|
|
10032
|
-
}
|
|
10033
|
-
) }) });
|
|
10034
|
-
}
|
|
10035
|
-
}
|
|
10036
|
-
)
|
|
10037
|
-
]
|
|
10038
|
-
}
|
|
10039
|
-
),
|
|
10040
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
|
|
10041
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10042
|
-
ui.DropdownMenu.Trigger,
|
|
10043
|
-
{
|
|
10044
|
-
className: ui.clx(
|
|
10045
|
-
"invisible absolute inset-y-0 -right-2.5 my-auto group-hover/table:visible data-[state='open']:visible",
|
|
10046
|
-
{
|
|
10047
|
-
hidden: isDisabled
|
|
10048
|
-
}
|
|
10049
|
-
),
|
|
10050
|
-
disabled: isDisabled,
|
|
10051
|
-
asChild: true,
|
|
10052
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(ui.IconButton, { size: "2xsmall", children: /* @__PURE__ */ jsxRuntime.jsx(icons.EllipsisVertical, {}) })
|
|
10053
|
-
}
|
|
10054
|
-
),
|
|
10055
|
-
/* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu.Content, { children: [
|
|
10056
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
10057
|
-
ui.DropdownMenu.Item,
|
|
10058
|
-
{
|
|
10059
|
-
className: "gap-x-2",
|
|
10060
|
-
onClick: () => insertRow(index, "above"),
|
|
10061
|
-
children: [
|
|
10062
|
-
/* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpMini, { className: "text-ui-fg-subtle" }),
|
|
10063
|
-
"Insert row above"
|
|
10064
|
-
]
|
|
10065
|
-
}
|
|
10066
|
-
),
|
|
10067
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
10068
|
-
ui.DropdownMenu.Item,
|
|
10069
|
-
{
|
|
10070
|
-
className: "gap-x-2",
|
|
10071
|
-
onClick: () => insertRow(index, "below"),
|
|
10072
|
-
children: [
|
|
10073
|
-
/* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownMini, { className: "text-ui-fg-subtle" }),
|
|
10074
|
-
"Insert row below"
|
|
10075
|
-
]
|
|
10076
|
-
}
|
|
10077
|
-
),
|
|
10078
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Separator, {}),
|
|
10079
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
10080
|
-
ui.DropdownMenu.Item,
|
|
10081
|
-
{
|
|
10082
|
-
className: "gap-x-2",
|
|
10083
|
-
onClick: () => deleteRow(index),
|
|
10084
|
-
children: [
|
|
10085
|
-
/* @__PURE__ */ jsxRuntime.jsx(icons.Trash, { className: "text-ui-fg-subtle" }),
|
|
10086
|
-
"Delete row"
|
|
10087
|
-
]
|
|
10088
|
-
}
|
|
10089
|
-
)
|
|
10090
|
-
] })
|
|
10091
|
-
] })
|
|
10092
|
-
] })
|
|
10093
|
-
},
|
|
10094
|
-
field.id
|
|
10095
|
-
);
|
|
10096
|
-
})
|
|
10097
|
-
] }),
|
|
10098
|
-
hasUneditableRows && /* @__PURE__ */ jsxRuntime.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." })
|
|
10099
|
-
] }),
|
|
10100
|
-
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
|
|
10101
|
-
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
|
|
10102
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "submit", isLoading: isPending, children: "Save" })
|
|
10103
|
-
] }) })
|
|
10104
|
-
]
|
|
10105
|
-
}
|
|
10106
|
-
) });
|
|
10107
|
-
};
|
|
10108
|
-
const GridInput = React.forwardRef(({ className, ...props }, ref) => {
|
|
10109
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
10110
|
-
"input",
|
|
10111
|
-
{
|
|
10112
|
-
ref,
|
|
10113
|
-
...props,
|
|
10114
|
-
autoComplete: "off",
|
|
10115
|
-
className: ui.clx(
|
|
10116
|
-
"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",
|
|
10117
|
-
className
|
|
10118
|
-
)
|
|
10119
|
-
}
|
|
10120
|
-
);
|
|
10121
|
-
});
|
|
10122
|
-
GridInput.displayName = "MetadataForm.GridInput";
|
|
10123
|
-
const PlaceholderInner = () => {
|
|
10124
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 flex-col overflow-hidden", children: [
|
|
10125
|
-
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Body, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Skeleton, { className: "h-[148ox] w-full rounded-lg" }) }),
|
|
10126
|
-
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
|
|
10127
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Skeleton, { className: "h-7 w-12 rounded-md" }),
|
|
10128
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Skeleton, { className: "h-7 w-12 rounded-md" })
|
|
10129
|
-
] }) })
|
|
10130
|
-
] });
|
|
10131
|
-
};
|
|
10132
|
-
const EDITABLE_TYPES = ["string", "number", "boolean"];
|
|
10133
|
-
function getDefaultValues(metadata) {
|
|
10134
|
-
if (!metadata || !Object.keys(metadata).length) {
|
|
10135
|
-
return [
|
|
10136
|
-
{
|
|
10137
|
-
key: "",
|
|
10138
|
-
value: "",
|
|
10139
|
-
disabled: false
|
|
10140
|
-
}
|
|
10141
|
-
];
|
|
10142
|
-
}
|
|
10143
|
-
return Object.entries(metadata).map(([key, value]) => {
|
|
10144
|
-
if (!EDITABLE_TYPES.includes(typeof value)) {
|
|
10145
|
-
return {
|
|
10146
|
-
key,
|
|
10147
|
-
value,
|
|
10148
|
-
disabled: true
|
|
10149
|
-
};
|
|
10150
|
-
}
|
|
10151
|
-
let stringValue = value;
|
|
10152
|
-
if (typeof value !== "string") {
|
|
10153
|
-
stringValue = JSON.stringify(value);
|
|
10154
|
-
}
|
|
10155
|
-
return {
|
|
10156
|
-
key,
|
|
10157
|
-
value: stringValue,
|
|
10158
|
-
original_key: key
|
|
10159
|
-
};
|
|
10160
|
-
});
|
|
10161
|
-
}
|
|
10162
|
-
function parseValues(values) {
|
|
10163
|
-
const metadata = values.metadata;
|
|
10164
|
-
const isEmpty = !metadata.length || metadata.length === 1 && !metadata[0].key && !metadata[0].value;
|
|
10165
|
-
if (isEmpty) {
|
|
10166
|
-
return null;
|
|
10167
|
-
}
|
|
10168
|
-
const update = {};
|
|
10169
|
-
metadata.forEach((field) => {
|
|
10170
|
-
let key = field.key;
|
|
10171
|
-
let value = field.value;
|
|
10172
|
-
const disabled = field.disabled;
|
|
10173
|
-
if (!key || !value) {
|
|
10174
|
-
return;
|
|
10175
|
-
}
|
|
10176
|
-
if (disabled) {
|
|
10177
|
-
update[key] = value;
|
|
10178
|
-
return;
|
|
10179
|
-
}
|
|
10180
|
-
key = key.trim();
|
|
10181
|
-
value = value.trim();
|
|
10182
|
-
if (value === "true") {
|
|
10183
|
-
update[key] = true;
|
|
10184
|
-
} else if (value === "false") {
|
|
10185
|
-
update[key] = false;
|
|
10186
|
-
} else {
|
|
10187
|
-
const parsedNumber = parseFloat(value);
|
|
10188
|
-
if (!isNaN(parsedNumber)) {
|
|
10189
|
-
update[key] = parsedNumber;
|
|
10190
|
-
} else {
|
|
10191
|
-
update[key] = value;
|
|
10192
|
-
}
|
|
10193
|
-
}
|
|
10194
|
-
});
|
|
10195
|
-
return update;
|
|
10196
|
-
}
|
|
10197
|
-
function getHasUneditableRows(metadata) {
|
|
10198
|
-
if (!metadata) {
|
|
10199
|
-
return false;
|
|
10200
|
-
}
|
|
10201
|
-
return Object.values(metadata).some(
|
|
10202
|
-
(value) => !EDITABLE_TYPES.includes(typeof value)
|
|
10203
|
-
);
|
|
10204
|
-
}
|
|
10205
|
-
const NumberInput = React.forwardRef(
|
|
10206
|
-
({
|
|
10207
|
-
value,
|
|
10208
|
-
onChange,
|
|
10209
|
-
size = "base",
|
|
10210
|
-
min = 0,
|
|
10211
|
-
max = 100,
|
|
10212
|
-
step = 1,
|
|
10213
|
-
className,
|
|
10214
|
-
disabled,
|
|
10215
|
-
...props
|
|
10216
|
-
}, ref) => {
|
|
10217
|
-
const handleChange = (event) => {
|
|
10218
|
-
const newValue = event.target.value === "" ? min : Number(event.target.value);
|
|
10219
|
-
if (!isNaN(newValue) && (max === void 0 || newValue <= max) && (min === void 0 || newValue >= min)) {
|
|
10220
|
-
onChange(newValue);
|
|
10221
|
-
}
|
|
10222
|
-
};
|
|
10223
|
-
const handleIncrement = () => {
|
|
10224
|
-
const newValue = value + step;
|
|
10225
|
-
if (max === void 0 || newValue <= max) {
|
|
10226
|
-
onChange(newValue);
|
|
10227
|
-
}
|
|
10228
|
-
};
|
|
10229
|
-
const handleDecrement = () => {
|
|
10230
|
-
const newValue = value - step;
|
|
10231
|
-
if (min === void 0 || newValue >= min) {
|
|
10232
|
-
onChange(newValue);
|
|
10233
|
-
}
|
|
10234
|
-
};
|
|
10235
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10236
|
-
"div",
|
|
10237
|
-
{
|
|
10238
|
-
className: ui.clx(
|
|
10239
|
-
"inline-flex rounded-md bg-ui-bg-field shadow-borders-base overflow-hidden divide-x transition-fg",
|
|
10240
|
-
"[&:has(input:focus)]:shadow-borders-interactive-with-active",
|
|
10241
|
-
{
|
|
10242
|
-
"h-7": size === "small",
|
|
10243
|
-
"h-8": size === "base"
|
|
10244
|
-
},
|
|
10245
|
-
className
|
|
10246
|
-
),
|
|
10247
|
-
children: [
|
|
10248
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10249
|
-
"input",
|
|
10250
|
-
{
|
|
10251
|
-
ref,
|
|
10252
|
-
type: "number",
|
|
10253
|
-
value,
|
|
10254
|
-
onChange: handleChange,
|
|
10255
|
-
min,
|
|
10256
|
-
max,
|
|
10257
|
-
step,
|
|
10258
|
-
className: ui.clx(
|
|
10259
|
-
"flex-1 px-2 py-1 bg-transparent txt-compact-small text-ui-fg-base outline-none [appearance:textfield]",
|
|
10260
|
-
"[&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none",
|
|
10261
|
-
"placeholder:text-ui-fg-muted"
|
|
10262
|
-
),
|
|
10263
|
-
...props
|
|
10264
|
-
}
|
|
10265
|
-
),
|
|
10266
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
10267
|
-
"button",
|
|
10268
|
-
{
|
|
10269
|
-
className: ui.clx(
|
|
10270
|
-
"flex items-center justify-center outline-none transition-fg",
|
|
10271
|
-
"disabled:cursor-not-allowed disabled:text-ui-fg-muted",
|
|
10272
|
-
"focus:bg-ui-bg-field-component-hover",
|
|
10273
|
-
"hover:bg-ui-bg-field-component-hover",
|
|
10274
|
-
{
|
|
10275
|
-
"size-7": size === "small",
|
|
10276
|
-
"size-8": size === "base"
|
|
10277
|
-
}
|
|
10278
|
-
),
|
|
10279
|
-
type: "button",
|
|
10280
|
-
onClick: handleDecrement,
|
|
10281
|
-
disabled: min !== void 0 && value <= min || disabled,
|
|
10282
|
-
children: [
|
|
10283
|
-
/* @__PURE__ */ jsxRuntime.jsx(icons.Minus, {}),
|
|
10284
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: `Decrease by ${step}` })
|
|
10285
|
-
]
|
|
10286
|
-
}
|
|
10287
|
-
),
|
|
10288
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
10289
|
-
"button",
|
|
10290
|
-
{
|
|
10291
|
-
className: ui.clx(
|
|
10292
|
-
"flex items-center justify-center outline-none transition-fg",
|
|
10293
|
-
"disabled:cursor-not-allowed disabled:text-ui-fg-muted",
|
|
10294
|
-
"focus:bg-ui-bg-field-hover",
|
|
10295
|
-
"hover:bg-ui-bg-field-hover",
|
|
10296
|
-
{
|
|
10297
|
-
"size-7": size === "small",
|
|
10298
|
-
"size-8": size === "base"
|
|
10299
|
-
}
|
|
10300
|
-
),
|
|
10301
|
-
type: "button",
|
|
10302
|
-
onClick: handleIncrement,
|
|
10303
|
-
disabled: max !== void 0 && value >= max || disabled,
|
|
10304
|
-
children: [
|
|
10305
|
-
/* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}),
|
|
10306
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: `Increase by ${step}` })
|
|
10307
|
-
]
|
|
10308
|
-
}
|
|
10309
|
-
)
|
|
10310
|
-
]
|
|
10311
|
-
}
|
|
10312
|
-
);
|
|
10313
|
-
}
|
|
10314
|
-
);
|
|
10315
|
-
const PRODUCT_VARIANTS_QUERY_KEY = "product-variants";
|
|
10316
|
-
const productVariantsQueryKeys = {
|
|
10317
|
-
list: (query2) => [
|
|
10318
|
-
PRODUCT_VARIANTS_QUERY_KEY,
|
|
10319
|
-
query2 ? query2 : void 0
|
|
10320
|
-
]
|
|
10321
|
-
};
|
|
10322
|
-
const useProductVariants = (query2, options) => {
|
|
10323
|
-
const { data, ...rest } = reactQuery.useQuery({
|
|
10324
|
-
queryKey: productVariantsQueryKeys.list(query2),
|
|
10325
|
-
queryFn: async () => await sdk.admin.productVariant.list(query2),
|
|
10326
|
-
...options
|
|
10327
|
-
});
|
|
10328
|
-
return { ...data, ...rest };
|
|
10329
|
-
};
|
|
10330
|
-
const useCancelOrderEdit = ({ preview }) => {
|
|
10331
|
-
const { mutateAsync: cancelOrderEdit } = useDraftOrderCancelEdit(preview == null ? void 0 : preview.id);
|
|
10332
|
-
const onCancel = React.useCallback(async () => {
|
|
10333
|
-
if (!preview) {
|
|
10334
|
-
return true;
|
|
10335
|
-
}
|
|
10336
|
-
let res = false;
|
|
10337
|
-
await cancelOrderEdit(void 0, {
|
|
10338
|
-
onError: (e) => {
|
|
10339
|
-
ui.toast.error(e.message);
|
|
10340
|
-
},
|
|
10341
|
-
onSuccess: () => {
|
|
10342
|
-
res = true;
|
|
9991
|
+
onSuccess: () => {
|
|
9992
|
+
res = true;
|
|
10343
9993
|
}
|
|
10344
9994
|
});
|
|
10345
9995
|
return res;
|
|
@@ -10803,13 +10453,291 @@ const CustomItem = ({ item, preview, currencyCode }) => {
|
|
|
10803
10453
|
}
|
|
10804
10454
|
await updateActionItem(
|
|
10805
10455
|
{
|
|
10806
|
-
action_id: actionId,
|
|
10807
|
-
quantity: data.quantity,
|
|
10808
|
-
unit_price: convertNumber(data.unit_price)
|
|
10456
|
+
action_id: actionId,
|
|
10457
|
+
quantity: data.quantity,
|
|
10458
|
+
unit_price: convertNumber(data.unit_price)
|
|
10459
|
+
},
|
|
10460
|
+
{
|
|
10461
|
+
onSuccess: () => {
|
|
10462
|
+
setEditing(false);
|
|
10463
|
+
},
|
|
10464
|
+
onError: (e) => {
|
|
10465
|
+
ui.toast.error(e.message);
|
|
10466
|
+
}
|
|
10467
|
+
}
|
|
10468
|
+
);
|
|
10469
|
+
});
|
|
10470
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Form$2, { ...form, children: /* @__PURE__ */ jsxRuntime.jsx("form", { onSubmit, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-ui-bg-base shadow-elevation-card-rest grid grid-cols-[minmax(0,2fr)_minmax(0,1fr)_minmax(0,2fr)_28px] items-center gap-3 rounded-lg px-4 py-2", children: [
|
|
10471
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-3", children: [
|
|
10472
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10473
|
+
Thumbnail,
|
|
10474
|
+
{
|
|
10475
|
+
thumbnail: item.thumbnail,
|
|
10476
|
+
alt: item.title ?? void 0
|
|
10477
|
+
}
|
|
10478
|
+
),
|
|
10479
|
+
editing ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
10480
|
+
Form$2.Field,
|
|
10481
|
+
{
|
|
10482
|
+
control: form.control,
|
|
10483
|
+
name: "title",
|
|
10484
|
+
render: ({ field }) => {
|
|
10485
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }) });
|
|
10486
|
+
}
|
|
10487
|
+
}
|
|
10488
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: item.title })
|
|
10489
|
+
] }),
|
|
10490
|
+
editing ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
10491
|
+
Form$2.Field,
|
|
10492
|
+
{
|
|
10493
|
+
control: form.control,
|
|
10494
|
+
name: "quantity",
|
|
10495
|
+
render: ({ field }) => {
|
|
10496
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(NumberInput, { ...field }) }) });
|
|
10497
|
+
}
|
|
10498
|
+
}
|
|
10499
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: item.quantity }),
|
|
10500
|
+
editing ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
10501
|
+
Form$2.Field,
|
|
10502
|
+
{
|
|
10503
|
+
control: form.control,
|
|
10504
|
+
name: "unit_price",
|
|
10505
|
+
render: ({ field: { onChange, ...field } }) => {
|
|
10506
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10507
|
+
ui.CurrencyInput,
|
|
10508
|
+
{
|
|
10509
|
+
...field,
|
|
10510
|
+
symbol: getNativeSymbol(currencyCode),
|
|
10511
|
+
code: currencyCode,
|
|
10512
|
+
onValueChange: (_value, _name, values) => onChange(values == null ? void 0 : values.value)
|
|
10513
|
+
}
|
|
10514
|
+
) }) });
|
|
10515
|
+
}
|
|
10516
|
+
}
|
|
10517
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-1 items-center justify-end", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: getLocaleAmount(item.unit_price, currencyCode) }) }),
|
|
10518
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10519
|
+
ui.IconButton,
|
|
10520
|
+
{
|
|
10521
|
+
type: "button",
|
|
10522
|
+
size: "small",
|
|
10523
|
+
onClick: editing ? onSubmit : () => {
|
|
10524
|
+
setEditing(true);
|
|
10525
|
+
},
|
|
10526
|
+
disabled: isPending,
|
|
10527
|
+
children: editing ? /* @__PURE__ */ jsxRuntime.jsx(icons.Check, {}) : /* @__PURE__ */ jsxRuntime.jsx(icons.PencilSquare, {})
|
|
10528
|
+
}
|
|
10529
|
+
)
|
|
10530
|
+
] }) }) });
|
|
10531
|
+
};
|
|
10532
|
+
const StackedModalTrigger$1 = ({
|
|
10533
|
+
type,
|
|
10534
|
+
setModalContent
|
|
10535
|
+
}) => {
|
|
10536
|
+
const { setIsOpen } = useStackedModal();
|
|
10537
|
+
const onClick = React.useCallback(() => {
|
|
10538
|
+
setModalContent(type);
|
|
10539
|
+
setIsOpen(STACKED_MODAL_ID, true);
|
|
10540
|
+
}, [setModalContent, setIsOpen, type]);
|
|
10541
|
+
return /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Item, { onClick, children: type === "add-items" ? "Add items" : "Add custom item" }) });
|
|
10542
|
+
};
|
|
10543
|
+
const VARIANT_PREFIX = "items";
|
|
10544
|
+
const LIMIT = 50;
|
|
10545
|
+
const ExistingItemsForm = ({ orderId, items }) => {
|
|
10546
|
+
const { setIsOpen } = useStackedModal();
|
|
10547
|
+
const [rowSelection, setRowSelection] = React.useState(
|
|
10548
|
+
items.reduce((acc, item) => {
|
|
10549
|
+
acc[item.variant_id] = true;
|
|
10550
|
+
return acc;
|
|
10551
|
+
}, {})
|
|
10552
|
+
);
|
|
10553
|
+
React.useEffect(() => {
|
|
10554
|
+
setRowSelection(
|
|
10555
|
+
items.reduce((acc, item) => {
|
|
10556
|
+
if (item.variant_id) {
|
|
10557
|
+
acc[item.variant_id] = true;
|
|
10558
|
+
}
|
|
10559
|
+
return acc;
|
|
10560
|
+
}, {})
|
|
10561
|
+
);
|
|
10562
|
+
}, [items]);
|
|
10563
|
+
const { q, order, offset } = useQueryParams(
|
|
10564
|
+
["q", "order", "offset"],
|
|
10565
|
+
VARIANT_PREFIX
|
|
10566
|
+
);
|
|
10567
|
+
const { variants, count, isPending, isError, error } = useProductVariants(
|
|
10568
|
+
{
|
|
10569
|
+
q,
|
|
10570
|
+
order,
|
|
10571
|
+
offset: offset ? parseInt(offset) : void 0,
|
|
10572
|
+
limit: LIMIT
|
|
10573
|
+
},
|
|
10574
|
+
{
|
|
10575
|
+
placeholderData: reactQuery.keepPreviousData
|
|
10576
|
+
}
|
|
10577
|
+
);
|
|
10578
|
+
const columns = useColumns();
|
|
10579
|
+
const { mutateAsync } = useDraftOrderAddItems(orderId);
|
|
10580
|
+
const onSubmit = async () => {
|
|
10581
|
+
const ids = Object.keys(rowSelection).filter(
|
|
10582
|
+
(id) => !items.find((i) => i.variant_id === id)
|
|
10583
|
+
);
|
|
10584
|
+
await mutateAsync(
|
|
10585
|
+
{
|
|
10586
|
+
items: ids.map((id) => ({
|
|
10587
|
+
variant_id: id,
|
|
10588
|
+
quantity: 1
|
|
10589
|
+
}))
|
|
10590
|
+
},
|
|
10591
|
+
{
|
|
10592
|
+
onSuccess: () => {
|
|
10593
|
+
setRowSelection({});
|
|
10594
|
+
setIsOpen(STACKED_MODAL_ID, false);
|
|
10595
|
+
},
|
|
10596
|
+
onError: (e) => {
|
|
10597
|
+
ui.toast.error(e.message);
|
|
10598
|
+
}
|
|
10599
|
+
}
|
|
10600
|
+
);
|
|
10601
|
+
};
|
|
10602
|
+
if (isError) {
|
|
10603
|
+
throw error;
|
|
10604
|
+
}
|
|
10605
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10606
|
+
StackedFocusModal.Content,
|
|
10607
|
+
{
|
|
10608
|
+
onOpenAutoFocus: (e) => {
|
|
10609
|
+
e.preventDefault();
|
|
10610
|
+
const searchInput = document.querySelector(
|
|
10611
|
+
"[data-modal-id='modal-search-input']"
|
|
10612
|
+
);
|
|
10613
|
+
if (searchInput) {
|
|
10614
|
+
searchInput.focus();
|
|
10615
|
+
}
|
|
10616
|
+
},
|
|
10617
|
+
children: [
|
|
10618
|
+
/* @__PURE__ */ jsxRuntime.jsxs(StackedFocusModal.Header, { children: [
|
|
10619
|
+
/* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Product Variants" }) }),
|
|
10620
|
+
/* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Choose product variants to add to the order." }) })
|
|
10621
|
+
] }),
|
|
10622
|
+
/* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Body, { className: "flex-1 overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10623
|
+
DataTable,
|
|
10624
|
+
{
|
|
10625
|
+
data: variants,
|
|
10626
|
+
columns,
|
|
10627
|
+
isLoading: isPending,
|
|
10628
|
+
getRowId: (row) => row.id,
|
|
10629
|
+
rowCount: count,
|
|
10630
|
+
prefix: VARIANT_PREFIX,
|
|
10631
|
+
layout: "fill",
|
|
10632
|
+
rowSelection: {
|
|
10633
|
+
state: rowSelection,
|
|
10634
|
+
onRowSelectionChange: setRowSelection,
|
|
10635
|
+
enableRowSelection: (row) => {
|
|
10636
|
+
return !items.find((i) => i.variant_id === row.original.id);
|
|
10637
|
+
}
|
|
10638
|
+
},
|
|
10639
|
+
autoFocusSearch: true
|
|
10640
|
+
}
|
|
10641
|
+
) }),
|
|
10642
|
+
/* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
|
|
10643
|
+
/* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
|
|
10644
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "button", onClick: onSubmit, children: "Update items" })
|
|
10645
|
+
] }) })
|
|
10646
|
+
]
|
|
10647
|
+
}
|
|
10648
|
+
);
|
|
10649
|
+
};
|
|
10650
|
+
const columnHelper = ui.createDataTableColumnHelper();
|
|
10651
|
+
const useColumns = () => {
|
|
10652
|
+
return React.useMemo(() => {
|
|
10653
|
+
return [
|
|
10654
|
+
columnHelper.select(),
|
|
10655
|
+
columnHelper.accessor("product.title", {
|
|
10656
|
+
header: "Product",
|
|
10657
|
+
cell: ({ row }) => {
|
|
10658
|
+
var _a, _b, _c;
|
|
10659
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-2", children: [
|
|
10660
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10661
|
+
Thumbnail,
|
|
10662
|
+
{
|
|
10663
|
+
thumbnail: (_a = row.original.product) == null ? void 0 : _a.thumbnail,
|
|
10664
|
+
alt: (_b = row.original.product) == null ? void 0 : _b.title
|
|
10665
|
+
}
|
|
10666
|
+
),
|
|
10667
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: (_c = row.original.product) == null ? void 0 : _c.title })
|
|
10668
|
+
] });
|
|
10669
|
+
},
|
|
10670
|
+
enableSorting: true
|
|
10671
|
+
}),
|
|
10672
|
+
columnHelper.accessor("title", {
|
|
10673
|
+
header: "Variant",
|
|
10674
|
+
enableSorting: true
|
|
10675
|
+
}),
|
|
10676
|
+
columnHelper.accessor("sku", {
|
|
10677
|
+
header: "SKU",
|
|
10678
|
+
cell: ({ getValue }) => {
|
|
10679
|
+
return getValue() ?? "-";
|
|
10680
|
+
},
|
|
10681
|
+
enableSorting: true
|
|
10682
|
+
}),
|
|
10683
|
+
columnHelper.accessor("updated_at", {
|
|
10684
|
+
header: "Updated",
|
|
10685
|
+
cell: ({ getValue }) => {
|
|
10686
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
10687
|
+
ui.Tooltip,
|
|
10688
|
+
{
|
|
10689
|
+
content: getFullDate({ date: getValue(), includeTime: true }),
|
|
10690
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: getFullDate({ date: getValue() }) })
|
|
10691
|
+
}
|
|
10692
|
+
);
|
|
10693
|
+
},
|
|
10694
|
+
enableSorting: true,
|
|
10695
|
+
sortAscLabel: "Oldest first",
|
|
10696
|
+
sortDescLabel: "Newest first"
|
|
10697
|
+
}),
|
|
10698
|
+
columnHelper.accessor("created_at", {
|
|
10699
|
+
header: "Created",
|
|
10700
|
+
cell: ({ getValue }) => {
|
|
10701
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
10702
|
+
ui.Tooltip,
|
|
10703
|
+
{
|
|
10704
|
+
content: getFullDate({ date: getValue(), includeTime: true }),
|
|
10705
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: getFullDate({ date: getValue() }) })
|
|
10706
|
+
}
|
|
10707
|
+
);
|
|
10708
|
+
},
|
|
10709
|
+
enableSorting: true,
|
|
10710
|
+
sortAscLabel: "Oldest first",
|
|
10711
|
+
sortDescLabel: "Newest first"
|
|
10712
|
+
})
|
|
10713
|
+
];
|
|
10714
|
+
}, []);
|
|
10715
|
+
};
|
|
10716
|
+
const CustomItemForm = ({ orderId, currencyCode }) => {
|
|
10717
|
+
const { setIsOpen } = useStackedModal();
|
|
10718
|
+
const { mutateAsync: addItems } = useDraftOrderAddItems(orderId);
|
|
10719
|
+
const form = reactHookForm.useForm({
|
|
10720
|
+
defaultValues: {
|
|
10721
|
+
title: "",
|
|
10722
|
+
quantity: 1,
|
|
10723
|
+
unit_price: ""
|
|
10724
|
+
},
|
|
10725
|
+
resolver: zod.zodResolver(customItemSchema)
|
|
10726
|
+
});
|
|
10727
|
+
const onSubmit = form.handleSubmit(async (data) => {
|
|
10728
|
+
await addItems(
|
|
10729
|
+
{
|
|
10730
|
+
items: [
|
|
10731
|
+
{
|
|
10732
|
+
title: data.title,
|
|
10733
|
+
quantity: data.quantity,
|
|
10734
|
+
unit_price: convertNumber(data.unit_price)
|
|
10735
|
+
}
|
|
10736
|
+
]
|
|
10809
10737
|
},
|
|
10810
10738
|
{
|
|
10811
10739
|
onSuccess: () => {
|
|
10812
|
-
|
|
10740
|
+
setIsOpen(STACKED_MODAL_ID, false);
|
|
10813
10741
|
},
|
|
10814
10742
|
onError: (e) => {
|
|
10815
10743
|
ui.toast.error(e.message);
|
|
@@ -10817,365 +10745,437 @@ const CustomItem = ({ item, preview, currencyCode }) => {
|
|
|
10817
10745
|
}
|
|
10818
10746
|
);
|
|
10819
10747
|
});
|
|
10820
|
-
return /* @__PURE__ */ jsxRuntime.jsx(Form$2, { ...form, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10821
|
-
/* @__PURE__ */ jsxRuntime.
|
|
10748
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Form$2, { ...form, children: /* @__PURE__ */ jsxRuntime.jsx(KeyboundForm, { onSubmit, children: /* @__PURE__ */ jsxRuntime.jsxs(StackedFocusModal.Content, { children: [
|
|
10749
|
+
/* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Header, {}),
|
|
10750
|
+
/* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Body, { className: "flex flex-1 flex-col overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-1 flex-col items-center overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full max-w-[720px] flex-col gap-y-6 px-2 py-16", children: [
|
|
10751
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
10752
|
+
/* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Add custom item" }) }),
|
|
10753
|
+
/* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Add a custom item to the order. This will add a new line item that is not associated with an existing product." }) })
|
|
10754
|
+
] }),
|
|
10755
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
|
|
10822
10756
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10823
|
-
|
|
10757
|
+
Form$2.Field,
|
|
10824
10758
|
{
|
|
10825
|
-
|
|
10826
|
-
|
|
10759
|
+
control: form.control,
|
|
10760
|
+
name: "title",
|
|
10761
|
+
render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
|
|
10762
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
10763
|
+
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Title" }),
|
|
10764
|
+
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Hint, { children: "Enter the title of the item" })
|
|
10765
|
+
] }),
|
|
10766
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
10767
|
+
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
|
|
10768
|
+
/* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
|
|
10769
|
+
] })
|
|
10770
|
+
] }) })
|
|
10827
10771
|
}
|
|
10828
10772
|
),
|
|
10829
|
-
|
|
10773
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
|
|
10774
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10830
10775
|
Form$2.Field,
|
|
10831
10776
|
{
|
|
10832
10777
|
control: form.control,
|
|
10833
|
-
name: "
|
|
10834
|
-
render: ({ field }) => {
|
|
10835
|
-
|
|
10836
|
-
|
|
10778
|
+
name: "unit_price",
|
|
10779
|
+
render: ({ field: { onChange, ...field } }) => /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
|
|
10780
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
10781
|
+
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Unit price" }),
|
|
10782
|
+
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Hint, { children: "Enter the unit price of the item" })
|
|
10783
|
+
] }),
|
|
10784
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
10785
|
+
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10786
|
+
ui.CurrencyInput,
|
|
10787
|
+
{
|
|
10788
|
+
symbol: getNativeSymbol(currencyCode),
|
|
10789
|
+
code: currencyCode,
|
|
10790
|
+
onValueChange: (_value, _name, values) => onChange(values == null ? void 0 : values.value),
|
|
10791
|
+
...field
|
|
10792
|
+
}
|
|
10793
|
+
) }),
|
|
10794
|
+
/* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
|
|
10795
|
+
] })
|
|
10796
|
+
] }) })
|
|
10837
10797
|
}
|
|
10838
|
-
)
|
|
10839
|
-
|
|
10840
|
-
|
|
10841
|
-
|
|
10842
|
-
|
|
10843
|
-
|
|
10844
|
-
|
|
10845
|
-
|
|
10846
|
-
|
|
10798
|
+
),
|
|
10799
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
|
|
10800
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10801
|
+
Form$2.Field,
|
|
10802
|
+
{
|
|
10803
|
+
control: form.control,
|
|
10804
|
+
name: "quantity",
|
|
10805
|
+
render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
|
|
10806
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
10807
|
+
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Quantity" }),
|
|
10808
|
+
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Hint, { children: "Enter the quantity of the item" })
|
|
10809
|
+
] }),
|
|
10810
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full flex-1", children: [
|
|
10811
|
+
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(NumberInput, { ...field, className: "w-full" }) }) }),
|
|
10812
|
+
/* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
|
|
10813
|
+
] })
|
|
10814
|
+
] }) })
|
|
10847
10815
|
}
|
|
10848
|
-
|
|
10849
|
-
)
|
|
10850
|
-
|
|
10851
|
-
|
|
10816
|
+
)
|
|
10817
|
+
] }) }) }),
|
|
10818
|
+
/* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
|
|
10819
|
+
/* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
|
|
10820
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "button", onClick: onSubmit, children: "Add item" })
|
|
10821
|
+
] }) })
|
|
10822
|
+
] }) }) });
|
|
10823
|
+
};
|
|
10824
|
+
const customItemSchema = objectType({
|
|
10825
|
+
title: stringType().min(1),
|
|
10826
|
+
quantity: numberType(),
|
|
10827
|
+
unit_price: unionType([numberType(), stringType()])
|
|
10828
|
+
});
|
|
10829
|
+
const InlineTip = React.forwardRef(
|
|
10830
|
+
({ variant = "tip", label, className, children, ...props }, ref) => {
|
|
10831
|
+
const labelValue = label || (variant === "warning" ? "Warning" : "Tip");
|
|
10832
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10833
|
+
"div",
|
|
10852
10834
|
{
|
|
10853
|
-
|
|
10854
|
-
|
|
10855
|
-
|
|
10856
|
-
|
|
10857
|
-
|
|
10835
|
+
ref,
|
|
10836
|
+
className: ui.clx(
|
|
10837
|
+
"bg-ui-bg-component txt-small text-ui-fg-subtle grid grid-cols-[4px_1fr] items-start gap-3 rounded-lg border p-3",
|
|
10838
|
+
className
|
|
10839
|
+
),
|
|
10840
|
+
...props,
|
|
10841
|
+
children: [
|
|
10842
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10843
|
+
"div",
|
|
10858
10844
|
{
|
|
10859
|
-
|
|
10860
|
-
|
|
10861
|
-
|
|
10862
|
-
|
|
10845
|
+
role: "presentation",
|
|
10846
|
+
className: ui.clx("w-4px bg-ui-tag-neutral-icon h-full rounded-full", {
|
|
10847
|
+
"bg-ui-tag-orange-icon": variant === "warning"
|
|
10848
|
+
})
|
|
10863
10849
|
}
|
|
10864
|
-
)
|
|
10865
|
-
|
|
10866
|
-
|
|
10867
|
-
|
|
10868
|
-
|
|
10869
|
-
|
|
10870
|
-
|
|
10871
|
-
|
|
10872
|
-
|
|
10873
|
-
|
|
10874
|
-
setEditing(true);
|
|
10875
|
-
},
|
|
10876
|
-
disabled: isPending,
|
|
10877
|
-
children: editing ? /* @__PURE__ */ jsxRuntime.jsx(icons.Check, {}) : /* @__PURE__ */ jsxRuntime.jsx(icons.PencilSquare, {})
|
|
10850
|
+
),
|
|
10851
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-pretty", children: [
|
|
10852
|
+
/* @__PURE__ */ jsxRuntime.jsxs("strong", { className: "txt-small-plus text-ui-fg-base", children: [
|
|
10853
|
+
labelValue,
|
|
10854
|
+
":"
|
|
10855
|
+
] }),
|
|
10856
|
+
" ",
|
|
10857
|
+
children
|
|
10858
|
+
] })
|
|
10859
|
+
]
|
|
10878
10860
|
}
|
|
10879
|
-
)
|
|
10880
|
-
] }) }) });
|
|
10881
|
-
};
|
|
10882
|
-
const StackedModalTrigger$1 = ({
|
|
10883
|
-
type,
|
|
10884
|
-
setModalContent
|
|
10885
|
-
}) => {
|
|
10886
|
-
const { setIsOpen } = useStackedModal();
|
|
10887
|
-
const onClick = React.useCallback(() => {
|
|
10888
|
-
setModalContent(type);
|
|
10889
|
-
setIsOpen(STACKED_MODAL_ID, true);
|
|
10890
|
-
}, [setModalContent, setIsOpen, type]);
|
|
10891
|
-
return /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Item, { onClick, children: type === "add-items" ? "Add items" : "Add custom item" }) });
|
|
10892
|
-
};
|
|
10893
|
-
const VARIANT_PREFIX = "items";
|
|
10894
|
-
const LIMIT = 50;
|
|
10895
|
-
const ExistingItemsForm = ({ orderId, items }) => {
|
|
10896
|
-
const { setIsOpen } = useStackedModal();
|
|
10897
|
-
const [rowSelection, setRowSelection] = React.useState(
|
|
10898
|
-
items.reduce((acc, item) => {
|
|
10899
|
-
acc[item.variant_id] = true;
|
|
10900
|
-
return acc;
|
|
10901
|
-
}, {})
|
|
10902
|
-
);
|
|
10903
|
-
React.useEffect(() => {
|
|
10904
|
-
setRowSelection(
|
|
10905
|
-
items.reduce((acc, item) => {
|
|
10906
|
-
if (item.variant_id) {
|
|
10907
|
-
acc[item.variant_id] = true;
|
|
10908
|
-
}
|
|
10909
|
-
return acc;
|
|
10910
|
-
}, {})
|
|
10911
10861
|
);
|
|
10912
|
-
}
|
|
10913
|
-
|
|
10914
|
-
|
|
10915
|
-
|
|
10916
|
-
)
|
|
10917
|
-
|
|
10918
|
-
|
|
10919
|
-
|
|
10920
|
-
|
|
10921
|
-
|
|
10922
|
-
|
|
10862
|
+
}
|
|
10863
|
+
);
|
|
10864
|
+
InlineTip.displayName = "InlineTip";
|
|
10865
|
+
const MetadataFieldSchema = objectType({
|
|
10866
|
+
key: stringType(),
|
|
10867
|
+
disabled: booleanType().optional(),
|
|
10868
|
+
value: anyType()
|
|
10869
|
+
});
|
|
10870
|
+
const MetadataSchema = objectType({
|
|
10871
|
+
metadata: arrayType(MetadataFieldSchema)
|
|
10872
|
+
});
|
|
10873
|
+
const Metadata = () => {
|
|
10874
|
+
const { id } = reactRouterDom.useParams();
|
|
10875
|
+
const { order, isPending, isError, error } = useOrder(id, {
|
|
10876
|
+
fields: "metadata"
|
|
10877
|
+
});
|
|
10878
|
+
if (isError) {
|
|
10879
|
+
throw error;
|
|
10880
|
+
}
|
|
10881
|
+
const isReady = !isPending && !!order;
|
|
10882
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { children: [
|
|
10883
|
+
/* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer.Header, { children: [
|
|
10884
|
+
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Metadata" }) }),
|
|
10885
|
+
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Add metadata to the draft order." }) })
|
|
10886
|
+
] }),
|
|
10887
|
+
!isReady ? /* @__PURE__ */ jsxRuntime.jsx(PlaceholderInner, {}) : /* @__PURE__ */ jsxRuntime.jsx(MetadataForm, { orderId: id, metadata: order == null ? void 0 : order.metadata })
|
|
10888
|
+
] });
|
|
10889
|
+
};
|
|
10890
|
+
const METADATA_KEY_LABEL_ID = "metadata-form-key-label";
|
|
10891
|
+
const METADATA_VALUE_LABEL_ID = "metadata-form-value-label";
|
|
10892
|
+
const MetadataForm = ({ orderId, metadata }) => {
|
|
10893
|
+
const { handleSuccess } = useRouteModal();
|
|
10894
|
+
const hasUneditableRows = getHasUneditableRows(metadata);
|
|
10895
|
+
const { mutateAsync, isPending } = useUpdateDraftOrder(orderId);
|
|
10896
|
+
const form = reactHookForm.useForm({
|
|
10897
|
+
defaultValues: {
|
|
10898
|
+
metadata: getDefaultValues(metadata)
|
|
10923
10899
|
},
|
|
10924
|
-
|
|
10925
|
-
|
|
10926
|
-
|
|
10927
|
-
|
|
10928
|
-
const columns = useColumns();
|
|
10929
|
-
const { mutateAsync } = useDraftOrderAddItems(orderId);
|
|
10930
|
-
const onSubmit = async () => {
|
|
10931
|
-
const ids = Object.keys(rowSelection).filter(
|
|
10932
|
-
(id) => !items.find((i) => i.variant_id === id)
|
|
10933
|
-
);
|
|
10900
|
+
resolver: zod.zodResolver(MetadataSchema)
|
|
10901
|
+
});
|
|
10902
|
+
const handleSubmit = form.handleSubmit(async (data) => {
|
|
10903
|
+
const parsedData = parseValues(data);
|
|
10934
10904
|
await mutateAsync(
|
|
10935
10905
|
{
|
|
10936
|
-
|
|
10937
|
-
variant_id: id,
|
|
10938
|
-
quantity: 1
|
|
10939
|
-
}))
|
|
10906
|
+
metadata: parsedData
|
|
10940
10907
|
},
|
|
10941
10908
|
{
|
|
10942
10909
|
onSuccess: () => {
|
|
10943
|
-
|
|
10944
|
-
|
|
10910
|
+
ui.toast.success("Metadata updated");
|
|
10911
|
+
handleSuccess();
|
|
10945
10912
|
},
|
|
10946
|
-
onError: (
|
|
10947
|
-
ui.toast.error(
|
|
10913
|
+
onError: (error) => {
|
|
10914
|
+
ui.toast.error(error.message);
|
|
10948
10915
|
}
|
|
10949
10916
|
}
|
|
10950
10917
|
);
|
|
10951
|
-
};
|
|
10952
|
-
|
|
10953
|
-
|
|
10918
|
+
});
|
|
10919
|
+
const { fields, insert, remove } = reactHookForm.useFieldArray({
|
|
10920
|
+
control: form.control,
|
|
10921
|
+
name: "metadata"
|
|
10922
|
+
});
|
|
10923
|
+
function deleteRow(index) {
|
|
10924
|
+
remove(index);
|
|
10925
|
+
if (fields.length === 1) {
|
|
10926
|
+
insert(0, {
|
|
10927
|
+
key: "",
|
|
10928
|
+
value: "",
|
|
10929
|
+
disabled: false
|
|
10930
|
+
});
|
|
10931
|
+
}
|
|
10954
10932
|
}
|
|
10955
|
-
|
|
10956
|
-
|
|
10933
|
+
function insertRow(index, position) {
|
|
10934
|
+
insert(index + (position === "above" ? 0 : 1), {
|
|
10935
|
+
key: "",
|
|
10936
|
+
value: "",
|
|
10937
|
+
disabled: false
|
|
10938
|
+
});
|
|
10939
|
+
}
|
|
10940
|
+
return /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10941
|
+
KeyboundForm,
|
|
10957
10942
|
{
|
|
10958
|
-
|
|
10959
|
-
|
|
10960
|
-
const searchInput = document.querySelector(
|
|
10961
|
-
"[data-modal-id='modal-search-input']"
|
|
10962
|
-
);
|
|
10963
|
-
if (searchInput) {
|
|
10964
|
-
searchInput.focus();
|
|
10965
|
-
}
|
|
10966
|
-
},
|
|
10943
|
+
onSubmit: handleSubmit,
|
|
10944
|
+
className: "flex flex-1 flex-col overflow-hidden",
|
|
10967
10945
|
children: [
|
|
10968
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
10969
|
-
/* @__PURE__ */ jsxRuntime.
|
|
10970
|
-
|
|
10971
|
-
|
|
10972
|
-
|
|
10973
|
-
|
|
10974
|
-
|
|
10975
|
-
|
|
10976
|
-
|
|
10977
|
-
|
|
10978
|
-
|
|
10979
|
-
rowCount: count,
|
|
10980
|
-
prefix: VARIANT_PREFIX,
|
|
10981
|
-
layout: "fill",
|
|
10982
|
-
rowSelection: {
|
|
10983
|
-
state: rowSelection,
|
|
10984
|
-
onRowSelectionChange: setRowSelection,
|
|
10985
|
-
enableRowSelection: (row) => {
|
|
10986
|
-
return !items.find((i) => i.variant_id === row.original.id);
|
|
10946
|
+
/* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer.Body, { className: "flex flex-1 flex-col gap-y-8 overflow-y-auto", children: [
|
|
10947
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-ui-bg-base shadow-elevation-card-rest grid grid-cols-1 divide-y rounded-lg", children: [
|
|
10948
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-ui-bg-subtle grid grid-cols-2 divide-x rounded-t-lg", children: [
|
|
10949
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "txt-compact-small-plus text-ui-fg-subtle px-2 py-1.5", children: /* @__PURE__ */ jsxRuntime.jsx("label", { id: METADATA_KEY_LABEL_ID, children: "Key" }) }),
|
|
10950
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "txt-compact-small-plus text-ui-fg-subtle px-2 py-1.5", children: /* @__PURE__ */ jsxRuntime.jsx("label", { id: METADATA_VALUE_LABEL_ID, children: "Value" }) })
|
|
10951
|
+
] }),
|
|
10952
|
+
fields.map((field, index) => {
|
|
10953
|
+
const isDisabled = field.disabled || false;
|
|
10954
|
+
let placeholder = "-";
|
|
10955
|
+
if (typeof field.value === "object") {
|
|
10956
|
+
placeholder = "{ ... }";
|
|
10987
10957
|
}
|
|
10988
|
-
|
|
10989
|
-
|
|
10990
|
-
|
|
10991
|
-
|
|
10992
|
-
|
|
10993
|
-
|
|
10994
|
-
|
|
10958
|
+
if (Array.isArray(field.value)) {
|
|
10959
|
+
placeholder = "[ ... ]";
|
|
10960
|
+
}
|
|
10961
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
10962
|
+
ConditionalTooltip,
|
|
10963
|
+
{
|
|
10964
|
+
showTooltip: isDisabled,
|
|
10965
|
+
content: "This row is disabled because it contains non-primitive data.",
|
|
10966
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "group/table relative", children: [
|
|
10967
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
10968
|
+
"div",
|
|
10969
|
+
{
|
|
10970
|
+
className: ui.clx("grid grid-cols-2 divide-x", {
|
|
10971
|
+
"overflow-hidden rounded-b-lg": index === fields.length - 1
|
|
10972
|
+
}),
|
|
10973
|
+
children: [
|
|
10974
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10975
|
+
Form$2.Field,
|
|
10976
|
+
{
|
|
10977
|
+
control: form.control,
|
|
10978
|
+
name: `metadata.${index}.key`,
|
|
10979
|
+
render: ({ field: field2 }) => {
|
|
10980
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10981
|
+
GridInput,
|
|
10982
|
+
{
|
|
10983
|
+
"aria-labelledby": METADATA_KEY_LABEL_ID,
|
|
10984
|
+
...field2,
|
|
10985
|
+
disabled: isDisabled,
|
|
10986
|
+
placeholder: "Key"
|
|
10987
|
+
}
|
|
10988
|
+
) }) });
|
|
10989
|
+
}
|
|
10990
|
+
}
|
|
10991
|
+
),
|
|
10992
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10993
|
+
Form$2.Field,
|
|
10994
|
+
{
|
|
10995
|
+
control: form.control,
|
|
10996
|
+
name: `metadata.${index}.value`,
|
|
10997
|
+
render: ({ field: { value, ...field2 } }) => {
|
|
10998
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10999
|
+
GridInput,
|
|
11000
|
+
{
|
|
11001
|
+
"aria-labelledby": METADATA_VALUE_LABEL_ID,
|
|
11002
|
+
...field2,
|
|
11003
|
+
value: isDisabled ? placeholder : value,
|
|
11004
|
+
disabled: isDisabled,
|
|
11005
|
+
placeholder: "Value"
|
|
11006
|
+
}
|
|
11007
|
+
) }) });
|
|
11008
|
+
}
|
|
11009
|
+
}
|
|
11010
|
+
)
|
|
11011
|
+
]
|
|
11012
|
+
}
|
|
11013
|
+
),
|
|
11014
|
+
/* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
|
|
11015
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11016
|
+
ui.DropdownMenu.Trigger,
|
|
11017
|
+
{
|
|
11018
|
+
className: ui.clx(
|
|
11019
|
+
"invisible absolute inset-y-0 -right-2.5 my-auto group-hover/table:visible data-[state='open']:visible",
|
|
11020
|
+
{
|
|
11021
|
+
hidden: isDisabled
|
|
11022
|
+
}
|
|
11023
|
+
),
|
|
11024
|
+
disabled: isDisabled,
|
|
11025
|
+
asChild: true,
|
|
11026
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(ui.IconButton, { size: "2xsmall", children: /* @__PURE__ */ jsxRuntime.jsx(icons.EllipsisVertical, {}) })
|
|
11027
|
+
}
|
|
11028
|
+
),
|
|
11029
|
+
/* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu.Content, { children: [
|
|
11030
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
11031
|
+
ui.DropdownMenu.Item,
|
|
11032
|
+
{
|
|
11033
|
+
className: "gap-x-2",
|
|
11034
|
+
onClick: () => insertRow(index, "above"),
|
|
11035
|
+
children: [
|
|
11036
|
+
/* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpMini, { className: "text-ui-fg-subtle" }),
|
|
11037
|
+
"Insert row above"
|
|
11038
|
+
]
|
|
11039
|
+
}
|
|
11040
|
+
),
|
|
11041
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
11042
|
+
ui.DropdownMenu.Item,
|
|
11043
|
+
{
|
|
11044
|
+
className: "gap-x-2",
|
|
11045
|
+
onClick: () => insertRow(index, "below"),
|
|
11046
|
+
children: [
|
|
11047
|
+
/* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownMini, { className: "text-ui-fg-subtle" }),
|
|
11048
|
+
"Insert row below"
|
|
11049
|
+
]
|
|
11050
|
+
}
|
|
11051
|
+
),
|
|
11052
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Separator, {}),
|
|
11053
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
11054
|
+
ui.DropdownMenu.Item,
|
|
11055
|
+
{
|
|
11056
|
+
className: "gap-x-2",
|
|
11057
|
+
onClick: () => deleteRow(index),
|
|
11058
|
+
children: [
|
|
11059
|
+
/* @__PURE__ */ jsxRuntime.jsx(icons.Trash, { className: "text-ui-fg-subtle" }),
|
|
11060
|
+
"Delete row"
|
|
11061
|
+
]
|
|
11062
|
+
}
|
|
11063
|
+
)
|
|
11064
|
+
] })
|
|
11065
|
+
] })
|
|
11066
|
+
] })
|
|
11067
|
+
},
|
|
11068
|
+
field.id
|
|
11069
|
+
);
|
|
11070
|
+
})
|
|
11071
|
+
] }),
|
|
11072
|
+
hasUneditableRows && /* @__PURE__ */ jsxRuntime.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." })
|
|
11073
|
+
] }),
|
|
11074
|
+
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
|
|
11075
|
+
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
|
|
11076
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "submit", isLoading: isPending, children: "Save" })
|
|
10995
11077
|
] }) })
|
|
10996
11078
|
]
|
|
10997
11079
|
}
|
|
10998
|
-
);
|
|
11080
|
+
) });
|
|
10999
11081
|
};
|
|
11000
|
-
const
|
|
11001
|
-
|
|
11002
|
-
|
|
11082
|
+
const GridInput = React.forwardRef(({ className, ...props }, ref) => {
|
|
11083
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
11084
|
+
"input",
|
|
11085
|
+
{
|
|
11086
|
+
ref,
|
|
11087
|
+
...props,
|
|
11088
|
+
autoComplete: "off",
|
|
11089
|
+
className: ui.clx(
|
|
11090
|
+
"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",
|
|
11091
|
+
className
|
|
11092
|
+
)
|
|
11093
|
+
}
|
|
11094
|
+
);
|
|
11095
|
+
});
|
|
11096
|
+
GridInput.displayName = "MetadataForm.GridInput";
|
|
11097
|
+
const PlaceholderInner = () => {
|
|
11098
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 flex-col overflow-hidden", children: [
|
|
11099
|
+
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Body, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Skeleton, { className: "h-[148ox] w-full rounded-lg" }) }),
|
|
11100
|
+
/* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
|
|
11101
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Skeleton, { className: "h-7 w-12 rounded-md" }),
|
|
11102
|
+
/* @__PURE__ */ jsxRuntime.jsx(ui.Skeleton, { className: "h-7 w-12 rounded-md" })
|
|
11103
|
+
] }) })
|
|
11104
|
+
] });
|
|
11105
|
+
};
|
|
11106
|
+
const EDITABLE_TYPES = ["string", "number", "boolean"];
|
|
11107
|
+
function getDefaultValues(metadata) {
|
|
11108
|
+
if (!metadata || !Object.keys(metadata).length) {
|
|
11003
11109
|
return [
|
|
11004
|
-
|
|
11005
|
-
|
|
11006
|
-
|
|
11007
|
-
|
|
11008
|
-
|
|
11009
|
-
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-2", children: [
|
|
11010
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11011
|
-
Thumbnail,
|
|
11012
|
-
{
|
|
11013
|
-
thumbnail: (_a = row.original.product) == null ? void 0 : _a.thumbnail,
|
|
11014
|
-
alt: (_b = row.original.product) == null ? void 0 : _b.title
|
|
11015
|
-
}
|
|
11016
|
-
),
|
|
11017
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { children: (_c = row.original.product) == null ? void 0 : _c.title })
|
|
11018
|
-
] });
|
|
11019
|
-
},
|
|
11020
|
-
enableSorting: true
|
|
11021
|
-
}),
|
|
11022
|
-
columnHelper.accessor("title", {
|
|
11023
|
-
header: "Variant",
|
|
11024
|
-
enableSorting: true
|
|
11025
|
-
}),
|
|
11026
|
-
columnHelper.accessor("sku", {
|
|
11027
|
-
header: "SKU",
|
|
11028
|
-
cell: ({ getValue }) => {
|
|
11029
|
-
return getValue() ?? "-";
|
|
11030
|
-
},
|
|
11031
|
-
enableSorting: true
|
|
11032
|
-
}),
|
|
11033
|
-
columnHelper.accessor("updated_at", {
|
|
11034
|
-
header: "Updated",
|
|
11035
|
-
cell: ({ getValue }) => {
|
|
11036
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
11037
|
-
ui.Tooltip,
|
|
11038
|
-
{
|
|
11039
|
-
content: getFullDate({ date: getValue(), includeTime: true }),
|
|
11040
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: getFullDate({ date: getValue() }) })
|
|
11041
|
-
}
|
|
11042
|
-
);
|
|
11043
|
-
},
|
|
11044
|
-
enableSorting: true,
|
|
11045
|
-
sortAscLabel: "Oldest first",
|
|
11046
|
-
sortDescLabel: "Newest first"
|
|
11047
|
-
}),
|
|
11048
|
-
columnHelper.accessor("created_at", {
|
|
11049
|
-
header: "Created",
|
|
11050
|
-
cell: ({ getValue }) => {
|
|
11051
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
11052
|
-
ui.Tooltip,
|
|
11053
|
-
{
|
|
11054
|
-
content: getFullDate({ date: getValue(), includeTime: true }),
|
|
11055
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: getFullDate({ date: getValue() }) })
|
|
11056
|
-
}
|
|
11057
|
-
);
|
|
11058
|
-
},
|
|
11059
|
-
enableSorting: true,
|
|
11060
|
-
sortAscLabel: "Oldest first",
|
|
11061
|
-
sortDescLabel: "Newest first"
|
|
11062
|
-
})
|
|
11110
|
+
{
|
|
11111
|
+
key: "",
|
|
11112
|
+
value: "",
|
|
11113
|
+
disabled: false
|
|
11114
|
+
}
|
|
11063
11115
|
];
|
|
11064
|
-
}
|
|
11065
|
-
|
|
11066
|
-
|
|
11067
|
-
|
|
11068
|
-
|
|
11069
|
-
|
|
11070
|
-
|
|
11071
|
-
|
|
11072
|
-
|
|
11073
|
-
|
|
11074
|
-
|
|
11075
|
-
|
|
11116
|
+
}
|
|
11117
|
+
return Object.entries(metadata).map(([key, value]) => {
|
|
11118
|
+
if (!EDITABLE_TYPES.includes(typeof value)) {
|
|
11119
|
+
return {
|
|
11120
|
+
key,
|
|
11121
|
+
value,
|
|
11122
|
+
disabled: true
|
|
11123
|
+
};
|
|
11124
|
+
}
|
|
11125
|
+
let stringValue = value;
|
|
11126
|
+
if (typeof value !== "string") {
|
|
11127
|
+
stringValue = JSON.stringify(value);
|
|
11128
|
+
}
|
|
11129
|
+
return {
|
|
11130
|
+
key,
|
|
11131
|
+
value: stringValue,
|
|
11132
|
+
original_key: key
|
|
11133
|
+
};
|
|
11076
11134
|
});
|
|
11077
|
-
|
|
11078
|
-
|
|
11079
|
-
|
|
11080
|
-
|
|
11081
|
-
|
|
11082
|
-
|
|
11083
|
-
|
|
11084
|
-
|
|
11085
|
-
|
|
11086
|
-
|
|
11087
|
-
|
|
11088
|
-
|
|
11089
|
-
|
|
11090
|
-
|
|
11091
|
-
|
|
11092
|
-
|
|
11093
|
-
|
|
11094
|
-
|
|
11135
|
+
}
|
|
11136
|
+
function parseValues(values) {
|
|
11137
|
+
const metadata = values.metadata;
|
|
11138
|
+
const isEmpty = !metadata.length || metadata.length === 1 && !metadata[0].key && !metadata[0].value;
|
|
11139
|
+
if (isEmpty) {
|
|
11140
|
+
return null;
|
|
11141
|
+
}
|
|
11142
|
+
const update = {};
|
|
11143
|
+
metadata.forEach((field) => {
|
|
11144
|
+
let key = field.key;
|
|
11145
|
+
let value = field.value;
|
|
11146
|
+
const disabled = field.disabled;
|
|
11147
|
+
if (!key || !value) {
|
|
11148
|
+
return;
|
|
11149
|
+
}
|
|
11150
|
+
if (disabled) {
|
|
11151
|
+
update[key] = value;
|
|
11152
|
+
return;
|
|
11153
|
+
}
|
|
11154
|
+
key = key.trim();
|
|
11155
|
+
value = value.trim();
|
|
11156
|
+
if (value === "true") {
|
|
11157
|
+
update[key] = true;
|
|
11158
|
+
} else if (value === "false") {
|
|
11159
|
+
update[key] = false;
|
|
11160
|
+
} else {
|
|
11161
|
+
const parsedNumber = parseFloat(value);
|
|
11162
|
+
if (!isNaN(parsedNumber)) {
|
|
11163
|
+
update[key] = parsedNumber;
|
|
11164
|
+
} else {
|
|
11165
|
+
update[key] = value;
|
|
11095
11166
|
}
|
|
11096
|
-
|
|
11167
|
+
}
|
|
11097
11168
|
});
|
|
11098
|
-
return
|
|
11099
|
-
|
|
11100
|
-
|
|
11101
|
-
|
|
11102
|
-
|
|
11103
|
-
|
|
11104
|
-
|
|
11105
|
-
|
|
11106
|
-
|
|
11107
|
-
|
|
11108
|
-
{
|
|
11109
|
-
control: form.control,
|
|
11110
|
-
name: "title",
|
|
11111
|
-
render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
|
|
11112
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
11113
|
-
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Title" }),
|
|
11114
|
-
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Hint, { children: "Enter the title of the item" })
|
|
11115
|
-
] }),
|
|
11116
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
11117
|
-
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
|
|
11118
|
-
/* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
|
|
11119
|
-
] })
|
|
11120
|
-
] }) })
|
|
11121
|
-
}
|
|
11122
|
-
),
|
|
11123
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
|
|
11124
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11125
|
-
Form$2.Field,
|
|
11126
|
-
{
|
|
11127
|
-
control: form.control,
|
|
11128
|
-
name: "unit_price",
|
|
11129
|
-
render: ({ field: { onChange, ...field } }) => /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
|
|
11130
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
11131
|
-
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Unit price" }),
|
|
11132
|
-
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Hint, { children: "Enter the unit price of the item" })
|
|
11133
|
-
] }),
|
|
11134
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
11135
|
-
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
11136
|
-
ui.CurrencyInput,
|
|
11137
|
-
{
|
|
11138
|
-
symbol: getNativeSymbol(currencyCode),
|
|
11139
|
-
code: currencyCode,
|
|
11140
|
-
onValueChange: (_value, _name, values) => onChange(values == null ? void 0 : values.value),
|
|
11141
|
-
...field
|
|
11142
|
-
}
|
|
11143
|
-
) }),
|
|
11144
|
-
/* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
|
|
11145
|
-
] })
|
|
11146
|
-
] }) })
|
|
11147
|
-
}
|
|
11148
|
-
),
|
|
11149
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
|
|
11150
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11151
|
-
Form$2.Field,
|
|
11152
|
-
{
|
|
11153
|
-
control: form.control,
|
|
11154
|
-
name: "quantity",
|
|
11155
|
-
render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
|
|
11156
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
11157
|
-
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Quantity" }),
|
|
11158
|
-
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Hint, { children: "Enter the quantity of the item" })
|
|
11159
|
-
] }),
|
|
11160
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full flex-1", children: [
|
|
11161
|
-
/* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(NumberInput, { ...field, className: "w-full" }) }) }),
|
|
11162
|
-
/* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
|
|
11163
|
-
] })
|
|
11164
|
-
] }) })
|
|
11165
|
-
}
|
|
11166
|
-
)
|
|
11167
|
-
] }) }) }),
|
|
11168
|
-
/* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
|
|
11169
|
-
/* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
|
|
11170
|
-
/* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "button", onClick: onSubmit, children: "Add item" })
|
|
11171
|
-
] }) })
|
|
11172
|
-
] }) }) });
|
|
11173
|
-
};
|
|
11174
|
-
const customItemSchema = objectType({
|
|
11175
|
-
title: stringType().min(1),
|
|
11176
|
-
quantity: numberType(),
|
|
11177
|
-
unit_price: unionType([numberType(), stringType()])
|
|
11178
|
-
});
|
|
11169
|
+
return update;
|
|
11170
|
+
}
|
|
11171
|
+
function getHasUneditableRows(metadata) {
|
|
11172
|
+
if (!metadata) {
|
|
11173
|
+
return false;
|
|
11174
|
+
}
|
|
11175
|
+
return Object.values(metadata).some(
|
|
11176
|
+
(value) => !EDITABLE_TYPES.includes(typeof value)
|
|
11177
|
+
);
|
|
11178
|
+
}
|
|
11179
11179
|
const PROMOTION_QUERY_KEY = "promotions";
|
|
11180
11180
|
const promotionsQueryKeys = {
|
|
11181
11181
|
list: (query2) => [
|
|
@@ -13065,26 +13065,26 @@ const routeModule = {
|
|
|
13065
13065
|
handle,
|
|
13066
13066
|
loader,
|
|
13067
13067
|
children: [
|
|
13068
|
-
{
|
|
13069
|
-
Component: CustomItems,
|
|
13070
|
-
path: "/draft-orders/:id/custom-items"
|
|
13071
|
-
},
|
|
13072
13068
|
{
|
|
13073
13069
|
Component: BillingAddress,
|
|
13074
13070
|
path: "/draft-orders/:id/billing-address"
|
|
13075
13071
|
},
|
|
13076
13072
|
{
|
|
13077
|
-
Component:
|
|
13078
|
-
path: "/draft-orders/:id/
|
|
13073
|
+
Component: CustomItems,
|
|
13074
|
+
path: "/draft-orders/:id/custom-items"
|
|
13079
13075
|
},
|
|
13080
13076
|
{
|
|
13081
|
-
Component:
|
|
13082
|
-
path: "/draft-orders/:id/
|
|
13077
|
+
Component: Email,
|
|
13078
|
+
path: "/draft-orders/:id/email"
|
|
13083
13079
|
},
|
|
13084
13080
|
{
|
|
13085
13081
|
Component: Items,
|
|
13086
13082
|
path: "/draft-orders/:id/items"
|
|
13087
13083
|
},
|
|
13084
|
+
{
|
|
13085
|
+
Component: Metadata,
|
|
13086
|
+
path: "/draft-orders/:id/metadata"
|
|
13087
|
+
},
|
|
13088
13088
|
{
|
|
13089
13089
|
Component: Promotions,
|
|
13090
13090
|
path: "/draft-orders/:id/promotions"
|