@medusajs/draft-order 2.11.1-preview-20251025120209 → 2.11.1-preview-20251025150201

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.
@@ -9571,27 +9571,6 @@ const ID = () => {
9571
9571
  /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Outlet, {})
9572
9572
  ] });
9573
9573
  };
9574
- const CustomItems = () => {
9575
- return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { children: [
9576
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Custom Items" }) }) }),
9577
- /* @__PURE__ */ jsxRuntime.jsx(CustomItemsForm, {})
9578
- ] });
9579
- };
9580
- const CustomItemsForm = () => {
9581
- const form = reactHookForm.useForm({
9582
- resolver: zod.zodResolver(schema$5)
9583
- });
9584
- return /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxRuntime.jsxs(KeyboundForm, { className: "flex flex-1 flex-col", children: [
9585
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Body, {}),
9586
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2", children: [
9587
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
9588
- /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "submit", children: "Save" })
9589
- ] }) })
9590
- ] }) });
9591
- };
9592
- const schema$5 = objectType({
9593
- email: stringType().email()
9594
- });
9595
9574
  const BillingAddress = () => {
9596
9575
  const { id } = reactRouterDom.useParams();
9597
9576
  const { order, isPending, isError, error } = useOrder(id, {
@@ -9624,7 +9603,7 @@ const BillingAddressForm = ({ order }) => {
9624
9603
  postal_code: ((_i = order.billing_address) == null ? void 0 : _i.postal_code) ?? "",
9625
9604
  phone: ((_j = order.billing_address) == null ? void 0 : _j.phone) ?? ""
9626
9605
  },
9627
- resolver: zod.zodResolver(schema$4)
9606
+ resolver: zod.zodResolver(schema$5)
9628
9607
  });
9629
9608
  const { mutateAsync, isPending } = useUpdateDraftOrder(order.id);
9630
9609
  const { handleSuccess } = useRouteModal();
@@ -9781,7 +9760,7 @@ const BillingAddressForm = ({ order }) => {
9781
9760
  }
9782
9761
  ) });
9783
9762
  };
9784
- const schema$4 = addressSchema;
9763
+ const schema$5 = addressSchema;
9785
9764
  const Email = () => {
9786
9765
  const { id } = reactRouterDom.useParams();
9787
9766
  const { order, isPending, isError, error } = useOrder(id, {
@@ -9804,7 +9783,7 @@ const EmailForm = ({ order }) => {
9804
9783
  defaultValues: {
9805
9784
  email: order.email ?? ""
9806
9785
  },
9807
- resolver: zod.zodResolver(schema$3)
9786
+ resolver: zod.zodResolver(schema$4)
9808
9787
  });
9809
9788
  const { mutateAsync, isPending } = useUpdateDraftOrder(order.id);
9810
9789
  const { handleSuccess } = useRouteModal();
@@ -9847,1069 +9826,95 @@ const EmailForm = ({ order }) => {
9847
9826
  }
9848
9827
  ) });
9849
9828
  };
9850
- const schema$3 = objectType({
9829
+ const schema$4 = objectType({
9851
9830
  email: stringType().email()
9852
9831
  });
9853
- const NumberInput = React.forwardRef(
9854
- ({
9855
- value,
9856
- onChange,
9857
- size = "base",
9858
- min = 0,
9859
- max = 100,
9860
- step = 1,
9861
- className,
9862
- disabled,
9863
- ...props
9864
- }, ref) => {
9865
- const handleChange = (event) => {
9866
- const newValue = event.target.value === "" ? min : Number(event.target.value);
9867
- if (!isNaN(newValue) && (max === void 0 || newValue <= max) && (min === void 0 || newValue >= min)) {
9868
- onChange(newValue);
9869
- }
9870
- };
9871
- const handleIncrement = () => {
9872
- const newValue = value + step;
9873
- if (max === void 0 || newValue <= max) {
9874
- onChange(newValue);
9875
- }
9876
- };
9877
- const handleDecrement = () => {
9878
- const newValue = value - step;
9879
- if (min === void 0 || newValue >= min) {
9880
- onChange(newValue);
9881
- }
9882
- };
9832
+ const InlineTip = React.forwardRef(
9833
+ ({ variant = "tip", label, className, children, ...props }, ref) => {
9834
+ const labelValue = label || (variant === "warning" ? "Warning" : "Tip");
9883
9835
  return /* @__PURE__ */ jsxRuntime.jsxs(
9884
9836
  "div",
9885
9837
  {
9838
+ ref,
9886
9839
  className: ui.clx(
9887
- "inline-flex rounded-md bg-ui-bg-field shadow-borders-base overflow-hidden divide-x transition-fg",
9888
- "[&:has(input:focus)]:shadow-borders-interactive-with-active",
9889
- {
9890
- "h-7": size === "small",
9891
- "h-8": size === "base"
9892
- },
9840
+ "bg-ui-bg-component txt-small text-ui-fg-subtle grid grid-cols-[4px_1fr] items-start gap-3 rounded-lg border p-3",
9893
9841
  className
9894
9842
  ),
9843
+ ...props,
9895
9844
  children: [
9896
9845
  /* @__PURE__ */ jsxRuntime.jsx(
9897
- "input",
9898
- {
9899
- ref,
9900
- type: "number",
9901
- value,
9902
- onChange: handleChange,
9903
- min,
9904
- max,
9905
- step,
9906
- className: ui.clx(
9907
- "flex-1 px-2 py-1 bg-transparent txt-compact-small text-ui-fg-base outline-none [appearance:textfield]",
9908
- "[&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none",
9909
- "placeholder:text-ui-fg-muted"
9910
- ),
9911
- ...props
9912
- }
9913
- ),
9914
- /* @__PURE__ */ jsxRuntime.jsxs(
9915
- "button",
9846
+ "div",
9916
9847
  {
9917
- className: ui.clx(
9918
- "flex items-center justify-center outline-none transition-fg",
9919
- "disabled:cursor-not-allowed disabled:text-ui-fg-muted",
9920
- "focus:bg-ui-bg-field-component-hover",
9921
- "hover:bg-ui-bg-field-component-hover",
9922
- {
9923
- "size-7": size === "small",
9924
- "size-8": size === "base"
9925
- }
9926
- ),
9927
- type: "button",
9928
- onClick: handleDecrement,
9929
- disabled: min !== void 0 && value <= min || disabled,
9930
- children: [
9931
- /* @__PURE__ */ jsxRuntime.jsx(icons.Minus, {}),
9932
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: `Decrease by ${step}` })
9933
- ]
9848
+ role: "presentation",
9849
+ className: ui.clx("w-4px bg-ui-tag-neutral-icon h-full rounded-full", {
9850
+ "bg-ui-tag-orange-icon": variant === "warning"
9851
+ })
9934
9852
  }
9935
9853
  ),
9936
- /* @__PURE__ */ jsxRuntime.jsxs(
9937
- "button",
9938
- {
9939
- className: ui.clx(
9940
- "flex items-center justify-center outline-none transition-fg",
9941
- "disabled:cursor-not-allowed disabled:text-ui-fg-muted",
9942
- "focus:bg-ui-bg-field-hover",
9943
- "hover:bg-ui-bg-field-hover",
9944
- {
9945
- "size-7": size === "small",
9946
- "size-8": size === "base"
9947
- }
9948
- ),
9949
- type: "button",
9950
- onClick: handleIncrement,
9951
- disabled: max !== void 0 && value >= max || disabled,
9952
- children: [
9953
- /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}),
9954
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: `Increase by ${step}` })
9955
- ]
9956
- }
9957
- )
9854
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-pretty", children: [
9855
+ /* @__PURE__ */ jsxRuntime.jsxs("strong", { className: "txt-small-plus text-ui-fg-base", children: [
9856
+ labelValue,
9857
+ ":"
9858
+ ] }),
9859
+ " ",
9860
+ children
9861
+ ] })
9958
9862
  ]
9959
9863
  }
9960
9864
  );
9961
9865
  }
9962
9866
  );
9963
- const PRODUCT_VARIANTS_QUERY_KEY = "product-variants";
9964
- const productVariantsQueryKeys = {
9965
- list: (query2) => [
9966
- PRODUCT_VARIANTS_QUERY_KEY,
9967
- query2 ? query2 : void 0
9968
- ]
9969
- };
9970
- const useProductVariants = (query2, options) => {
9971
- const { data, ...rest } = reactQuery.useQuery({
9972
- queryKey: productVariantsQueryKeys.list(query2),
9973
- queryFn: async () => await sdk.admin.productVariant.list(query2),
9974
- ...options
9975
- });
9976
- return { ...data, ...rest };
9977
- };
9978
- const useCancelOrderEdit = ({ preview }) => {
9979
- const { mutateAsync: cancelOrderEdit } = useDraftOrderCancelEdit(preview == null ? void 0 : preview.id);
9980
- const onCancel = React.useCallback(async () => {
9981
- if (!preview) {
9982
- return true;
9983
- }
9984
- let res = false;
9985
- await cancelOrderEdit(void 0, {
9986
- onError: (e) => {
9987
- ui.toast.error(e.message);
9988
- },
9989
- onSuccess: () => {
9990
- res = true;
9991
- }
9992
- });
9993
- return res;
9994
- }, [preview, cancelOrderEdit]);
9995
- return { onCancel };
9996
- };
9997
- let IS_REQUEST_RUNNING = false;
9998
- const useInitiateOrderEdit = ({
9999
- preview
10000
- }) => {
10001
- const navigate = reactRouterDom.useNavigate();
10002
- const { mutateAsync } = useDraftOrderBeginEdit(preview == null ? void 0 : preview.id);
10003
- React.useEffect(() => {
10004
- async function run() {
10005
- if (IS_REQUEST_RUNNING || !preview) {
10006
- return;
10007
- }
10008
- if (preview.order_change) {
10009
- return;
10010
- }
10011
- IS_REQUEST_RUNNING = true;
10012
- await mutateAsync(void 0, {
10013
- onError: (e) => {
10014
- ui.toast.error(e.message);
10015
- navigate(`/draft-orders/${preview.id}`, { replace: true });
10016
- return;
10017
- }
10018
- });
10019
- IS_REQUEST_RUNNING = false;
10020
- }
10021
- run();
10022
- }, [preview, navigate, mutateAsync]);
10023
- };
10024
- function convertNumber(value) {
10025
- return typeof value === "string" ? Number(value.replace(",", ".")) : value;
10026
- }
10027
- const STACKED_MODAL_ID = "items_stacked_modal";
10028
- const Items = () => {
9867
+ InlineTip.displayName = "InlineTip";
9868
+ const MetadataFieldSchema = objectType({
9869
+ key: stringType(),
9870
+ disabled: booleanType().optional(),
9871
+ value: anyType()
9872
+ });
9873
+ const MetadataSchema = objectType({
9874
+ metadata: arrayType(MetadataFieldSchema)
9875
+ });
9876
+ const Metadata = () => {
10029
9877
  const { id } = reactRouterDom.useParams();
10030
- const {
10031
- order: preview,
10032
- isPending: isPreviewPending,
10033
- isError: isPreviewError,
10034
- error: previewError
10035
- } = useOrderPreview(id, void 0, {
10036
- placeholderData: reactQuery.keepPreviousData
9878
+ const { order, isPending, isError, error } = useOrder(id, {
9879
+ fields: "metadata"
10037
9880
  });
10038
- useInitiateOrderEdit({ preview });
10039
- const { draft_order, isPending, isError, error } = useDraftOrder(
10040
- id,
10041
- {
10042
- fields: "currency_code"
10043
- },
10044
- {
10045
- enabled: !!id
10046
- }
10047
- );
10048
- const { onCancel } = useCancelOrderEdit({ preview });
10049
9881
  if (isError) {
10050
9882
  throw error;
10051
9883
  }
10052
- if (isPreviewError) {
10053
- throw previewError;
10054
- }
10055
- const ready = !!preview && !isPreviewPending && !!draft_order && !isPending;
10056
- return /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal, { onClose: onCancel, children: ready ? /* @__PURE__ */ jsxRuntime.jsx(ItemsForm, { preview, currencyCode: draft_order.currency_code }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
10057
- /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Edit Items" }) }),
10058
- /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Loading data for the draft order, please wait..." }) })
10059
- ] }) });
9884
+ const isReady = !isPending && !!order;
9885
+ return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { children: [
9886
+ /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer.Header, { children: [
9887
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Metadata" }) }),
9888
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Add metadata to the draft order." }) })
9889
+ ] }),
9890
+ !isReady ? /* @__PURE__ */ jsxRuntime.jsx(PlaceholderInner, {}) : /* @__PURE__ */ jsxRuntime.jsx(MetadataForm, { orderId: id, metadata: order == null ? void 0 : order.metadata })
9891
+ ] });
10060
9892
  };
10061
- const ItemsForm = ({ preview, currencyCode }) => {
10062
- var _a;
10063
- const [isSubmitting, setIsSubmitting] = React.useState(false);
10064
- const [modalContent, setModalContent] = React.useState(
10065
- null
10066
- );
9893
+ const METADATA_KEY_LABEL_ID = "metadata-form-key-label";
9894
+ const METADATA_VALUE_LABEL_ID = "metadata-form-value-label";
9895
+ const MetadataForm = ({ orderId, metadata }) => {
10067
9896
  const { handleSuccess } = useRouteModal();
10068
- const { searchValue, onSearchValueChange, query: query2 } = useDebouncedSearch();
10069
- const { mutateAsync: confirmOrderEdit } = useDraftOrderConfirmEdit(preview.id);
10070
- const { mutateAsync: requestOrderEdit } = useDraftOrderRequestEdit(preview.id);
10071
- const itemCount = ((_a = preview.items) == null ? void 0 : _a.reduce((acc, item) => acc + item.quantity, 0)) || 0;
10072
- const matches = React.useMemo(() => {
10073
- return matchSorter.matchSorter(preview.items, query2, {
10074
- keys: ["product_title", "variant_title", "variant_sku", "title"]
10075
- });
10076
- }, [preview.items, query2]);
10077
- const onSubmit = async () => {
10078
- setIsSubmitting(true);
10079
- let requestSucceeded = false;
10080
- await requestOrderEdit(void 0, {
10081
- onError: (e) => {
10082
- ui.toast.error(`Failed to request order edit: ${e.message}`);
10083
- },
10084
- onSuccess: () => {
10085
- requestSucceeded = true;
10086
- }
10087
- });
10088
- if (!requestSucceeded) {
10089
- setIsSubmitting(false);
10090
- return;
10091
- }
10092
- await confirmOrderEdit(void 0, {
10093
- onError: (e) => {
10094
- ui.toast.error(`Failed to confirm order edit: ${e.message}`);
10095
- },
10096
- onSuccess: () => {
10097
- handleSuccess();
10098
- },
10099
- onSettled: () => {
10100
- setIsSubmitting(false);
10101
- }
10102
- });
10103
- };
10104
- const onKeyDown = React.useCallback(
10105
- (e) => {
10106
- if (e.key === "Enter" && (e.ctrlKey || e.metaKey)) {
10107
- if (modalContent || isSubmitting) {
10108
- return;
10109
- }
10110
- onSubmit();
10111
- }
10112
- },
10113
- [modalContent, isSubmitting, onSubmit]
10114
- );
10115
- React.useEffect(() => {
10116
- document.addEventListener("keydown", onKeyDown);
10117
- return () => {
10118
- document.removeEventListener("keydown", onKeyDown);
10119
- };
10120
- }, [onKeyDown]);
10121
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full flex-col overflow-hidden", children: [
10122
- /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Header, {}),
10123
- /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Body, { className: "flex flex-1 flex-col overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsxs(
10124
- StackedFocusModal,
10125
- {
10126
- id: STACKED_MODAL_ID,
10127
- onOpenChangeCallback: (open) => {
10128
- if (!open) {
10129
- setModalContent(null);
10130
- }
10131
- },
10132
- children: [
10133
- /* @__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-6 py-16", children: [
10134
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
10135
- /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Items" }) }),
10136
- /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Edit the items in the draft order" }) })
10137
- ] }),
10138
- /* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
10139
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-6", children: [
10140
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 items-center gap-3", children: [
10141
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
10142
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: "Items" }),
10143
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Choose items from the product catalog." })
10144
- ] }),
10145
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
10146
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
10147
- ui.Input,
10148
- {
10149
- type: "search",
10150
- placeholder: "Search items",
10151
- value: searchValue,
10152
- onChange: (e) => onSearchValueChange(e.target.value)
10153
- }
10154
- ) }),
10155
- /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
10156
- /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.IconButton, { type: "button", children: /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}) }) }),
10157
- /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu.Content, { children: [
10158
- /* @__PURE__ */ jsxRuntime.jsx(
10159
- StackedModalTrigger$1,
10160
- {
10161
- type: "add-items",
10162
- setModalContent
10163
- }
10164
- ),
10165
- /* @__PURE__ */ jsxRuntime.jsx(
10166
- StackedModalTrigger$1,
10167
- {
10168
- type: "add-custom-item",
10169
- setModalContent
10170
- }
10171
- )
10172
- ] })
10173
- ] })
10174
- ] })
10175
- ] }),
10176
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-ui-bg-subtle shadow-elevation-card-rest rounded-xl", children: [
10177
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-[5px]", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-ui-fg-muted grid grid-cols-[2fr_1fr_2fr_28px] gap-3 px-4 py-2", children: [
10178
- /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: "Item" }) }),
10179
- /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: "Quantity" }) }),
10180
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-right", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: "Price" }) }),
10181
- /* @__PURE__ */ jsxRuntime.jsx("div", {})
10182
- ] }) }),
10183
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-y-1.5 px-[5px] pb-[5px]", children: itemCount <= 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-ui-bg-base shadow-elevation-card-rest flex flex-col items-center justify-center gap-1 gap-x-3 rounded-lg p-4", children: [
10184
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: "There are no items in this order" }),
10185
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Add items to the order to get started." })
10186
- ] }) : matches.length > 0 ? matches == null ? void 0 : matches.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
10187
- Item,
10188
- {
10189
- item,
10190
- preview,
10191
- currencyCode
10192
- },
10193
- item.id
10194
- )) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-ui-bg-base shadow-elevation-card-rest flex flex-col items-center justify-center gap-1 gap-x-3 rounded-lg p-4", children: [
10195
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: "No items found" }),
10196
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: [
10197
- 'No items found for "',
10198
- query2,
10199
- '".'
10200
- ] })
10201
- ] }) })
10202
- ] })
10203
- ] }),
10204
- /* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
10205
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[1fr_0.5fr_0.5fr] gap-3", children: [
10206
- /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: "Subtotal" }) }),
10207
- /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsxs(
10208
- ui.Text,
10209
- {
10210
- size: "small",
10211
- leading: "compact",
10212
- className: "text-ui-fg-subtle",
10213
- children: [
10214
- itemCount,
10215
- " ",
10216
- itemCount === 1 ? "item" : "items"
10217
- ]
10218
- }
10219
- ) }),
10220
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-right", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: getStylizedAmount(preview.item_subtotal, currencyCode) }) })
10221
- ] })
10222
- ] }) }),
10223
- modalContent && (modalContent === "add-items" ? /* @__PURE__ */ jsxRuntime.jsx(ExistingItemsForm, { orderId: preview.id, items: preview.items }) : modalContent === "add-custom-item" ? /* @__PURE__ */ jsxRuntime.jsx(
10224
- CustomItemForm,
10225
- {
10226
- orderId: preview.id,
10227
- currencyCode
10228
- }
10229
- ) : null)
10230
- ]
10231
- }
10232
- ) }),
10233
- /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
10234
- /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
10235
- /* @__PURE__ */ jsxRuntime.jsx(
10236
- ui.Button,
10237
- {
10238
- size: "small",
10239
- type: "button",
10240
- onClick: onSubmit,
10241
- isLoading: isSubmitting,
10242
- children: "Save"
10243
- }
10244
- )
10245
- ] }) })
10246
- ] });
10247
- };
10248
- const Item = ({ item, preview, currencyCode }) => {
10249
- if (item.variant_id) {
10250
- return /* @__PURE__ */ jsxRuntime.jsx(VariantItem, { item, preview, currencyCode });
10251
- }
10252
- return /* @__PURE__ */ jsxRuntime.jsx(CustomItem, { item, preview, currencyCode });
10253
- };
10254
- const VariantItem = ({ item, preview, currencyCode }) => {
10255
- const [editing, setEditing] = React.useState(false);
9897
+ const hasUneditableRows = getHasUneditableRows(metadata);
9898
+ const { mutateAsync, isPending } = useUpdateDraftOrder(orderId);
10256
9899
  const form = reactHookForm.useForm({
10257
9900
  defaultValues: {
10258
- quantity: item.quantity,
10259
- unit_price: item.unit_price
9901
+ metadata: getDefaultValues(metadata)
10260
9902
  },
10261
- resolver: zod.zodResolver(variantItemSchema)
9903
+ resolver: zod.zodResolver(MetadataSchema)
10262
9904
  });
10263
- const actionId = React.useMemo(() => {
10264
- var _a, _b;
10265
- return (_b = (_a = item.actions) == null ? void 0 : _a.find((a) => a.action === "ITEM_ADD")) == null ? void 0 : _b.id;
10266
- }, [item]);
10267
- const { mutateAsync: updateActionItem, isPending: isUpdatingActionItem } = useDraftOrderUpdateActionItem(preview.id);
10268
- const { mutateAsync: updateOriginalItem, isPending: isUpdatingOriginalItem } = useDraftOrderUpdateItem(preview.id);
10269
- const isPending = isUpdatingActionItem || isUpdatingOriginalItem;
10270
- const onSubmit = form.handleSubmit(async (data) => {
10271
- if (convertNumber(data.unit_price) === item.unit_price && data.quantity === item.quantity) {
10272
- setEditing(false);
10273
- return;
10274
- }
10275
- if (!actionId) {
10276
- await updateOriginalItem(
10277
- {
10278
- item_id: item.id,
10279
- quantity: data.quantity,
10280
- unit_price: convertNumber(data.unit_price)
10281
- },
10282
- {
10283
- onSuccess: () => {
10284
- setEditing(false);
10285
- },
10286
- onError: (e) => {
10287
- ui.toast.error(e.message);
10288
- }
10289
- }
10290
- );
10291
- return;
10292
- }
10293
- await updateActionItem(
9905
+ const handleSubmit = form.handleSubmit(async (data) => {
9906
+ const parsedData = parseValues(data);
9907
+ await mutateAsync(
10294
9908
  {
10295
- action_id: actionId,
10296
- quantity: data.quantity,
10297
- unit_price: convertNumber(data.unit_price)
9909
+ metadata: parsedData
10298
9910
  },
10299
9911
  {
10300
9912
  onSuccess: () => {
10301
- setEditing(false);
9913
+ ui.toast.success("Metadata updated");
9914
+ handleSuccess();
10302
9915
  },
10303
- onError: (e) => {
10304
- ui.toast.error(e.message);
10305
- }
10306
- }
10307
- );
10308
- });
10309
- 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: [
10310
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full items-center gap-x-3", children: [
10311
- /* @__PURE__ */ jsxRuntime.jsx(
10312
- Thumbnail,
10313
- {
10314
- thumbnail: item.thumbnail,
10315
- alt: item.product_title ?? void 0
10316
- }
10317
- ),
10318
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
10319
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-1", children: [
10320
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: item.product_title }),
10321
- /* @__PURE__ */ jsxRuntime.jsxs(
10322
- ui.Text,
10323
- {
10324
- size: "small",
10325
- leading: "compact",
10326
- className: "text-ui-fg-subtle",
10327
- children: [
10328
- "(",
10329
- item.variant_title,
10330
- ")"
10331
- ]
10332
- }
10333
- )
10334
- ] }),
10335
- /* @__PURE__ */ jsxRuntime.jsx(
10336
- ui.Text,
10337
- {
10338
- size: "small",
10339
- leading: "compact",
10340
- className: "text-ui-fg-subtle",
10341
- children: item.variant_sku
10342
- }
10343
- )
10344
- ] })
10345
- ] }),
10346
- editing ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
10347
- Form$2.Field,
10348
- {
10349
- control: form.control,
10350
- name: "quantity",
10351
- render: ({ field }) => {
10352
- return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(NumberInput, { ...field }) }) });
10353
- }
10354
- }
10355
- ) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: item.quantity }) }),
10356
- editing ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
10357
- Form$2.Field,
10358
- {
10359
- control: form.control,
10360
- name: "unit_price",
10361
- render: ({ field: { onChange, ...field } }) => {
10362
- return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
10363
- ui.CurrencyInput,
10364
- {
10365
- ...field,
10366
- symbol: getNativeSymbol(currencyCode),
10367
- code: currencyCode,
10368
- onValueChange: (_value, _name, values) => onChange(values == null ? void 0 : values.value)
10369
- }
10370
- ) }) });
10371
- }
10372
- }
10373
- ) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex w-full flex-1 items-center justify-end", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: getLocaleAmount(item.unit_price, currencyCode) }) }),
10374
- /* @__PURE__ */ jsxRuntime.jsx(
10375
- ui.IconButton,
10376
- {
10377
- type: "button",
10378
- size: "small",
10379
- onClick: editing ? onSubmit : () => {
10380
- setEditing(true);
10381
- },
10382
- disabled: isPending,
10383
- children: editing ? /* @__PURE__ */ jsxRuntime.jsx(icons.Check, {}) : /* @__PURE__ */ jsxRuntime.jsx(icons.PencilSquare, {})
10384
- }
10385
- )
10386
- ] }) }) });
10387
- };
10388
- const variantItemSchema = objectType({
10389
- quantity: numberType(),
10390
- unit_price: unionType([numberType(), stringType()])
10391
- });
10392
- const CustomItem = ({ item, preview, currencyCode }) => {
10393
- const [editing, setEditing] = React.useState(false);
10394
- const { quantity, unit_price, title } = item;
10395
- const form = reactHookForm.useForm({
10396
- defaultValues: {
10397
- title,
10398
- quantity,
10399
- unit_price
10400
- },
10401
- resolver: zod.zodResolver(customItemSchema)
10402
- });
10403
- React.useEffect(() => {
10404
- form.reset({
10405
- title,
10406
- quantity,
10407
- unit_price
10408
- });
10409
- }, [form, title, quantity, unit_price]);
10410
- const actionId = React.useMemo(() => {
10411
- var _a, _b;
10412
- return (_b = (_a = item.actions) == null ? void 0 : _a.find((a) => a.action === "ITEM_ADD")) == null ? void 0 : _b.id;
10413
- }, [item]);
10414
- const { mutateAsync: updateActionItem, isPending: isUpdatingActionItem } = useDraftOrderUpdateActionItem(preview.id);
10415
- const { mutateAsync: removeActionItem, isPending: isRemovingActionItem } = useDraftOrderRemoveActionItem(preview.id);
10416
- const { mutateAsync: updateOriginalItem, isPending: isUpdatingOriginalItem } = useDraftOrderUpdateItem(preview.id);
10417
- const isPending = isUpdatingActionItem || isUpdatingOriginalItem;
10418
- const onSubmit = form.handleSubmit(async (data) => {
10419
- if (convertNumber(data.unit_price) === item.unit_price && data.quantity === item.quantity && data.title === item.title) {
10420
- setEditing(false);
10421
- return;
10422
- }
10423
- if (!actionId) {
10424
- await updateOriginalItem(
10425
- {
10426
- item_id: item.id,
10427
- quantity: data.quantity,
10428
- unit_price: convertNumber(data.unit_price)
10429
- },
10430
- {
10431
- onSuccess: () => {
10432
- setEditing(false);
10433
- },
10434
- onError: (e) => {
10435
- ui.toast.error(e.message);
10436
- }
10437
- }
10438
- );
10439
- return;
10440
- }
10441
- if (data.quantity === 0) {
10442
- await removeActionItem(actionId, {
10443
- onSuccess: () => {
10444
- setEditing(false);
10445
- },
10446
- onError: (e) => {
10447
- ui.toast.error(e.message);
10448
- }
10449
- });
10450
- return;
10451
- }
10452
- await updateActionItem(
10453
- {
10454
- action_id: actionId,
10455
- quantity: data.quantity,
10456
- unit_price: convertNumber(data.unit_price)
10457
- },
10458
- {
10459
- onSuccess: () => {
10460
- setEditing(false);
10461
- },
10462
- onError: (e) => {
10463
- ui.toast.error(e.message);
10464
- }
10465
- }
10466
- );
10467
- });
10468
- 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: [
10469
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-3", children: [
10470
- /* @__PURE__ */ jsxRuntime.jsx(
10471
- Thumbnail,
10472
- {
10473
- thumbnail: item.thumbnail,
10474
- alt: item.title ?? void 0
10475
- }
10476
- ),
10477
- editing ? /* @__PURE__ */ jsxRuntime.jsx(
10478
- Form$2.Field,
10479
- {
10480
- control: form.control,
10481
- name: "title",
10482
- render: ({ field }) => {
10483
- return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }) });
10484
- }
10485
- }
10486
- ) : /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: item.title })
10487
- ] }),
10488
- editing ? /* @__PURE__ */ jsxRuntime.jsx(
10489
- Form$2.Field,
10490
- {
10491
- control: form.control,
10492
- name: "quantity",
10493
- render: ({ field }) => {
10494
- return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(NumberInput, { ...field }) }) });
10495
- }
10496
- }
10497
- ) : /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: item.quantity }),
10498
- editing ? /* @__PURE__ */ jsxRuntime.jsx(
10499
- Form$2.Field,
10500
- {
10501
- control: form.control,
10502
- name: "unit_price",
10503
- render: ({ field: { onChange, ...field } }) => {
10504
- return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
10505
- ui.CurrencyInput,
10506
- {
10507
- ...field,
10508
- symbol: getNativeSymbol(currencyCode),
10509
- code: currencyCode,
10510
- onValueChange: (_value, _name, values) => onChange(values == null ? void 0 : values.value)
10511
- }
10512
- ) }) });
10513
- }
10514
- }
10515
- ) : /* @__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) }) }),
10516
- /* @__PURE__ */ jsxRuntime.jsx(
10517
- ui.IconButton,
10518
- {
10519
- type: "button",
10520
- size: "small",
10521
- onClick: editing ? onSubmit : () => {
10522
- setEditing(true);
10523
- },
10524
- disabled: isPending,
10525
- children: editing ? /* @__PURE__ */ jsxRuntime.jsx(icons.Check, {}) : /* @__PURE__ */ jsxRuntime.jsx(icons.PencilSquare, {})
10526
- }
10527
- )
10528
- ] }) }) });
10529
- };
10530
- const StackedModalTrigger$1 = ({
10531
- type,
10532
- setModalContent
10533
- }) => {
10534
- const { setIsOpen } = useStackedModal();
10535
- const onClick = React.useCallback(() => {
10536
- setModalContent(type);
10537
- setIsOpen(STACKED_MODAL_ID, true);
10538
- }, [setModalContent, setIsOpen, type]);
10539
- 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" }) });
10540
- };
10541
- const VARIANT_PREFIX = "items";
10542
- const LIMIT = 50;
10543
- const ExistingItemsForm = ({ orderId, items }) => {
10544
- const { setIsOpen } = useStackedModal();
10545
- const [rowSelection, setRowSelection] = React.useState(
10546
- items.reduce((acc, item) => {
10547
- acc[item.variant_id] = true;
10548
- return acc;
10549
- }, {})
10550
- );
10551
- React.useEffect(() => {
10552
- setRowSelection(
10553
- items.reduce((acc, item) => {
10554
- if (item.variant_id) {
10555
- acc[item.variant_id] = true;
10556
- }
10557
- return acc;
10558
- }, {})
10559
- );
10560
- }, [items]);
10561
- const { q, order, offset } = useQueryParams(
10562
- ["q", "order", "offset"],
10563
- VARIANT_PREFIX
10564
- );
10565
- const { variants, count, isPending, isError, error } = useProductVariants(
10566
- {
10567
- q,
10568
- order,
10569
- offset: offset ? parseInt(offset) : void 0,
10570
- limit: LIMIT
10571
- },
10572
- {
10573
- placeholderData: reactQuery.keepPreviousData
10574
- }
10575
- );
10576
- const columns = useColumns();
10577
- const { mutateAsync } = useDraftOrderAddItems(orderId);
10578
- const onSubmit = async () => {
10579
- const ids = Object.keys(rowSelection).filter(
10580
- (id) => !items.find((i) => i.variant_id === id)
10581
- );
10582
- await mutateAsync(
10583
- {
10584
- items: ids.map((id) => ({
10585
- variant_id: id,
10586
- quantity: 1
10587
- }))
10588
- },
10589
- {
10590
- onSuccess: () => {
10591
- setRowSelection({});
10592
- setIsOpen(STACKED_MODAL_ID, false);
10593
- },
10594
- onError: (e) => {
10595
- ui.toast.error(e.message);
10596
- }
10597
- }
10598
- );
10599
- };
10600
- if (isError) {
10601
- throw error;
10602
- }
10603
- return /* @__PURE__ */ jsxRuntime.jsxs(
10604
- StackedFocusModal.Content,
10605
- {
10606
- onOpenAutoFocus: (e) => {
10607
- e.preventDefault();
10608
- const searchInput = document.querySelector(
10609
- "[data-modal-id='modal-search-input']"
10610
- );
10611
- if (searchInput) {
10612
- searchInput.focus();
10613
- }
10614
- },
10615
- children: [
10616
- /* @__PURE__ */ jsxRuntime.jsxs(StackedFocusModal.Header, { children: [
10617
- /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Product Variants" }) }),
10618
- /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Choose product variants to add to the order." }) })
10619
- ] }),
10620
- /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Body, { className: "flex-1 overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx(
10621
- DataTable,
10622
- {
10623
- data: variants,
10624
- columns,
10625
- isLoading: isPending,
10626
- getRowId: (row) => row.id,
10627
- rowCount: count,
10628
- prefix: VARIANT_PREFIX,
10629
- layout: "fill",
10630
- rowSelection: {
10631
- state: rowSelection,
10632
- onRowSelectionChange: setRowSelection,
10633
- enableRowSelection: (row) => {
10634
- return !items.find((i) => i.variant_id === row.original.id);
10635
- }
10636
- },
10637
- autoFocusSearch: true
10638
- }
10639
- ) }),
10640
- /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
10641
- /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
10642
- /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "button", onClick: onSubmit, children: "Update items" })
10643
- ] }) })
10644
- ]
10645
- }
10646
- );
10647
- };
10648
- const columnHelper = ui.createDataTableColumnHelper();
10649
- const useColumns = () => {
10650
- return React.useMemo(() => {
10651
- return [
10652
- columnHelper.select(),
10653
- columnHelper.accessor("product.title", {
10654
- header: "Product",
10655
- cell: ({ row }) => {
10656
- var _a, _b, _c;
10657
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-2", children: [
10658
- /* @__PURE__ */ jsxRuntime.jsx(
10659
- Thumbnail,
10660
- {
10661
- thumbnail: (_a = row.original.product) == null ? void 0 : _a.thumbnail,
10662
- alt: (_b = row.original.product) == null ? void 0 : _b.title
10663
- }
10664
- ),
10665
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: (_c = row.original.product) == null ? void 0 : _c.title })
10666
- ] });
10667
- },
10668
- enableSorting: true
10669
- }),
10670
- columnHelper.accessor("title", {
10671
- header: "Variant",
10672
- enableSorting: true
10673
- }),
10674
- columnHelper.accessor("sku", {
10675
- header: "SKU",
10676
- cell: ({ getValue }) => {
10677
- return getValue() ?? "-";
10678
- },
10679
- enableSorting: true
10680
- }),
10681
- columnHelper.accessor("updated_at", {
10682
- header: "Updated",
10683
- cell: ({ getValue }) => {
10684
- return /* @__PURE__ */ jsxRuntime.jsx(
10685
- ui.Tooltip,
10686
- {
10687
- content: getFullDate({ date: getValue(), includeTime: true }),
10688
- children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: getFullDate({ date: getValue() }) })
10689
- }
10690
- );
10691
- },
10692
- enableSorting: true,
10693
- sortAscLabel: "Oldest first",
10694
- sortDescLabel: "Newest first"
10695
- }),
10696
- columnHelper.accessor("created_at", {
10697
- header: "Created",
10698
- cell: ({ getValue }) => {
10699
- return /* @__PURE__ */ jsxRuntime.jsx(
10700
- ui.Tooltip,
10701
- {
10702
- content: getFullDate({ date: getValue(), includeTime: true }),
10703
- children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: getFullDate({ date: getValue() }) })
10704
- }
10705
- );
10706
- },
10707
- enableSorting: true,
10708
- sortAscLabel: "Oldest first",
10709
- sortDescLabel: "Newest first"
10710
- })
10711
- ];
10712
- }, []);
10713
- };
10714
- const CustomItemForm = ({ orderId, currencyCode }) => {
10715
- const { setIsOpen } = useStackedModal();
10716
- const { mutateAsync: addItems } = useDraftOrderAddItems(orderId);
10717
- const form = reactHookForm.useForm({
10718
- defaultValues: {
10719
- title: "",
10720
- quantity: 1,
10721
- unit_price: ""
10722
- },
10723
- resolver: zod.zodResolver(customItemSchema)
10724
- });
10725
- const onSubmit = form.handleSubmit(async (data) => {
10726
- await addItems(
10727
- {
10728
- items: [
10729
- {
10730
- title: data.title,
10731
- quantity: data.quantity,
10732
- unit_price: convertNumber(data.unit_price)
10733
- }
10734
- ]
10735
- },
10736
- {
10737
- onSuccess: () => {
10738
- setIsOpen(STACKED_MODAL_ID, false);
10739
- },
10740
- onError: (e) => {
10741
- ui.toast.error(e.message);
10742
- }
10743
- }
10744
- );
10745
- });
10746
- return /* @__PURE__ */ jsxRuntime.jsx(Form$2, { ...form, children: /* @__PURE__ */ jsxRuntime.jsx(KeyboundForm, { onSubmit, children: /* @__PURE__ */ jsxRuntime.jsxs(StackedFocusModal.Content, { children: [
10747
- /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Header, {}),
10748
- /* @__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: [
10749
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
10750
- /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Add custom item" }) }),
10751
- /* @__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." }) })
10752
- ] }),
10753
- /* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
10754
- /* @__PURE__ */ jsxRuntime.jsx(
10755
- Form$2.Field,
10756
- {
10757
- control: form.control,
10758
- name: "title",
10759
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
10760
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
10761
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Title" }),
10762
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Hint, { children: "Enter the title of the item" })
10763
- ] }),
10764
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
10765
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
10766
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
10767
- ] })
10768
- ] }) })
10769
- }
10770
- ),
10771
- /* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
10772
- /* @__PURE__ */ jsxRuntime.jsx(
10773
- Form$2.Field,
10774
- {
10775
- control: form.control,
10776
- name: "unit_price",
10777
- render: ({ field: { onChange, ...field } }) => /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
10778
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
10779
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Unit price" }),
10780
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Hint, { children: "Enter the unit price of the item" })
10781
- ] }),
10782
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
10783
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
10784
- ui.CurrencyInput,
10785
- {
10786
- symbol: getNativeSymbol(currencyCode),
10787
- code: currencyCode,
10788
- onValueChange: (_value, _name, values) => onChange(values == null ? void 0 : values.value),
10789
- ...field
10790
- }
10791
- ) }),
10792
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
10793
- ] })
10794
- ] }) })
10795
- }
10796
- ),
10797
- /* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
10798
- /* @__PURE__ */ jsxRuntime.jsx(
10799
- Form$2.Field,
10800
- {
10801
- control: form.control,
10802
- name: "quantity",
10803
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
10804
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
10805
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Quantity" }),
10806
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Hint, { children: "Enter the quantity of the item" })
10807
- ] }),
10808
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full flex-1", children: [
10809
- /* @__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" }) }) }),
10810
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
10811
- ] })
10812
- ] }) })
10813
- }
10814
- )
10815
- ] }) }) }),
10816
- /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
10817
- /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
10818
- /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "button", onClick: onSubmit, children: "Add item" })
10819
- ] }) })
10820
- ] }) }) });
10821
- };
10822
- const customItemSchema = objectType({
10823
- title: stringType().min(1),
10824
- quantity: numberType(),
10825
- unit_price: unionType([numberType(), stringType()])
10826
- });
10827
- const InlineTip = React.forwardRef(
10828
- ({ variant = "tip", label, className, children, ...props }, ref) => {
10829
- const labelValue = label || (variant === "warning" ? "Warning" : "Tip");
10830
- return /* @__PURE__ */ jsxRuntime.jsxs(
10831
- "div",
10832
- {
10833
- ref,
10834
- className: ui.clx(
10835
- "bg-ui-bg-component txt-small text-ui-fg-subtle grid grid-cols-[4px_1fr] items-start gap-3 rounded-lg border p-3",
10836
- className
10837
- ),
10838
- ...props,
10839
- children: [
10840
- /* @__PURE__ */ jsxRuntime.jsx(
10841
- "div",
10842
- {
10843
- role: "presentation",
10844
- className: ui.clx("w-4px bg-ui-tag-neutral-icon h-full rounded-full", {
10845
- "bg-ui-tag-orange-icon": variant === "warning"
10846
- })
10847
- }
10848
- ),
10849
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-pretty", children: [
10850
- /* @__PURE__ */ jsxRuntime.jsxs("strong", { className: "txt-small-plus text-ui-fg-base", children: [
10851
- labelValue,
10852
- ":"
10853
- ] }),
10854
- " ",
10855
- children
10856
- ] })
10857
- ]
10858
- }
10859
- );
10860
- }
10861
- );
10862
- InlineTip.displayName = "InlineTip";
10863
- const MetadataFieldSchema = objectType({
10864
- key: stringType(),
10865
- disabled: booleanType().optional(),
10866
- value: anyType()
10867
- });
10868
- const MetadataSchema = objectType({
10869
- metadata: arrayType(MetadataFieldSchema)
10870
- });
10871
- const Metadata = () => {
10872
- const { id } = reactRouterDom.useParams();
10873
- const { order, isPending, isError, error } = useOrder(id, {
10874
- fields: "metadata"
10875
- });
10876
- if (isError) {
10877
- throw error;
10878
- }
10879
- const isReady = !isPending && !!order;
10880
- return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { children: [
10881
- /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer.Header, { children: [
10882
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Metadata" }) }),
10883
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Add metadata to the draft order." }) })
10884
- ] }),
10885
- !isReady ? /* @__PURE__ */ jsxRuntime.jsx(PlaceholderInner, {}) : /* @__PURE__ */ jsxRuntime.jsx(MetadataForm, { orderId: id, metadata: order == null ? void 0 : order.metadata })
10886
- ] });
10887
- };
10888
- const METADATA_KEY_LABEL_ID = "metadata-form-key-label";
10889
- const METADATA_VALUE_LABEL_ID = "metadata-form-value-label";
10890
- const MetadataForm = ({ orderId, metadata }) => {
10891
- const { handleSuccess } = useRouteModal();
10892
- const hasUneditableRows = getHasUneditableRows(metadata);
10893
- const { mutateAsync, isPending } = useUpdateDraftOrder(orderId);
10894
- const form = reactHookForm.useForm({
10895
- defaultValues: {
10896
- metadata: getDefaultValues(metadata)
10897
- },
10898
- resolver: zod.zodResolver(MetadataSchema)
10899
- });
10900
- const handleSubmit = form.handleSubmit(async (data) => {
10901
- const parsedData = parseValues(data);
10902
- await mutateAsync(
10903
- {
10904
- metadata: parsedData
10905
- },
10906
- {
10907
- onSuccess: () => {
10908
- ui.toast.success("Metadata updated");
10909
- handleSuccess();
10910
- },
10911
- onError: (error) => {
10912
- ui.toast.error(error.message);
9916
+ onError: (error) => {
9917
+ ui.toast.error(error.message);
10913
9918
  }
10914
9919
  }
10915
9920
  );
@@ -11194,6 +10199,52 @@ const usePromotions = (query2, options) => {
11194
10199
  });
11195
10200
  return { ...data, ...rest };
11196
10201
  };
10202
+ const useCancelOrderEdit = ({ preview }) => {
10203
+ const { mutateAsync: cancelOrderEdit } = useDraftOrderCancelEdit(preview == null ? void 0 : preview.id);
10204
+ const onCancel = React.useCallback(async () => {
10205
+ if (!preview) {
10206
+ return true;
10207
+ }
10208
+ let res = false;
10209
+ await cancelOrderEdit(void 0, {
10210
+ onError: (e) => {
10211
+ ui.toast.error(e.message);
10212
+ },
10213
+ onSuccess: () => {
10214
+ res = true;
10215
+ }
10216
+ });
10217
+ return res;
10218
+ }, [preview, cancelOrderEdit]);
10219
+ return { onCancel };
10220
+ };
10221
+ let IS_REQUEST_RUNNING = false;
10222
+ const useInitiateOrderEdit = ({
10223
+ preview
10224
+ }) => {
10225
+ const navigate = reactRouterDom.useNavigate();
10226
+ const { mutateAsync } = useDraftOrderBeginEdit(preview == null ? void 0 : preview.id);
10227
+ React.useEffect(() => {
10228
+ async function run() {
10229
+ if (IS_REQUEST_RUNNING || !preview) {
10230
+ return;
10231
+ }
10232
+ if (preview.order_change) {
10233
+ return;
10234
+ }
10235
+ IS_REQUEST_RUNNING = true;
10236
+ await mutateAsync(void 0, {
10237
+ onError: (e) => {
10238
+ ui.toast.error(e.message);
10239
+ navigate(`/draft-orders/${preview.id}`, { replace: true });
10240
+ return;
10241
+ }
10242
+ });
10243
+ IS_REQUEST_RUNNING = false;
10244
+ }
10245
+ run();
10246
+ }, [preview, navigate, mutateAsync]);
10247
+ };
11197
10248
  const Promotions = () => {
11198
10249
  const { id } = reactRouterDom.useParams();
11199
10250
  const {
@@ -11479,7 +10530,7 @@ const SalesChannelForm = ({ order }) => {
11479
10530
  defaultValues: {
11480
10531
  sales_channel_id: order.sales_channel_id || ""
11481
10532
  },
11482
- resolver: zod.zodResolver(schema$2)
10533
+ resolver: zod.zodResolver(schema$3)
11483
10534
  });
11484
10535
  const { mutateAsync, isPending } = useUpdateDraftOrder(order.id);
11485
10536
  const { handleSuccess } = useRouteModal();
@@ -11554,9 +10605,12 @@ const SalesChannelField = ({ control, order }) => {
11554
10605
  }
11555
10606
  );
11556
10607
  };
11557
- const schema$2 = objectType({
10608
+ const schema$3 = objectType({
11558
10609
  sales_channel_id: stringType().min(1)
11559
10610
  });
10611
+ function convertNumber(value) {
10612
+ return typeof value === "string" ? Number(value.replace(",", ".")) : value;
10613
+ }
11560
10614
  const STACKED_FOCUS_MODAL_ID = "shipping-form";
11561
10615
  const Shipping = () => {
11562
10616
  var _a;
@@ -11864,7 +10918,7 @@ const ShippingForm = ({ preview, order }) => {
11864
10918
  ]
11865
10919
  }
11866
10920
  ) : /* @__PURE__ */ jsxRuntime.jsx(
11867
- StackedModalTrigger,
10921
+ StackedModalTrigger$1,
11868
10922
  {
11869
10923
  shippingProfileId: profile.id,
11870
10924
  shippingOption,
@@ -11975,7 +11029,7 @@ const ShippingForm = ({ preview, order }) => {
11975
11029
  ] }) })
11976
11030
  ] });
11977
11031
  };
11978
- const StackedModalTrigger = ({
11032
+ const StackedModalTrigger$1 = ({
11979
11033
  shippingProfileId,
11980
11034
  shippingOption,
11981
11035
  shippingMethod,
@@ -12350,20 +11404,223 @@ const CustomAmountField = ({
12350
11404
  /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { optional: true, children: "Custom amount" }),
12351
11405
  /* @__PURE__ */ jsxRuntime.jsx(Form$2.Hint, { children: "Set a custom amount for the shipping option." })
12352
11406
  ] }),
12353
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
12354
- ui.CurrencyInput,
11407
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
11408
+ ui.CurrencyInput,
11409
+ {
11410
+ ...field,
11411
+ onValueChange: (value) => onChange(value),
11412
+ symbol: getNativeSymbol(currencyCode),
11413
+ code: currencyCode
11414
+ }
11415
+ ) })
11416
+ ] });
11417
+ }
11418
+ }
11419
+ );
11420
+ };
11421
+ const ShippingAddress = () => {
11422
+ const { id } = reactRouterDom.useParams();
11423
+ const { order, isPending, isError, error } = useOrder(id, {
11424
+ fields: "+shipping_address"
11425
+ });
11426
+ if (isError) {
11427
+ throw error;
11428
+ }
11429
+ const isReady = !isPending && !!order;
11430
+ return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { children: [
11431
+ /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer.Header, { children: [
11432
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Shipping Address" }) }),
11433
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Edit the shipping address for the draft order" }) })
11434
+ ] }),
11435
+ isReady && /* @__PURE__ */ jsxRuntime.jsx(ShippingAddressForm, { order })
11436
+ ] });
11437
+ };
11438
+ const ShippingAddressForm = ({ order }) => {
11439
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
11440
+ const form = reactHookForm.useForm({
11441
+ defaultValues: {
11442
+ first_name: ((_a = order.shipping_address) == null ? void 0 : _a.first_name) ?? "",
11443
+ last_name: ((_b = order.shipping_address) == null ? void 0 : _b.last_name) ?? "",
11444
+ company: ((_c = order.shipping_address) == null ? void 0 : _c.company) ?? "",
11445
+ address_1: ((_d = order.shipping_address) == null ? void 0 : _d.address_1) ?? "",
11446
+ address_2: ((_e = order.shipping_address) == null ? void 0 : _e.address_2) ?? "",
11447
+ city: ((_f = order.shipping_address) == null ? void 0 : _f.city) ?? "",
11448
+ province: ((_g = order.shipping_address) == null ? void 0 : _g.province) ?? "",
11449
+ country_code: ((_h = order.shipping_address) == null ? void 0 : _h.country_code) ?? "",
11450
+ postal_code: ((_i = order.shipping_address) == null ? void 0 : _i.postal_code) ?? "",
11451
+ phone: ((_j = order.shipping_address) == null ? void 0 : _j.phone) ?? ""
11452
+ },
11453
+ resolver: zod.zodResolver(schema$2)
11454
+ });
11455
+ const { mutateAsync, isPending } = useUpdateDraftOrder(order.id);
11456
+ const { handleSuccess } = useRouteModal();
11457
+ const onSubmit = form.handleSubmit(async (data) => {
11458
+ await mutateAsync(
11459
+ {
11460
+ shipping_address: {
11461
+ first_name: data.first_name,
11462
+ last_name: data.last_name,
11463
+ company: data.company,
11464
+ address_1: data.address_1,
11465
+ address_2: data.address_2,
11466
+ city: data.city,
11467
+ province: data.province,
11468
+ country_code: data.country_code,
11469
+ postal_code: data.postal_code,
11470
+ phone: data.phone
11471
+ }
11472
+ },
11473
+ {
11474
+ onSuccess: () => {
11475
+ handleSuccess();
11476
+ },
11477
+ onError: (error) => {
11478
+ ui.toast.error(error.message);
11479
+ }
11480
+ }
11481
+ );
11482
+ });
11483
+ return /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxRuntime.jsxs(
11484
+ KeyboundForm,
11485
+ {
11486
+ className: "flex flex-1 flex-col overflow-hidden",
11487
+ onSubmit,
11488
+ children: [
11489
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Body, { className: "flex flex-col gap-y-6 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-4", children: [
11490
+ /* @__PURE__ */ jsxRuntime.jsx(
11491
+ Form$2.Field,
11492
+ {
11493
+ control: form.control,
11494
+ name: "country_code",
11495
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
11496
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Country" }),
11497
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(CountrySelect, { ...field }) }),
11498
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
11499
+ ] })
11500
+ }
11501
+ ),
11502
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
11503
+ /* @__PURE__ */ jsxRuntime.jsx(
11504
+ Form$2.Field,
11505
+ {
11506
+ control: form.control,
11507
+ name: "first_name",
11508
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
11509
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "First name" }),
11510
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
11511
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
11512
+ ] })
11513
+ }
11514
+ ),
11515
+ /* @__PURE__ */ jsxRuntime.jsx(
11516
+ Form$2.Field,
11517
+ {
11518
+ control: form.control,
11519
+ name: "last_name",
11520
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
11521
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Last name" }),
11522
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
11523
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
11524
+ ] })
11525
+ }
11526
+ )
11527
+ ] }),
11528
+ /* @__PURE__ */ jsxRuntime.jsx(
11529
+ Form$2.Field,
11530
+ {
11531
+ control: form.control,
11532
+ name: "company",
11533
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
11534
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { optional: true, children: "Company" }),
11535
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
11536
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
11537
+ ] })
11538
+ }
11539
+ ),
11540
+ /* @__PURE__ */ jsxRuntime.jsx(
11541
+ Form$2.Field,
11542
+ {
11543
+ control: form.control,
11544
+ name: "address_1",
11545
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
11546
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Address" }),
11547
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
11548
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
11549
+ ] })
11550
+ }
11551
+ ),
11552
+ /* @__PURE__ */ jsxRuntime.jsx(
11553
+ Form$2.Field,
11554
+ {
11555
+ control: form.control,
11556
+ name: "address_2",
11557
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
11558
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { optional: true, children: "Apartment, suite, etc." }),
11559
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
11560
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
11561
+ ] })
11562
+ }
11563
+ ),
11564
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
11565
+ /* @__PURE__ */ jsxRuntime.jsx(
11566
+ Form$2.Field,
11567
+ {
11568
+ control: form.control,
11569
+ name: "postal_code",
11570
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
11571
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Postal code" }),
11572
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
11573
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
11574
+ ] })
11575
+ }
11576
+ ),
11577
+ /* @__PURE__ */ jsxRuntime.jsx(
11578
+ Form$2.Field,
11579
+ {
11580
+ control: form.control,
11581
+ name: "city",
11582
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
11583
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "City" }),
11584
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
11585
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
11586
+ ] })
11587
+ }
11588
+ )
11589
+ ] }),
11590
+ /* @__PURE__ */ jsxRuntime.jsx(
11591
+ Form$2.Field,
12355
11592
  {
12356
- ...field,
12357
- onValueChange: (value) => onChange(value),
12358
- symbol: getNativeSymbol(currencyCode),
12359
- code: currencyCode
11593
+ control: form.control,
11594
+ name: "province",
11595
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
11596
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { optional: true, children: "Province / State" }),
11597
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
11598
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
11599
+ ] })
12360
11600
  }
12361
- ) })
12362
- ] });
12363
- }
11601
+ ),
11602
+ /* @__PURE__ */ jsxRuntime.jsx(
11603
+ Form$2.Field,
11604
+ {
11605
+ control: form.control,
11606
+ name: "phone",
11607
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
11608
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { optional: true, children: "Phone" }),
11609
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
11610
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
11611
+ ] })
11612
+ }
11613
+ )
11614
+ ] }) }),
11615
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2", children: [
11616
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
11617
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "submit", isLoading: isPending, children: "Save" })
11618
+ ] }) })
11619
+ ]
12364
11620
  }
12365
- );
11621
+ ) });
12366
11622
  };
11623
+ const schema$2 = addressSchema;
12367
11624
  const TransferOwnership = () => {
12368
11625
  const { id } = reactRouterDom.useParams();
12369
11626
  const { draft_order, isPending, isError, error } = useDraftOrder(id, {
@@ -12776,273 +12033,1016 @@ const Illustration = () => {
12776
12033
  strokeLinecap: "round",
12777
12034
  strokeLinejoin: "round"
12778
12035
  }
12779
- ) }),
12780
- /* @__PURE__ */ jsxRuntime.jsxs("defs", { children: [
12781
- /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id: "clip0_20915_38670", children: /* @__PURE__ */ jsxRuntime.jsx(
12782
- "rect",
12783
- {
12784
- width: "12",
12785
- height: "12",
12786
- fill: "white",
12787
- transform: "matrix(0.865865 0.500278 -0.871576 0.490261 138.36 74.6508)"
12788
- }
12789
- ) }),
12790
- /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id: "clip1_20915_38670", children: /* @__PURE__ */ jsxRuntime.jsx(
12791
- "rect",
12792
- {
12793
- width: "12",
12794
- height: "12",
12795
- fill: "white",
12796
- transform: "matrix(0.865865 0.500278 -0.871576 0.490261 148.75 80.6541)"
12797
- }
12798
- ) }),
12799
- /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id: "clip2_20915_38670", children: /* @__PURE__ */ jsxRuntime.jsx(
12800
- "rect",
12036
+ ) }),
12037
+ /* @__PURE__ */ jsxRuntime.jsxs("defs", { children: [
12038
+ /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id: "clip0_20915_38670", children: /* @__PURE__ */ jsxRuntime.jsx(
12039
+ "rect",
12040
+ {
12041
+ width: "12",
12042
+ height: "12",
12043
+ fill: "white",
12044
+ transform: "matrix(0.865865 0.500278 -0.871576 0.490261 138.36 74.6508)"
12045
+ }
12046
+ ) }),
12047
+ /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id: "clip1_20915_38670", children: /* @__PURE__ */ jsxRuntime.jsx(
12048
+ "rect",
12049
+ {
12050
+ width: "12",
12051
+ height: "12",
12052
+ fill: "white",
12053
+ transform: "matrix(0.865865 0.500278 -0.871576 0.490261 148.75 80.6541)"
12054
+ }
12055
+ ) }),
12056
+ /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id: "clip2_20915_38670", children: /* @__PURE__ */ jsxRuntime.jsx(
12057
+ "rect",
12058
+ {
12059
+ width: "12",
12060
+ height: "12",
12061
+ fill: "white",
12062
+ transform: "matrix(0.865865 0.500278 -0.871576 0.490261 159.141 86.6575)"
12063
+ }
12064
+ ) }),
12065
+ /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id: "clip3_20915_38670", children: /* @__PURE__ */ jsxRuntime.jsx(
12066
+ "rect",
12067
+ {
12068
+ width: "12",
12069
+ height: "12",
12070
+ fill: "white",
12071
+ transform: "matrix(0.865865 0.500278 -0.871576 0.490261 120.928 84.4561)"
12072
+ }
12073
+ ) }),
12074
+ /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id: "clip4_20915_38670", children: /* @__PURE__ */ jsxRuntime.jsx(
12075
+ "rect",
12076
+ {
12077
+ width: "12",
12078
+ height: "12",
12079
+ fill: "white",
12080
+ transform: "matrix(0.865865 0.500278 -0.871576 0.490261 131.318 90.4594)"
12081
+ }
12082
+ ) }),
12083
+ /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id: "clip5_20915_38670", children: /* @__PURE__ */ jsxRuntime.jsx(
12084
+ "rect",
12085
+ {
12086
+ width: "12",
12087
+ height: "12",
12088
+ fill: "white",
12089
+ transform: "matrix(0.865865 0.500278 -0.871576 0.490261 141.709 96.4627)"
12090
+ }
12091
+ ) })
12092
+ ] })
12093
+ ]
12094
+ }
12095
+ );
12096
+ };
12097
+ const schema$1 = objectType({
12098
+ customer_id: stringType().min(1)
12099
+ });
12100
+ const NumberInput = React.forwardRef(
12101
+ ({
12102
+ value,
12103
+ onChange,
12104
+ size = "base",
12105
+ min = 0,
12106
+ max = 100,
12107
+ step = 1,
12108
+ className,
12109
+ disabled,
12110
+ ...props
12111
+ }, ref) => {
12112
+ const handleChange = (event) => {
12113
+ const newValue = event.target.value === "" ? min : Number(event.target.value);
12114
+ if (!isNaN(newValue) && (max === void 0 || newValue <= max) && (min === void 0 || newValue >= min)) {
12115
+ onChange(newValue);
12116
+ }
12117
+ };
12118
+ const handleIncrement = () => {
12119
+ const newValue = value + step;
12120
+ if (max === void 0 || newValue <= max) {
12121
+ onChange(newValue);
12122
+ }
12123
+ };
12124
+ const handleDecrement = () => {
12125
+ const newValue = value - step;
12126
+ if (min === void 0 || newValue >= min) {
12127
+ onChange(newValue);
12128
+ }
12129
+ };
12130
+ return /* @__PURE__ */ jsxRuntime.jsxs(
12131
+ "div",
12132
+ {
12133
+ className: ui.clx(
12134
+ "inline-flex rounded-md bg-ui-bg-field shadow-borders-base overflow-hidden divide-x transition-fg",
12135
+ "[&:has(input:focus)]:shadow-borders-interactive-with-active",
12136
+ {
12137
+ "h-7": size === "small",
12138
+ "h-8": size === "base"
12139
+ },
12140
+ className
12141
+ ),
12142
+ children: [
12143
+ /* @__PURE__ */ jsxRuntime.jsx(
12144
+ "input",
12145
+ {
12146
+ ref,
12147
+ type: "number",
12148
+ value,
12149
+ onChange: handleChange,
12150
+ min,
12151
+ max,
12152
+ step,
12153
+ className: ui.clx(
12154
+ "flex-1 px-2 py-1 bg-transparent txt-compact-small text-ui-fg-base outline-none [appearance:textfield]",
12155
+ "[&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none",
12156
+ "placeholder:text-ui-fg-muted"
12157
+ ),
12158
+ ...props
12159
+ }
12160
+ ),
12161
+ /* @__PURE__ */ jsxRuntime.jsxs(
12162
+ "button",
12163
+ {
12164
+ className: ui.clx(
12165
+ "flex items-center justify-center outline-none transition-fg",
12166
+ "disabled:cursor-not-allowed disabled:text-ui-fg-muted",
12167
+ "focus:bg-ui-bg-field-component-hover",
12168
+ "hover:bg-ui-bg-field-component-hover",
12169
+ {
12170
+ "size-7": size === "small",
12171
+ "size-8": size === "base"
12172
+ }
12173
+ ),
12174
+ type: "button",
12175
+ onClick: handleDecrement,
12176
+ disabled: min !== void 0 && value <= min || disabled,
12177
+ children: [
12178
+ /* @__PURE__ */ jsxRuntime.jsx(icons.Minus, {}),
12179
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: `Decrease by ${step}` })
12180
+ ]
12181
+ }
12182
+ ),
12183
+ /* @__PURE__ */ jsxRuntime.jsxs(
12184
+ "button",
12185
+ {
12186
+ className: ui.clx(
12187
+ "flex items-center justify-center outline-none transition-fg",
12188
+ "disabled:cursor-not-allowed disabled:text-ui-fg-muted",
12189
+ "focus:bg-ui-bg-field-hover",
12190
+ "hover:bg-ui-bg-field-hover",
12191
+ {
12192
+ "size-7": size === "small",
12193
+ "size-8": size === "base"
12194
+ }
12195
+ ),
12196
+ type: "button",
12197
+ onClick: handleIncrement,
12198
+ disabled: max !== void 0 && value >= max || disabled,
12199
+ children: [
12200
+ /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}),
12201
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: `Increase by ${step}` })
12202
+ ]
12203
+ }
12204
+ )
12205
+ ]
12206
+ }
12207
+ );
12208
+ }
12209
+ );
12210
+ const PRODUCT_VARIANTS_QUERY_KEY = "product-variants";
12211
+ const productVariantsQueryKeys = {
12212
+ list: (query2) => [
12213
+ PRODUCT_VARIANTS_QUERY_KEY,
12214
+ query2 ? query2 : void 0
12215
+ ]
12216
+ };
12217
+ const useProductVariants = (query2, options) => {
12218
+ const { data, ...rest } = reactQuery.useQuery({
12219
+ queryKey: productVariantsQueryKeys.list(query2),
12220
+ queryFn: async () => await sdk.admin.productVariant.list(query2),
12221
+ ...options
12222
+ });
12223
+ return { ...data, ...rest };
12224
+ };
12225
+ const STACKED_MODAL_ID = "items_stacked_modal";
12226
+ const Items = () => {
12227
+ const { id } = reactRouterDom.useParams();
12228
+ const {
12229
+ order: preview,
12230
+ isPending: isPreviewPending,
12231
+ isError: isPreviewError,
12232
+ error: previewError
12233
+ } = useOrderPreview(id, void 0, {
12234
+ placeholderData: reactQuery.keepPreviousData
12235
+ });
12236
+ useInitiateOrderEdit({ preview });
12237
+ const { draft_order, isPending, isError, error } = useDraftOrder(
12238
+ id,
12239
+ {
12240
+ fields: "currency_code"
12241
+ },
12242
+ {
12243
+ enabled: !!id
12244
+ }
12245
+ );
12246
+ const { onCancel } = useCancelOrderEdit({ preview });
12247
+ if (isError) {
12248
+ throw error;
12249
+ }
12250
+ if (isPreviewError) {
12251
+ throw previewError;
12252
+ }
12253
+ const ready = !!preview && !isPreviewPending && !!draft_order && !isPending;
12254
+ return /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal, { onClose: onCancel, children: ready ? /* @__PURE__ */ jsxRuntime.jsx(ItemsForm, { preview, currencyCode: draft_order.currency_code }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
12255
+ /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Edit Items" }) }),
12256
+ /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Loading data for the draft order, please wait..." }) })
12257
+ ] }) });
12258
+ };
12259
+ const ItemsForm = ({ preview, currencyCode }) => {
12260
+ var _a;
12261
+ const [isSubmitting, setIsSubmitting] = React.useState(false);
12262
+ const [modalContent, setModalContent] = React.useState(
12263
+ null
12264
+ );
12265
+ const { handleSuccess } = useRouteModal();
12266
+ const { searchValue, onSearchValueChange, query: query2 } = useDebouncedSearch();
12267
+ const { mutateAsync: confirmOrderEdit } = useDraftOrderConfirmEdit(preview.id);
12268
+ const { mutateAsync: requestOrderEdit } = useDraftOrderRequestEdit(preview.id);
12269
+ const itemCount = ((_a = preview.items) == null ? void 0 : _a.reduce((acc, item) => acc + item.quantity, 0)) || 0;
12270
+ const matches = React.useMemo(() => {
12271
+ return matchSorter.matchSorter(preview.items, query2, {
12272
+ keys: ["product_title", "variant_title", "variant_sku", "title"]
12273
+ });
12274
+ }, [preview.items, query2]);
12275
+ const onSubmit = async () => {
12276
+ setIsSubmitting(true);
12277
+ let requestSucceeded = false;
12278
+ await requestOrderEdit(void 0, {
12279
+ onError: (e) => {
12280
+ ui.toast.error(`Failed to request order edit: ${e.message}`);
12281
+ },
12282
+ onSuccess: () => {
12283
+ requestSucceeded = true;
12284
+ }
12285
+ });
12286
+ if (!requestSucceeded) {
12287
+ setIsSubmitting(false);
12288
+ return;
12289
+ }
12290
+ await confirmOrderEdit(void 0, {
12291
+ onError: (e) => {
12292
+ ui.toast.error(`Failed to confirm order edit: ${e.message}`);
12293
+ },
12294
+ onSuccess: () => {
12295
+ handleSuccess();
12296
+ },
12297
+ onSettled: () => {
12298
+ setIsSubmitting(false);
12299
+ }
12300
+ });
12301
+ };
12302
+ const onKeyDown = React.useCallback(
12303
+ (e) => {
12304
+ if (e.key === "Enter" && (e.ctrlKey || e.metaKey)) {
12305
+ if (modalContent || isSubmitting) {
12306
+ return;
12307
+ }
12308
+ onSubmit();
12309
+ }
12310
+ },
12311
+ [modalContent, isSubmitting, onSubmit]
12312
+ );
12313
+ React.useEffect(() => {
12314
+ document.addEventListener("keydown", onKeyDown);
12315
+ return () => {
12316
+ document.removeEventListener("keydown", onKeyDown);
12317
+ };
12318
+ }, [onKeyDown]);
12319
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full flex-col overflow-hidden", children: [
12320
+ /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Header, {}),
12321
+ /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Body, { className: "flex flex-1 flex-col overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsxs(
12322
+ StackedFocusModal,
12323
+ {
12324
+ id: STACKED_MODAL_ID,
12325
+ onOpenChangeCallback: (open) => {
12326
+ if (!open) {
12327
+ setModalContent(null);
12328
+ }
12329
+ },
12330
+ children: [
12331
+ /* @__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-6 py-16", children: [
12332
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
12333
+ /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Items" }) }),
12334
+ /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Edit the items in the draft order" }) })
12335
+ ] }),
12336
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
12337
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-6", children: [
12338
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 items-center gap-3", children: [
12339
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
12340
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: "Items" }),
12341
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Choose items from the product catalog." })
12342
+ ] }),
12343
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
12344
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
12345
+ ui.Input,
12346
+ {
12347
+ type: "search",
12348
+ placeholder: "Search items",
12349
+ value: searchValue,
12350
+ onChange: (e) => onSearchValueChange(e.target.value)
12351
+ }
12352
+ ) }),
12353
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
12354
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.IconButton, { type: "button", children: /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}) }) }),
12355
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu.Content, { children: [
12356
+ /* @__PURE__ */ jsxRuntime.jsx(
12357
+ StackedModalTrigger,
12358
+ {
12359
+ type: "add-items",
12360
+ setModalContent
12361
+ }
12362
+ ),
12363
+ /* @__PURE__ */ jsxRuntime.jsx(
12364
+ StackedModalTrigger,
12365
+ {
12366
+ type: "add-custom-item",
12367
+ setModalContent
12368
+ }
12369
+ )
12370
+ ] })
12371
+ ] })
12372
+ ] })
12373
+ ] }),
12374
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-ui-bg-subtle shadow-elevation-card-rest rounded-xl", children: [
12375
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-[5px]", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-ui-fg-muted grid grid-cols-[2fr_1fr_2fr_28px] gap-3 px-4 py-2", children: [
12376
+ /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: "Item" }) }),
12377
+ /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: "Quantity" }) }),
12378
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-right", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: "Price" }) }),
12379
+ /* @__PURE__ */ jsxRuntime.jsx("div", {})
12380
+ ] }) }),
12381
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-y-1.5 px-[5px] pb-[5px]", children: itemCount <= 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-ui-bg-base shadow-elevation-card-rest flex flex-col items-center justify-center gap-1 gap-x-3 rounded-lg p-4", children: [
12382
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: "There are no items in this order" }),
12383
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Add items to the order to get started." })
12384
+ ] }) : matches.length > 0 ? matches == null ? void 0 : matches.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
12385
+ Item,
12386
+ {
12387
+ item,
12388
+ preview,
12389
+ currencyCode
12390
+ },
12391
+ item.id
12392
+ )) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-ui-bg-base shadow-elevation-card-rest flex flex-col items-center justify-center gap-1 gap-x-3 rounded-lg p-4", children: [
12393
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: "No items found" }),
12394
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: [
12395
+ 'No items found for "',
12396
+ query2,
12397
+ '".'
12398
+ ] })
12399
+ ] }) })
12400
+ ] })
12401
+ ] }),
12402
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
12403
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[1fr_0.5fr_0.5fr] gap-3", children: [
12404
+ /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: "Subtotal" }) }),
12405
+ /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsxs(
12406
+ ui.Text,
12407
+ {
12408
+ size: "small",
12409
+ leading: "compact",
12410
+ className: "text-ui-fg-subtle",
12411
+ children: [
12412
+ itemCount,
12413
+ " ",
12414
+ itemCount === 1 ? "item" : "items"
12415
+ ]
12416
+ }
12417
+ ) }),
12418
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-right", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: getStylizedAmount(preview.item_subtotal, currencyCode) }) })
12419
+ ] })
12420
+ ] }) }),
12421
+ modalContent && (modalContent === "add-items" ? /* @__PURE__ */ jsxRuntime.jsx(ExistingItemsForm, { orderId: preview.id, items: preview.items }) : modalContent === "add-custom-item" ? /* @__PURE__ */ jsxRuntime.jsx(
12422
+ CustomItemForm,
12801
12423
  {
12802
- width: "12",
12803
- height: "12",
12804
- fill: "white",
12805
- transform: "matrix(0.865865 0.500278 -0.871576 0.490261 159.141 86.6575)"
12424
+ orderId: preview.id,
12425
+ currencyCode
12806
12426
  }
12807
- ) }),
12808
- /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id: "clip3_20915_38670", children: /* @__PURE__ */ jsxRuntime.jsx(
12809
- "rect",
12427
+ ) : null)
12428
+ ]
12429
+ }
12430
+ ) }),
12431
+ /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
12432
+ /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
12433
+ /* @__PURE__ */ jsxRuntime.jsx(
12434
+ ui.Button,
12435
+ {
12436
+ size: "small",
12437
+ type: "button",
12438
+ onClick: onSubmit,
12439
+ isLoading: isSubmitting,
12440
+ children: "Save"
12441
+ }
12442
+ )
12443
+ ] }) })
12444
+ ] });
12445
+ };
12446
+ const Item = ({ item, preview, currencyCode }) => {
12447
+ if (item.variant_id) {
12448
+ return /* @__PURE__ */ jsxRuntime.jsx(VariantItem, { item, preview, currencyCode });
12449
+ }
12450
+ return /* @__PURE__ */ jsxRuntime.jsx(CustomItem, { item, preview, currencyCode });
12451
+ };
12452
+ const VariantItem = ({ item, preview, currencyCode }) => {
12453
+ const [editing, setEditing] = React.useState(false);
12454
+ const form = reactHookForm.useForm({
12455
+ defaultValues: {
12456
+ quantity: item.quantity,
12457
+ unit_price: item.unit_price
12458
+ },
12459
+ resolver: zod.zodResolver(variantItemSchema)
12460
+ });
12461
+ const actionId = React.useMemo(() => {
12462
+ var _a, _b;
12463
+ return (_b = (_a = item.actions) == null ? void 0 : _a.find((a) => a.action === "ITEM_ADD")) == null ? void 0 : _b.id;
12464
+ }, [item]);
12465
+ const { mutateAsync: updateActionItem, isPending: isUpdatingActionItem } = useDraftOrderUpdateActionItem(preview.id);
12466
+ const { mutateAsync: updateOriginalItem, isPending: isUpdatingOriginalItem } = useDraftOrderUpdateItem(preview.id);
12467
+ const isPending = isUpdatingActionItem || isUpdatingOriginalItem;
12468
+ const onSubmit = form.handleSubmit(async (data) => {
12469
+ if (convertNumber(data.unit_price) === item.unit_price && data.quantity === item.quantity) {
12470
+ setEditing(false);
12471
+ return;
12472
+ }
12473
+ if (!actionId) {
12474
+ await updateOriginalItem(
12475
+ {
12476
+ item_id: item.id,
12477
+ quantity: data.quantity,
12478
+ unit_price: convertNumber(data.unit_price)
12479
+ },
12480
+ {
12481
+ onSuccess: () => {
12482
+ setEditing(false);
12483
+ },
12484
+ onError: (e) => {
12485
+ ui.toast.error(e.message);
12486
+ }
12487
+ }
12488
+ );
12489
+ return;
12490
+ }
12491
+ await updateActionItem(
12492
+ {
12493
+ action_id: actionId,
12494
+ quantity: data.quantity,
12495
+ unit_price: convertNumber(data.unit_price)
12496
+ },
12497
+ {
12498
+ onSuccess: () => {
12499
+ setEditing(false);
12500
+ },
12501
+ onError: (e) => {
12502
+ ui.toast.error(e.message);
12503
+ }
12504
+ }
12505
+ );
12506
+ });
12507
+ 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: [
12508
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full items-center gap-x-3", children: [
12509
+ /* @__PURE__ */ jsxRuntime.jsx(
12510
+ Thumbnail,
12511
+ {
12512
+ thumbnail: item.thumbnail,
12513
+ alt: item.product_title ?? void 0
12514
+ }
12515
+ ),
12516
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
12517
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-1", children: [
12518
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: item.product_title }),
12519
+ /* @__PURE__ */ jsxRuntime.jsxs(
12520
+ ui.Text,
12810
12521
  {
12811
- width: "12",
12812
- height: "12",
12813
- fill: "white",
12814
- transform: "matrix(0.865865 0.500278 -0.871576 0.490261 120.928 84.4561)"
12522
+ size: "small",
12523
+ leading: "compact",
12524
+ className: "text-ui-fg-subtle",
12525
+ children: [
12526
+ "(",
12527
+ item.variant_title,
12528
+ ")"
12529
+ ]
12815
12530
  }
12816
- ) }),
12817
- /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id: "clip4_20915_38670", children: /* @__PURE__ */ jsxRuntime.jsx(
12818
- "rect",
12531
+ )
12532
+ ] }),
12533
+ /* @__PURE__ */ jsxRuntime.jsx(
12534
+ ui.Text,
12535
+ {
12536
+ size: "small",
12537
+ leading: "compact",
12538
+ className: "text-ui-fg-subtle",
12539
+ children: item.variant_sku
12540
+ }
12541
+ )
12542
+ ] })
12543
+ ] }),
12544
+ editing ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
12545
+ Form$2.Field,
12546
+ {
12547
+ control: form.control,
12548
+ name: "quantity",
12549
+ render: ({ field }) => {
12550
+ return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(NumberInput, { ...field }) }) });
12551
+ }
12552
+ }
12553
+ ) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: item.quantity }) }),
12554
+ editing ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
12555
+ Form$2.Field,
12556
+ {
12557
+ control: form.control,
12558
+ name: "unit_price",
12559
+ render: ({ field: { onChange, ...field } }) => {
12560
+ return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
12561
+ ui.CurrencyInput,
12819
12562
  {
12820
- width: "12",
12821
- height: "12",
12822
- fill: "white",
12823
- transform: "matrix(0.865865 0.500278 -0.871576 0.490261 131.318 90.4594)"
12563
+ ...field,
12564
+ symbol: getNativeSymbol(currencyCode),
12565
+ code: currencyCode,
12566
+ onValueChange: (_value, _name, values) => onChange(values == null ? void 0 : values.value)
12824
12567
  }
12825
- ) }),
12826
- /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id: "clip5_20915_38670", children: /* @__PURE__ */ jsxRuntime.jsx(
12827
- "rect",
12568
+ ) }) });
12569
+ }
12570
+ }
12571
+ ) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex w-full flex-1 items-center justify-end", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: getLocaleAmount(item.unit_price, currencyCode) }) }),
12572
+ /* @__PURE__ */ jsxRuntime.jsx(
12573
+ ui.IconButton,
12574
+ {
12575
+ type: "button",
12576
+ size: "small",
12577
+ onClick: editing ? onSubmit : () => {
12578
+ setEditing(true);
12579
+ },
12580
+ disabled: isPending,
12581
+ children: editing ? /* @__PURE__ */ jsxRuntime.jsx(icons.Check, {}) : /* @__PURE__ */ jsxRuntime.jsx(icons.PencilSquare, {})
12582
+ }
12583
+ )
12584
+ ] }) }) });
12585
+ };
12586
+ const variantItemSchema = objectType({
12587
+ quantity: numberType(),
12588
+ unit_price: unionType([numberType(), stringType()])
12589
+ });
12590
+ const CustomItem = ({ item, preview, currencyCode }) => {
12591
+ const [editing, setEditing] = React.useState(false);
12592
+ const { quantity, unit_price, title } = item;
12593
+ const form = reactHookForm.useForm({
12594
+ defaultValues: {
12595
+ title,
12596
+ quantity,
12597
+ unit_price
12598
+ },
12599
+ resolver: zod.zodResolver(customItemSchema)
12600
+ });
12601
+ React.useEffect(() => {
12602
+ form.reset({
12603
+ title,
12604
+ quantity,
12605
+ unit_price
12606
+ });
12607
+ }, [form, title, quantity, unit_price]);
12608
+ const actionId = React.useMemo(() => {
12609
+ var _a, _b;
12610
+ return (_b = (_a = item.actions) == null ? void 0 : _a.find((a) => a.action === "ITEM_ADD")) == null ? void 0 : _b.id;
12611
+ }, [item]);
12612
+ const { mutateAsync: updateActionItem, isPending: isUpdatingActionItem } = useDraftOrderUpdateActionItem(preview.id);
12613
+ const { mutateAsync: removeActionItem, isPending: isRemovingActionItem } = useDraftOrderRemoveActionItem(preview.id);
12614
+ const { mutateAsync: updateOriginalItem, isPending: isUpdatingOriginalItem } = useDraftOrderUpdateItem(preview.id);
12615
+ const isPending = isUpdatingActionItem || isUpdatingOriginalItem;
12616
+ const onSubmit = form.handleSubmit(async (data) => {
12617
+ if (convertNumber(data.unit_price) === item.unit_price && data.quantity === item.quantity && data.title === item.title) {
12618
+ setEditing(false);
12619
+ return;
12620
+ }
12621
+ if (!actionId) {
12622
+ await updateOriginalItem(
12623
+ {
12624
+ item_id: item.id,
12625
+ quantity: data.quantity,
12626
+ unit_price: convertNumber(data.unit_price)
12627
+ },
12628
+ {
12629
+ onSuccess: () => {
12630
+ setEditing(false);
12631
+ },
12632
+ onError: (e) => {
12633
+ ui.toast.error(e.message);
12634
+ }
12635
+ }
12636
+ );
12637
+ return;
12638
+ }
12639
+ if (data.quantity === 0) {
12640
+ await removeActionItem(actionId, {
12641
+ onSuccess: () => {
12642
+ setEditing(false);
12643
+ },
12644
+ onError: (e) => {
12645
+ ui.toast.error(e.message);
12646
+ }
12647
+ });
12648
+ return;
12649
+ }
12650
+ await updateActionItem(
12651
+ {
12652
+ action_id: actionId,
12653
+ quantity: data.quantity,
12654
+ unit_price: convertNumber(data.unit_price)
12655
+ },
12656
+ {
12657
+ onSuccess: () => {
12658
+ setEditing(false);
12659
+ },
12660
+ onError: (e) => {
12661
+ ui.toast.error(e.message);
12662
+ }
12663
+ }
12664
+ );
12665
+ });
12666
+ 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: [
12667
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-3", children: [
12668
+ /* @__PURE__ */ jsxRuntime.jsx(
12669
+ Thumbnail,
12670
+ {
12671
+ thumbnail: item.thumbnail,
12672
+ alt: item.title ?? void 0
12673
+ }
12674
+ ),
12675
+ editing ? /* @__PURE__ */ jsxRuntime.jsx(
12676
+ Form$2.Field,
12677
+ {
12678
+ control: form.control,
12679
+ name: "title",
12680
+ render: ({ field }) => {
12681
+ return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }) });
12682
+ }
12683
+ }
12684
+ ) : /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: item.title })
12685
+ ] }),
12686
+ editing ? /* @__PURE__ */ jsxRuntime.jsx(
12687
+ Form$2.Field,
12688
+ {
12689
+ control: form.control,
12690
+ name: "quantity",
12691
+ render: ({ field }) => {
12692
+ return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(NumberInput, { ...field }) }) });
12693
+ }
12694
+ }
12695
+ ) : /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: item.quantity }),
12696
+ editing ? /* @__PURE__ */ jsxRuntime.jsx(
12697
+ Form$2.Field,
12698
+ {
12699
+ control: form.control,
12700
+ name: "unit_price",
12701
+ render: ({ field: { onChange, ...field } }) => {
12702
+ return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
12703
+ ui.CurrencyInput,
12828
12704
  {
12829
- width: "12",
12830
- height: "12",
12831
- fill: "white",
12832
- transform: "matrix(0.865865 0.500278 -0.871576 0.490261 141.709 96.4627)"
12705
+ ...field,
12706
+ symbol: getNativeSymbol(currencyCode),
12707
+ code: currencyCode,
12708
+ onValueChange: (_value, _name, values) => onChange(values == null ? void 0 : values.value)
12833
12709
  }
12834
- ) })
12835
- ] })
12836
- ]
12837
- }
12838
- );
12710
+ ) }) });
12711
+ }
12712
+ }
12713
+ ) : /* @__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) }) }),
12714
+ /* @__PURE__ */ jsxRuntime.jsx(
12715
+ ui.IconButton,
12716
+ {
12717
+ type: "button",
12718
+ size: "small",
12719
+ onClick: editing ? onSubmit : () => {
12720
+ setEditing(true);
12721
+ },
12722
+ disabled: isPending,
12723
+ children: editing ? /* @__PURE__ */ jsxRuntime.jsx(icons.Check, {}) : /* @__PURE__ */ jsxRuntime.jsx(icons.PencilSquare, {})
12724
+ }
12725
+ )
12726
+ ] }) }) });
12839
12727
  };
12840
- const schema$1 = objectType({
12841
- customer_id: stringType().min(1)
12842
- });
12843
- const ShippingAddress = () => {
12844
- const { id } = reactRouterDom.useParams();
12845
- const { order, isPending, isError, error } = useOrder(id, {
12846
- fields: "+shipping_address"
12847
- });
12848
- if (isError) {
12849
- throw error;
12850
- }
12851
- const isReady = !isPending && !!order;
12852
- return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { children: [
12853
- /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer.Header, { children: [
12854
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Shipping Address" }) }),
12855
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Edit the shipping address for the draft order" }) })
12856
- ] }),
12857
- isReady && /* @__PURE__ */ jsxRuntime.jsx(ShippingAddressForm, { order })
12858
- ] });
12728
+ const StackedModalTrigger = ({
12729
+ type,
12730
+ setModalContent
12731
+ }) => {
12732
+ const { setIsOpen } = useStackedModal();
12733
+ const onClick = React.useCallback(() => {
12734
+ setModalContent(type);
12735
+ setIsOpen(STACKED_MODAL_ID, true);
12736
+ }, [setModalContent, setIsOpen, type]);
12737
+ 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" }) });
12859
12738
  };
12860
- const ShippingAddressForm = ({ order }) => {
12861
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
12862
- const form = reactHookForm.useForm({
12863
- defaultValues: {
12864
- first_name: ((_a = order.shipping_address) == null ? void 0 : _a.first_name) ?? "",
12865
- last_name: ((_b = order.shipping_address) == null ? void 0 : _b.last_name) ?? "",
12866
- company: ((_c = order.shipping_address) == null ? void 0 : _c.company) ?? "",
12867
- address_1: ((_d = order.shipping_address) == null ? void 0 : _d.address_1) ?? "",
12868
- address_2: ((_e = order.shipping_address) == null ? void 0 : _e.address_2) ?? "",
12869
- city: ((_f = order.shipping_address) == null ? void 0 : _f.city) ?? "",
12870
- province: ((_g = order.shipping_address) == null ? void 0 : _g.province) ?? "",
12871
- country_code: ((_h = order.shipping_address) == null ? void 0 : _h.country_code) ?? "",
12872
- postal_code: ((_i = order.shipping_address) == null ? void 0 : _i.postal_code) ?? "",
12873
- phone: ((_j = order.shipping_address) == null ? void 0 : _j.phone) ?? ""
12739
+ const VARIANT_PREFIX = "items";
12740
+ const LIMIT = 50;
12741
+ const ExistingItemsForm = ({ orderId, items }) => {
12742
+ const { setIsOpen } = useStackedModal();
12743
+ const [rowSelection, setRowSelection] = React.useState(
12744
+ items.reduce((acc, item) => {
12745
+ acc[item.variant_id] = true;
12746
+ return acc;
12747
+ }, {})
12748
+ );
12749
+ React.useEffect(() => {
12750
+ setRowSelection(
12751
+ items.reduce((acc, item) => {
12752
+ if (item.variant_id) {
12753
+ acc[item.variant_id] = true;
12754
+ }
12755
+ return acc;
12756
+ }, {})
12757
+ );
12758
+ }, [items]);
12759
+ const { q, order, offset } = useQueryParams(
12760
+ ["q", "order", "offset"],
12761
+ VARIANT_PREFIX
12762
+ );
12763
+ const { variants, count, isPending, isError, error } = useProductVariants(
12764
+ {
12765
+ q,
12766
+ order,
12767
+ offset: offset ? parseInt(offset) : void 0,
12768
+ limit: LIMIT
12874
12769
  },
12875
- resolver: zod.zodResolver(schema)
12876
- });
12877
- const { mutateAsync, isPending } = useUpdateDraftOrder(order.id);
12878
- const { handleSuccess } = useRouteModal();
12879
- const onSubmit = form.handleSubmit(async (data) => {
12770
+ {
12771
+ placeholderData: reactQuery.keepPreviousData
12772
+ }
12773
+ );
12774
+ const columns = useColumns();
12775
+ const { mutateAsync } = useDraftOrderAddItems(orderId);
12776
+ const onSubmit = async () => {
12777
+ const ids = Object.keys(rowSelection).filter(
12778
+ (id) => !items.find((i) => i.variant_id === id)
12779
+ );
12880
12780
  await mutateAsync(
12881
12781
  {
12882
- shipping_address: {
12883
- first_name: data.first_name,
12884
- last_name: data.last_name,
12885
- company: data.company,
12886
- address_1: data.address_1,
12887
- address_2: data.address_2,
12888
- city: data.city,
12889
- province: data.province,
12890
- country_code: data.country_code,
12891
- postal_code: data.postal_code,
12892
- phone: data.phone
12893
- }
12782
+ items: ids.map((id) => ({
12783
+ variant_id: id,
12784
+ quantity: 1
12785
+ }))
12894
12786
  },
12895
12787
  {
12896
12788
  onSuccess: () => {
12897
- handleSuccess();
12789
+ setRowSelection({});
12790
+ setIsOpen(STACKED_MODAL_ID, false);
12898
12791
  },
12899
- onError: (error) => {
12900
- ui.toast.error(error.message);
12792
+ onError: (e) => {
12793
+ ui.toast.error(e.message);
12901
12794
  }
12902
12795
  }
12903
12796
  );
12904
- });
12905
- return /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxRuntime.jsxs(
12906
- KeyboundForm,
12797
+ };
12798
+ if (isError) {
12799
+ throw error;
12800
+ }
12801
+ return /* @__PURE__ */ jsxRuntime.jsxs(
12802
+ StackedFocusModal.Content,
12907
12803
  {
12908
- className: "flex flex-1 flex-col overflow-hidden",
12909
- onSubmit,
12804
+ onOpenAutoFocus: (e) => {
12805
+ e.preventDefault();
12806
+ const searchInput = document.querySelector(
12807
+ "[data-modal-id='modal-search-input']"
12808
+ );
12809
+ if (searchInput) {
12810
+ searchInput.focus();
12811
+ }
12812
+ },
12910
12813
  children: [
12911
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Body, { className: "flex flex-col gap-y-6 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-4", children: [
12912
- /* @__PURE__ */ jsxRuntime.jsx(
12913
- Form$2.Field,
12914
- {
12915
- control: form.control,
12916
- name: "country_code",
12917
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12918
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Country" }),
12919
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(CountrySelect, { ...field }) }),
12920
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12921
- ] })
12922
- }
12923
- ),
12924
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
12925
- /* @__PURE__ */ jsxRuntime.jsx(
12926
- Form$2.Field,
12927
- {
12928
- control: form.control,
12929
- name: "first_name",
12930
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12931
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "First name" }),
12932
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12933
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12934
- ] })
12935
- }
12936
- ),
12937
- /* @__PURE__ */ jsxRuntime.jsx(
12938
- Form$2.Field,
12939
- {
12940
- control: form.control,
12941
- name: "last_name",
12942
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12943
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Last name" }),
12944
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12945
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12946
- ] })
12814
+ /* @__PURE__ */ jsxRuntime.jsxs(StackedFocusModal.Header, { children: [
12815
+ /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Product Variants" }) }),
12816
+ /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Choose product variants to add to the order." }) })
12817
+ ] }),
12818
+ /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Body, { className: "flex-1 overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx(
12819
+ DataTable,
12820
+ {
12821
+ data: variants,
12822
+ columns,
12823
+ isLoading: isPending,
12824
+ getRowId: (row) => row.id,
12825
+ rowCount: count,
12826
+ prefix: VARIANT_PREFIX,
12827
+ layout: "fill",
12828
+ rowSelection: {
12829
+ state: rowSelection,
12830
+ onRowSelectionChange: setRowSelection,
12831
+ enableRowSelection: (row) => {
12832
+ return !items.find((i) => i.variant_id === row.original.id);
12947
12833
  }
12948
- )
12949
- ] }),
12950
- /* @__PURE__ */ jsxRuntime.jsx(
12951
- Form$2.Field,
12952
- {
12953
- control: form.control,
12954
- name: "company",
12955
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12956
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { optional: true, children: "Company" }),
12957
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12958
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12959
- ] })
12960
- }
12961
- ),
12962
- /* @__PURE__ */ jsxRuntime.jsx(
12963
- Form$2.Field,
12964
- {
12965
- control: form.control,
12966
- name: "address_1",
12967
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12968
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Address" }),
12969
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12970
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12971
- ] })
12972
- }
12973
- ),
12974
- /* @__PURE__ */ jsxRuntime.jsx(
12975
- Form$2.Field,
12976
- {
12977
- control: form.control,
12978
- name: "address_2",
12979
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12980
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { optional: true, children: "Apartment, suite, etc." }),
12981
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12982
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12983
- ] })
12984
- }
12985
- ),
12986
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
12834
+ },
12835
+ autoFocusSearch: true
12836
+ }
12837
+ ) }),
12838
+ /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
12839
+ /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
12840
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "button", onClick: onSubmit, children: "Update items" })
12841
+ ] }) })
12842
+ ]
12843
+ }
12844
+ );
12845
+ };
12846
+ const columnHelper = ui.createDataTableColumnHelper();
12847
+ const useColumns = () => {
12848
+ return React.useMemo(() => {
12849
+ return [
12850
+ columnHelper.select(),
12851
+ columnHelper.accessor("product.title", {
12852
+ header: "Product",
12853
+ cell: ({ row }) => {
12854
+ var _a, _b, _c;
12855
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-2", children: [
12987
12856
  /* @__PURE__ */ jsxRuntime.jsx(
12988
- Form$2.Field,
12857
+ Thumbnail,
12989
12858
  {
12990
- control: form.control,
12991
- name: "postal_code",
12992
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12993
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Postal code" }),
12994
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12995
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12996
- ] })
12859
+ thumbnail: (_a = row.original.product) == null ? void 0 : _a.thumbnail,
12860
+ alt: (_b = row.original.product) == null ? void 0 : _b.title
12997
12861
  }
12998
12862
  ),
12999
- /* @__PURE__ */ jsxRuntime.jsx(
13000
- Form$2.Field,
13001
- {
13002
- control: form.control,
13003
- name: "city",
13004
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
13005
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "City" }),
13006
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
13007
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
13008
- ] })
13009
- }
13010
- )
13011
- ] }),
13012
- /* @__PURE__ */ jsxRuntime.jsx(
13013
- Form$2.Field,
12863
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: (_c = row.original.product) == null ? void 0 : _c.title })
12864
+ ] });
12865
+ },
12866
+ enableSorting: true
12867
+ }),
12868
+ columnHelper.accessor("title", {
12869
+ header: "Variant",
12870
+ enableSorting: true
12871
+ }),
12872
+ columnHelper.accessor("sku", {
12873
+ header: "SKU",
12874
+ cell: ({ getValue }) => {
12875
+ return getValue() ?? "-";
12876
+ },
12877
+ enableSorting: true
12878
+ }),
12879
+ columnHelper.accessor("updated_at", {
12880
+ header: "Updated",
12881
+ cell: ({ getValue }) => {
12882
+ return /* @__PURE__ */ jsxRuntime.jsx(
12883
+ ui.Tooltip,
13014
12884
  {
13015
- control: form.control,
13016
- name: "province",
13017
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
13018
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { optional: true, children: "Province / State" }),
13019
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
13020
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
13021
- ] })
12885
+ content: getFullDate({ date: getValue(), includeTime: true }),
12886
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: getFullDate({ date: getValue() }) })
13022
12887
  }
13023
- ),
13024
- /* @__PURE__ */ jsxRuntime.jsx(
13025
- Form$2.Field,
12888
+ );
12889
+ },
12890
+ enableSorting: true,
12891
+ sortAscLabel: "Oldest first",
12892
+ sortDescLabel: "Newest first"
12893
+ }),
12894
+ columnHelper.accessor("created_at", {
12895
+ header: "Created",
12896
+ cell: ({ getValue }) => {
12897
+ return /* @__PURE__ */ jsxRuntime.jsx(
12898
+ ui.Tooltip,
13026
12899
  {
13027
- control: form.control,
13028
- name: "phone",
13029
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
13030
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { optional: true, children: "Phone" }),
13031
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
13032
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
13033
- ] })
12900
+ content: getFullDate({ date: getValue(), includeTime: true }),
12901
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: getFullDate({ date: getValue() }) })
13034
12902
  }
13035
- )
13036
- ] }) }),
13037
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2", children: [
13038
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
13039
- /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "submit", isLoading: isPending, children: "Save" })
13040
- ] }) })
13041
- ]
13042
- }
13043
- ) });
12903
+ );
12904
+ },
12905
+ enableSorting: true,
12906
+ sortAscLabel: "Oldest first",
12907
+ sortDescLabel: "Newest first"
12908
+ })
12909
+ ];
12910
+ }, []);
12911
+ };
12912
+ const CustomItemForm = ({ orderId, currencyCode }) => {
12913
+ const { setIsOpen } = useStackedModal();
12914
+ const { mutateAsync: addItems } = useDraftOrderAddItems(orderId);
12915
+ const form = reactHookForm.useForm({
12916
+ defaultValues: {
12917
+ title: "",
12918
+ quantity: 1,
12919
+ unit_price: ""
12920
+ },
12921
+ resolver: zod.zodResolver(customItemSchema)
12922
+ });
12923
+ const onSubmit = form.handleSubmit(async (data) => {
12924
+ await addItems(
12925
+ {
12926
+ items: [
12927
+ {
12928
+ title: data.title,
12929
+ quantity: data.quantity,
12930
+ unit_price: convertNumber(data.unit_price)
12931
+ }
12932
+ ]
12933
+ },
12934
+ {
12935
+ onSuccess: () => {
12936
+ setIsOpen(STACKED_MODAL_ID, false);
12937
+ },
12938
+ onError: (e) => {
12939
+ ui.toast.error(e.message);
12940
+ }
12941
+ }
12942
+ );
12943
+ });
12944
+ return /* @__PURE__ */ jsxRuntime.jsx(Form$2, { ...form, children: /* @__PURE__ */ jsxRuntime.jsx(KeyboundForm, { onSubmit, children: /* @__PURE__ */ jsxRuntime.jsxs(StackedFocusModal.Content, { children: [
12945
+ /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Header, {}),
12946
+ /* @__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: [
12947
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
12948
+ /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Add custom item" }) }),
12949
+ /* @__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." }) })
12950
+ ] }),
12951
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
12952
+ /* @__PURE__ */ jsxRuntime.jsx(
12953
+ Form$2.Field,
12954
+ {
12955
+ control: form.control,
12956
+ name: "title",
12957
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
12958
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
12959
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Title" }),
12960
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Hint, { children: "Enter the title of the item" })
12961
+ ] }),
12962
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
12963
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12964
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12965
+ ] })
12966
+ ] }) })
12967
+ }
12968
+ ),
12969
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
12970
+ /* @__PURE__ */ jsxRuntime.jsx(
12971
+ Form$2.Field,
12972
+ {
12973
+ control: form.control,
12974
+ name: "unit_price",
12975
+ render: ({ field: { onChange, ...field } }) => /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
12976
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
12977
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Unit price" }),
12978
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Hint, { children: "Enter the unit price of the item" })
12979
+ ] }),
12980
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
12981
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
12982
+ ui.CurrencyInput,
12983
+ {
12984
+ symbol: getNativeSymbol(currencyCode),
12985
+ code: currencyCode,
12986
+ onValueChange: (_value, _name, values) => onChange(values == null ? void 0 : values.value),
12987
+ ...field
12988
+ }
12989
+ ) }),
12990
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12991
+ ] })
12992
+ ] }) })
12993
+ }
12994
+ ),
12995
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
12996
+ /* @__PURE__ */ jsxRuntime.jsx(
12997
+ Form$2.Field,
12998
+ {
12999
+ control: form.control,
13000
+ name: "quantity",
13001
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
13002
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
13003
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Quantity" }),
13004
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Hint, { children: "Enter the quantity of the item" })
13005
+ ] }),
13006
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full flex-1", children: [
13007
+ /* @__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" }) }) }),
13008
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
13009
+ ] })
13010
+ ] }) })
13011
+ }
13012
+ )
13013
+ ] }) }) }),
13014
+ /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
13015
+ /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
13016
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "button", onClick: onSubmit, children: "Add item" })
13017
+ ] }) })
13018
+ ] }) }) });
13019
+ };
13020
+ const customItemSchema = objectType({
13021
+ title: stringType().min(1),
13022
+ quantity: numberType(),
13023
+ unit_price: unionType([numberType(), stringType()])
13024
+ });
13025
+ const CustomItems = () => {
13026
+ return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { children: [
13027
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Custom Items" }) }) }),
13028
+ /* @__PURE__ */ jsxRuntime.jsx(CustomItemsForm, {})
13029
+ ] });
13030
+ };
13031
+ const CustomItemsForm = () => {
13032
+ const form = reactHookForm.useForm({
13033
+ resolver: zod.zodResolver(schema)
13034
+ });
13035
+ return /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxRuntime.jsxs(KeyboundForm, { className: "flex flex-1 flex-col", children: [
13036
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Body, {}),
13037
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2", children: [
13038
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
13039
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "submit", children: "Save" })
13040
+ ] }) })
13041
+ ] }) });
13044
13042
  };
13045
- const schema = addressSchema;
13043
+ const schema = objectType({
13044
+ email: stringType().email()
13045
+ });
13046
13046
  const widgetModule = { widgets: [] };
13047
13047
  const routeModule = {
13048
13048
  routes: [
@@ -13063,10 +13063,6 @@ const routeModule = {
13063
13063
  handle,
13064
13064
  loader,
13065
13065
  children: [
13066
- {
13067
- Component: CustomItems,
13068
- path: "/draft-orders/:id/custom-items"
13069
- },
13070
13066
  {
13071
13067
  Component: BillingAddress,
13072
13068
  path: "/draft-orders/:id/billing-address"
@@ -13075,10 +13071,6 @@ const routeModule = {
13075
13071
  Component: Email,
13076
13072
  path: "/draft-orders/:id/email"
13077
13073
  },
13078
- {
13079
- Component: Items,
13080
- path: "/draft-orders/:id/items"
13081
- },
13082
13074
  {
13083
13075
  Component: Metadata,
13084
13076
  path: "/draft-orders/:id/metadata"
@@ -13095,13 +13087,21 @@ const routeModule = {
13095
13087
  Component: Shipping,
13096
13088
  path: "/draft-orders/:id/shipping"
13097
13089
  },
13090
+ {
13091
+ Component: ShippingAddress,
13092
+ path: "/draft-orders/:id/shipping-address"
13093
+ },
13098
13094
  {
13099
13095
  Component: TransferOwnership,
13100
13096
  path: "/draft-orders/:id/transfer-ownership"
13101
13097
  },
13102
13098
  {
13103
- Component: ShippingAddress,
13104
- path: "/draft-orders/:id/shipping-address"
13099
+ Component: Items,
13100
+ path: "/draft-orders/:id/items"
13101
+ },
13102
+ {
13103
+ Component: CustomItems,
13104
+ path: "/draft-orders/:id/custom-items"
13105
13105
  }
13106
13106
  ]
13107
13107
  }