@medusajs/draft-order 2.11.0-snapshot-20251017164419 → 2.11.0-snapshot-20251017170018

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.
@@ -9573,6 +9573,95 @@ const ID = () => {
9573
9573
  /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Outlet, {})
9574
9574
  ] });
9575
9575
  };
9576
+ const CustomItems = () => {
9577
+ return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { children: [
9578
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Custom Items" }) }) }),
9579
+ /* @__PURE__ */ jsxRuntime.jsx(CustomItemsForm, {})
9580
+ ] });
9581
+ };
9582
+ const CustomItemsForm = () => {
9583
+ const form = reactHookForm.useForm({
9584
+ resolver: zod.zodResolver(schema$5)
9585
+ });
9586
+ return /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxRuntime.jsxs(KeyboundForm, { className: "flex flex-1 flex-col", children: [
9587
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Body, {}),
9588
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2", children: [
9589
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
9590
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "submit", children: "Save" })
9591
+ ] }) })
9592
+ ] }) });
9593
+ };
9594
+ const schema$5 = objectType({
9595
+ email: stringType().email()
9596
+ });
9597
+ const Email = () => {
9598
+ const { id } = reactRouterDom.useParams();
9599
+ const { order, isPending, isError, error } = useOrder(id, {
9600
+ fields: "+email"
9601
+ });
9602
+ if (isError) {
9603
+ throw error;
9604
+ }
9605
+ const isReady = !isPending && !!order;
9606
+ return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { children: [
9607
+ /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer.Header, { children: [
9608
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Email" }) }),
9609
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Edit the email for the draft order" }) })
9610
+ ] }),
9611
+ isReady && /* @__PURE__ */ jsxRuntime.jsx(EmailForm, { order })
9612
+ ] });
9613
+ };
9614
+ const EmailForm = ({ order }) => {
9615
+ const form = reactHookForm.useForm({
9616
+ defaultValues: {
9617
+ email: order.email ?? ""
9618
+ },
9619
+ resolver: zod.zodResolver(schema$4)
9620
+ });
9621
+ const { mutateAsync, isPending } = useUpdateDraftOrder(order.id);
9622
+ const { handleSuccess } = useRouteModal();
9623
+ const onSubmit = form.handleSubmit(async (data) => {
9624
+ await mutateAsync(
9625
+ { email: data.email },
9626
+ {
9627
+ onSuccess: () => {
9628
+ handleSuccess();
9629
+ },
9630
+ onError: (error) => {
9631
+ ui.toast.error(error.message);
9632
+ }
9633
+ }
9634
+ );
9635
+ });
9636
+ return /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxRuntime.jsxs(
9637
+ KeyboundForm,
9638
+ {
9639
+ className: "flex flex-1 flex-col overflow-hidden",
9640
+ onSubmit,
9641
+ children: [
9642
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Body, { className: "flex flex-col gap-y-6 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx(
9643
+ Form$2.Field,
9644
+ {
9645
+ control: form.control,
9646
+ name: "email",
9647
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
9648
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Email" }),
9649
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
9650
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
9651
+ ] })
9652
+ }
9653
+ ) }),
9654
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2", children: [
9655
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
9656
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "submit", isLoading: isPending, children: "Save" })
9657
+ ] }) })
9658
+ ]
9659
+ }
9660
+ ) });
9661
+ };
9662
+ const schema$4 = objectType({
9663
+ email: stringType().email()
9664
+ });
9576
9665
  const BillingAddress = () => {
9577
9666
  const { id } = reactRouterDom.useParams();
9578
9667
  const { order, isPending, isError, error } = useOrder(id, {
@@ -9605,7 +9694,7 @@ const BillingAddressForm = ({ order }) => {
9605
9694
  postal_code: ((_i = order.billing_address) == null ? void 0 : _i.postal_code) ?? "",
9606
9695
  phone: ((_j = order.billing_address) == null ? void 0 : _j.phone) ?? ""
9607
9696
  },
9608
- resolver: zod.zodResolver(schema$5)
9697
+ resolver: zod.zodResolver(schema$3)
9609
9698
  });
9610
9699
  const { mutateAsync, isPending } = useUpdateDraftOrder(order.id);
9611
9700
  const { handleSuccess } = useRouteModal();
@@ -9762,11 +9851,55 @@ const BillingAddressForm = ({ order }) => {
9762
9851
  }
9763
9852
  ) });
9764
9853
  };
9765
- const schema$5 = addressSchema;
9766
- const Email = () => {
9854
+ const schema$3 = addressSchema;
9855
+ const InlineTip = React.forwardRef(
9856
+ ({ variant = "tip", label, className, children, ...props }, ref) => {
9857
+ const labelValue = label || (variant === "warning" ? "Warning" : "Tip");
9858
+ return /* @__PURE__ */ jsxRuntime.jsxs(
9859
+ "div",
9860
+ {
9861
+ ref,
9862
+ className: ui.clx(
9863
+ "bg-ui-bg-component txt-small text-ui-fg-subtle grid grid-cols-[4px_1fr] items-start gap-3 rounded-lg border p-3",
9864
+ className
9865
+ ),
9866
+ ...props,
9867
+ children: [
9868
+ /* @__PURE__ */ jsxRuntime.jsx(
9869
+ "div",
9870
+ {
9871
+ role: "presentation",
9872
+ className: ui.clx("w-4px bg-ui-tag-neutral-icon h-full rounded-full", {
9873
+ "bg-ui-tag-orange-icon": variant === "warning"
9874
+ })
9875
+ }
9876
+ ),
9877
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-pretty", children: [
9878
+ /* @__PURE__ */ jsxRuntime.jsxs("strong", { className: "txt-small-plus text-ui-fg-base", children: [
9879
+ labelValue,
9880
+ ":"
9881
+ ] }),
9882
+ " ",
9883
+ children
9884
+ ] })
9885
+ ]
9886
+ }
9887
+ );
9888
+ }
9889
+ );
9890
+ InlineTip.displayName = "InlineTip";
9891
+ const MetadataFieldSchema = objectType({
9892
+ key: stringType(),
9893
+ disabled: booleanType().optional(),
9894
+ value: anyType()
9895
+ });
9896
+ const MetadataSchema = objectType({
9897
+ metadata: arrayType(MetadataFieldSchema)
9898
+ });
9899
+ const Metadata = () => {
9767
9900
  const { id } = reactRouterDom.useParams();
9768
9901
  const { order, isPending, isError, error } = useOrder(id, {
9769
- fields: "+email"
9902
+ fields: "metadata"
9770
9903
  });
9771
9904
  if (isError) {
9772
9905
  throw error;
@@ -9774,26 +9907,33 @@ const Email = () => {
9774
9907
  const isReady = !isPending && !!order;
9775
9908
  return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { children: [
9776
9909
  /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer.Header, { children: [
9777
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Email" }) }),
9778
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Edit the email for the draft order" }) })
9910
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Metadata" }) }),
9911
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Add metadata to the draft order." }) })
9779
9912
  ] }),
9780
- isReady && /* @__PURE__ */ jsxRuntime.jsx(EmailForm, { order })
9913
+ !isReady ? /* @__PURE__ */ jsxRuntime.jsx(PlaceholderInner, {}) : /* @__PURE__ */ jsxRuntime.jsx(MetadataForm, { orderId: id, metadata: order == null ? void 0 : order.metadata })
9781
9914
  ] });
9782
9915
  };
9783
- const EmailForm = ({ order }) => {
9916
+ const METADATA_KEY_LABEL_ID = "metadata-form-key-label";
9917
+ const METADATA_VALUE_LABEL_ID = "metadata-form-value-label";
9918
+ const MetadataForm = ({ orderId, metadata }) => {
9919
+ const { handleSuccess } = useRouteModal();
9920
+ const hasUneditableRows = getHasUneditableRows(metadata);
9921
+ const { mutateAsync, isPending } = useUpdateDraftOrder(orderId);
9784
9922
  const form = reactHookForm.useForm({
9785
9923
  defaultValues: {
9786
- email: order.email ?? ""
9924
+ metadata: getDefaultValues(metadata)
9787
9925
  },
9788
- resolver: zod.zodResolver(schema$4)
9926
+ resolver: zod.zodResolver(MetadataSchema)
9789
9927
  });
9790
- const { mutateAsync, isPending } = useUpdateDraftOrder(order.id);
9791
- const { handleSuccess } = useRouteModal();
9792
- const onSubmit = form.handleSubmit(async (data) => {
9928
+ const handleSubmit = form.handleSubmit(async (data) => {
9929
+ const parsedData = parseValues(data);
9793
9930
  await mutateAsync(
9794
- { email: data.email },
9931
+ {
9932
+ metadata: parsedData
9933
+ },
9795
9934
  {
9796
9935
  onSuccess: () => {
9936
+ ui.toast.success("Metadata updated");
9797
9937
  handleSuccess();
9798
9938
  },
9799
9939
  onError: (error) => {
@@ -9802,921 +9942,874 @@ const EmailForm = ({ order }) => {
9802
9942
  }
9803
9943
  );
9804
9944
  });
9945
+ const { fields, insert, remove } = reactHookForm.useFieldArray({
9946
+ control: form.control,
9947
+ name: "metadata"
9948
+ });
9949
+ function deleteRow(index) {
9950
+ remove(index);
9951
+ if (fields.length === 1) {
9952
+ insert(0, {
9953
+ key: "",
9954
+ value: "",
9955
+ disabled: false
9956
+ });
9957
+ }
9958
+ }
9959
+ function insertRow(index, position) {
9960
+ insert(index + (position === "above" ? 0 : 1), {
9961
+ key: "",
9962
+ value: "",
9963
+ disabled: false
9964
+ });
9965
+ }
9805
9966
  return /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxRuntime.jsxs(
9806
9967
  KeyboundForm,
9807
9968
  {
9969
+ onSubmit: handleSubmit,
9808
9970
  className: "flex flex-1 flex-col overflow-hidden",
9809
- onSubmit,
9810
9971
  children: [
9811
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Body, { className: "flex flex-col gap-y-6 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx(
9812
- Form$2.Field,
9813
- {
9814
- control: form.control,
9815
- name: "email",
9816
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
9817
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Email" }),
9818
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
9819
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
9820
- ] })
9821
- }
9822
- ) }),
9823
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2", children: [
9824
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
9825
- /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "submit", isLoading: isPending, children: "Save" })
9826
- ] }) })
9827
- ]
9828
- }
9829
- ) });
9830
- };
9831
- const schema$4 = objectType({
9832
- email: stringType().email()
9833
- });
9834
- const NumberInput = React.forwardRef(
9835
- ({
9836
- value,
9837
- onChange,
9838
- size = "base",
9839
- min = 0,
9840
- max = 100,
9841
- step = 1,
9842
- className,
9843
- disabled,
9844
- ...props
9845
- }, ref) => {
9846
- const handleChange = (event) => {
9847
- const newValue = event.target.value === "" ? min : Number(event.target.value);
9848
- if (!isNaN(newValue) && (max === void 0 || newValue <= max) && (min === void 0 || newValue >= min)) {
9849
- onChange(newValue);
9850
- }
9851
- };
9852
- const handleIncrement = () => {
9853
- const newValue = value + step;
9854
- if (max === void 0 || newValue <= max) {
9855
- onChange(newValue);
9856
- }
9857
- };
9858
- const handleDecrement = () => {
9859
- const newValue = value - step;
9860
- if (min === void 0 || newValue >= min) {
9861
- onChange(newValue);
9862
- }
9863
- };
9864
- return /* @__PURE__ */ jsxRuntime.jsxs(
9865
- "div",
9866
- {
9867
- className: ui.clx(
9868
- "inline-flex rounded-md bg-ui-bg-field shadow-borders-base overflow-hidden divide-x transition-fg",
9869
- "[&:has(input:focus)]:shadow-borders-interactive-with-active",
9870
- {
9871
- "h-7": size === "small",
9872
- "h-8": size === "base"
9873
- },
9874
- className
9875
- ),
9876
- children: [
9877
- /* @__PURE__ */ jsxRuntime.jsx(
9878
- "input",
9879
- {
9880
- ref,
9881
- type: "number",
9882
- value,
9883
- onChange: handleChange,
9884
- min,
9885
- max,
9886
- step,
9887
- className: ui.clx(
9888
- "flex-1 px-2 py-1 bg-transparent txt-compact-small text-ui-fg-base outline-none [appearance:textfield]",
9889
- "[&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none",
9890
- "placeholder:text-ui-fg-muted"
9891
- ),
9892
- ...props
9893
- }
9894
- ),
9895
- /* @__PURE__ */ jsxRuntime.jsxs(
9896
- "button",
9897
- {
9898
- className: ui.clx(
9899
- "flex items-center justify-center outline-none transition-fg",
9900
- "disabled:cursor-not-allowed disabled:text-ui-fg-muted",
9901
- "focus:bg-ui-bg-field-component-hover",
9902
- "hover:bg-ui-bg-field-component-hover",
9903
- {
9904
- "size-7": size === "small",
9905
- "size-8": size === "base"
9906
- }
9907
- ),
9908
- type: "button",
9909
- onClick: handleDecrement,
9910
- disabled: min !== void 0 && value <= min || disabled,
9911
- children: [
9912
- /* @__PURE__ */ jsxRuntime.jsx(icons.Minus, {}),
9913
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: `Decrease by ${step}` })
9914
- ]
9915
- }
9916
- ),
9917
- /* @__PURE__ */ jsxRuntime.jsxs(
9918
- "button",
9919
- {
9920
- className: ui.clx(
9921
- "flex items-center justify-center outline-none transition-fg",
9922
- "disabled:cursor-not-allowed disabled:text-ui-fg-muted",
9923
- "focus:bg-ui-bg-field-hover",
9924
- "hover:bg-ui-bg-field-hover",
9925
- {
9926
- "size-7": size === "small",
9927
- "size-8": size === "base"
9928
- }
9929
- ),
9930
- type: "button",
9931
- onClick: handleIncrement,
9932
- disabled: max !== void 0 && value >= max || disabled,
9933
- children: [
9934
- /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}),
9935
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: `Increase by ${step}` })
9936
- ]
9937
- }
9938
- )
9939
- ]
9940
- }
9941
- );
9942
- }
9943
- );
9944
- const PRODUCT_VARIANTS_QUERY_KEY = "product-variants";
9945
- const productVariantsQueryKeys = {
9946
- list: (query2) => [
9947
- PRODUCT_VARIANTS_QUERY_KEY,
9948
- query2 ? query2 : void 0
9949
- ]
9950
- };
9951
- const useProductVariants = (query2, options) => {
9952
- const { data, ...rest } = reactQuery.useQuery({
9953
- queryKey: productVariantsQueryKeys.list(query2),
9954
- queryFn: async () => await sdk.admin.productVariant.list(query2),
9955
- ...options
9956
- });
9957
- return { ...data, ...rest };
9958
- };
9959
- const useCancelOrderEdit = ({ preview }) => {
9960
- const { mutateAsync: cancelOrderEdit } = useDraftOrderCancelEdit(preview == null ? void 0 : preview.id);
9961
- const onCancel = React.useCallback(async () => {
9962
- if (!preview) {
9963
- return true;
9964
- }
9965
- let res = false;
9966
- await cancelOrderEdit(void 0, {
9967
- onError: (e) => {
9968
- ui.toast.error(e.message);
9969
- },
9970
- onSuccess: () => {
9971
- res = true;
9972
- }
9973
- });
9974
- return res;
9975
- }, [preview, cancelOrderEdit]);
9976
- return { onCancel };
9977
- };
9978
- let IS_REQUEST_RUNNING = false;
9979
- const useInitiateOrderEdit = ({
9980
- preview
9981
- }) => {
9982
- const navigate = reactRouterDom.useNavigate();
9983
- const { mutateAsync } = useDraftOrderBeginEdit(preview == null ? void 0 : preview.id);
9984
- React.useEffect(() => {
9985
- async function run() {
9986
- if (IS_REQUEST_RUNNING || !preview) {
9987
- return;
9988
- }
9989
- if (preview.order_change) {
9990
- return;
9991
- }
9992
- IS_REQUEST_RUNNING = true;
9993
- await mutateAsync(void 0, {
9994
- onError: (e) => {
9995
- ui.toast.error(e.message);
9996
- navigate(`/draft-orders/${preview.id}`, { replace: true });
9997
- return;
9998
- }
9999
- });
10000
- IS_REQUEST_RUNNING = false;
10001
- }
10002
- run();
10003
- }, [preview, navigate, mutateAsync]);
10004
- };
10005
- function convertNumber(value) {
10006
- return typeof value === "string" ? Number(value.replace(",", ".")) : value;
10007
- }
10008
- const STACKED_MODAL_ID = "items_stacked_modal";
10009
- const Items = () => {
10010
- const { id } = reactRouterDom.useParams();
10011
- const {
10012
- order: preview,
10013
- isPending: isPreviewPending,
10014
- isError: isPreviewError,
10015
- error: previewError
10016
- } = useOrderPreview(id, void 0, {
10017
- placeholderData: reactQuery.keepPreviousData
10018
- });
10019
- useInitiateOrderEdit({ preview });
10020
- const { draft_order, isPending, isError, error } = useDraftOrder(
10021
- id,
10022
- {
10023
- fields: "currency_code"
10024
- },
10025
- {
10026
- enabled: !!id
10027
- }
10028
- );
10029
- const { onCancel } = useCancelOrderEdit({ preview });
10030
- if (isError) {
10031
- throw error;
10032
- }
10033
- if (isPreviewError) {
10034
- throw previewError;
10035
- }
10036
- const ready = !!preview && !isPreviewPending && !!draft_order && !isPending;
10037
- return /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal, { onClose: onCancel, children: ready ? /* @__PURE__ */ jsxRuntime.jsx(ItemsForm, { preview, currencyCode: draft_order.currency_code }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
10038
- /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Edit Items" }) }),
10039
- /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Loading data for the draft order, please wait..." }) })
10040
- ] }) });
10041
- };
10042
- const ItemsForm = ({ preview, currencyCode }) => {
10043
- var _a;
10044
- const [isSubmitting, setIsSubmitting] = React.useState(false);
10045
- const [modalContent, setModalContent] = React.useState(
10046
- null
10047
- );
10048
- const { handleSuccess } = useRouteModal();
10049
- const { searchValue, onSearchValueChange, query: query2 } = useDebouncedSearch();
10050
- const { mutateAsync: confirmOrderEdit } = useDraftOrderConfirmEdit(preview.id);
10051
- const { mutateAsync: requestOrderEdit } = useDraftOrderRequestEdit(preview.id);
10052
- const itemCount = ((_a = preview.items) == null ? void 0 : _a.reduce((acc, item) => acc + item.quantity, 0)) || 0;
10053
- const matches = React.useMemo(() => {
10054
- return matchSorter.matchSorter(preview.items, query2, {
10055
- keys: ["product_title", "variant_title", "variant_sku", "title"]
10056
- });
10057
- }, [preview.items, query2]);
10058
- const onSubmit = async () => {
10059
- setIsSubmitting(true);
10060
- let requestSucceeded = false;
10061
- await requestOrderEdit(void 0, {
10062
- onError: (e) => {
10063
- ui.toast.error(`Failed to request order edit: ${e.message}`);
10064
- },
10065
- onSuccess: () => {
10066
- requestSucceeded = true;
10067
- }
10068
- });
10069
- if (!requestSucceeded) {
10070
- setIsSubmitting(false);
10071
- return;
10072
- }
10073
- await confirmOrderEdit(void 0, {
10074
- onError: (e) => {
10075
- ui.toast.error(`Failed to confirm order edit: ${e.message}`);
10076
- },
10077
- onSuccess: () => {
10078
- handleSuccess();
10079
- },
10080
- onSettled: () => {
10081
- setIsSubmitting(false);
10082
- }
10083
- });
10084
- };
10085
- const onKeyDown = React.useCallback(
10086
- (e) => {
10087
- if (e.key === "Enter" && (e.ctrlKey || e.metaKey)) {
10088
- if (modalContent || isSubmitting) {
10089
- return;
10090
- }
10091
- onSubmit();
10092
- }
10093
- },
10094
- [modalContent, isSubmitting, onSubmit]
10095
- );
10096
- React.useEffect(() => {
10097
- document.addEventListener("keydown", onKeyDown);
10098
- return () => {
10099
- document.removeEventListener("keydown", onKeyDown);
10100
- };
10101
- }, [onKeyDown]);
10102
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full flex-col overflow-hidden", children: [
10103
- /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Header, {}),
10104
- /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Body, { className: "flex flex-1 flex-col overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsxs(
10105
- StackedFocusModal,
10106
- {
10107
- id: STACKED_MODAL_ID,
10108
- onOpenChangeCallback: (open) => {
10109
- if (!open) {
10110
- setModalContent(null);
10111
- }
10112
- },
10113
- children: [
10114
- /* @__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: [
10115
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
10116
- /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Items" }) }),
10117
- /* @__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" }) })
9972
+ /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer.Body, { className: "flex flex-1 flex-col gap-y-8 overflow-y-auto", children: [
9973
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-ui-bg-base shadow-elevation-card-rest grid grid-cols-1 divide-y rounded-lg", children: [
9974
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-ui-bg-subtle grid grid-cols-2 divide-x rounded-t-lg", children: [
9975
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "txt-compact-small-plus text-ui-fg-subtle px-2 py-1.5", children: /* @__PURE__ */ jsxRuntime.jsx("label", { id: METADATA_KEY_LABEL_ID, children: "Key" }) }),
9976
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "txt-compact-small-plus text-ui-fg-subtle px-2 py-1.5", children: /* @__PURE__ */ jsxRuntime.jsx("label", { id: METADATA_VALUE_LABEL_ID, children: "Value" }) })
10118
9977
  ] }),
10119
- /* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
10120
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-6", children: [
10121
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 items-center gap-3", children: [
10122
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
10123
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: "Items" }),
10124
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Choose items from the product catalog." })
10125
- ] }),
10126
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
10127
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
10128
- ui.Input,
10129
- {
10130
- type: "search",
10131
- placeholder: "Search items",
10132
- value: searchValue,
10133
- onChange: (e) => onSearchValueChange(e.target.value)
10134
- }
10135
- ) }),
10136
- /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
10137
- /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.IconButton, { type: "button", children: /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}) }) }),
10138
- /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu.Content, { children: [
10139
- /* @__PURE__ */ jsxRuntime.jsx(
10140
- StackedModalTrigger$1,
10141
- {
10142
- type: "add-items",
10143
- setModalContent
10144
- }
10145
- ),
9978
+ fields.map((field, index) => {
9979
+ const isDisabled = field.disabled || false;
9980
+ let placeholder = "-";
9981
+ if (typeof field.value === "object") {
9982
+ placeholder = "{ ... }";
9983
+ }
9984
+ if (Array.isArray(field.value)) {
9985
+ placeholder = "[ ... ]";
9986
+ }
9987
+ return /* @__PURE__ */ jsxRuntime.jsx(
9988
+ ConditionalTooltip,
9989
+ {
9990
+ showTooltip: isDisabled,
9991
+ content: "This row is disabled because it contains non-primitive data.",
9992
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "group/table relative", children: [
9993
+ /* @__PURE__ */ jsxRuntime.jsxs(
9994
+ "div",
9995
+ {
9996
+ className: ui.clx("grid grid-cols-2 divide-x", {
9997
+ "overflow-hidden rounded-b-lg": index === fields.length - 1
9998
+ }),
9999
+ children: [
10000
+ /* @__PURE__ */ jsxRuntime.jsx(
10001
+ Form$2.Field,
10002
+ {
10003
+ control: form.control,
10004
+ name: `metadata.${index}.key`,
10005
+ render: ({ field: field2 }) => {
10006
+ return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
10007
+ GridInput,
10008
+ {
10009
+ "aria-labelledby": METADATA_KEY_LABEL_ID,
10010
+ ...field2,
10011
+ disabled: isDisabled,
10012
+ placeholder: "Key"
10013
+ }
10014
+ ) }) });
10015
+ }
10016
+ }
10017
+ ),
10018
+ /* @__PURE__ */ jsxRuntime.jsx(
10019
+ Form$2.Field,
10020
+ {
10021
+ control: form.control,
10022
+ name: `metadata.${index}.value`,
10023
+ render: ({ field: { value, ...field2 } }) => {
10024
+ return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
10025
+ GridInput,
10026
+ {
10027
+ "aria-labelledby": METADATA_VALUE_LABEL_ID,
10028
+ ...field2,
10029
+ value: isDisabled ? placeholder : value,
10030
+ disabled: isDisabled,
10031
+ placeholder: "Value"
10032
+ }
10033
+ ) }) });
10034
+ }
10035
+ }
10036
+ )
10037
+ ]
10038
+ }
10039
+ ),
10040
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
10146
10041
  /* @__PURE__ */ jsxRuntime.jsx(
10147
- StackedModalTrigger$1,
10042
+ ui.DropdownMenu.Trigger,
10148
10043
  {
10149
- type: "add-custom-item",
10150
- setModalContent
10044
+ className: ui.clx(
10045
+ "invisible absolute inset-y-0 -right-2.5 my-auto group-hover/table:visible data-[state='open']:visible",
10046
+ {
10047
+ hidden: isDisabled
10048
+ }
10049
+ ),
10050
+ disabled: isDisabled,
10051
+ asChild: true,
10052
+ children: /* @__PURE__ */ jsxRuntime.jsx(ui.IconButton, { size: "2xsmall", children: /* @__PURE__ */ jsxRuntime.jsx(icons.EllipsisVertical, {}) })
10151
10053
  }
10152
- )
10153
- ] })
10154
- ] })
10155
- ] })
10156
- ] }),
10157
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-ui-bg-subtle shadow-elevation-card-rest rounded-xl", children: [
10158
- /* @__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: [
10159
- /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: "Item" }) }),
10160
- /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: "Quantity" }) }),
10161
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-right", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: "Price" }) }),
10162
- /* @__PURE__ */ jsxRuntime.jsx("div", {})
10163
- ] }) }),
10164
- /* @__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: [
10165
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: "There are no items in this order" }),
10166
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Add items to the order to get started." })
10167
- ] }) : matches.length > 0 ? matches == null ? void 0 : matches.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
10168
- Item,
10169
- {
10170
- item,
10171
- preview,
10172
- currencyCode
10173
- },
10174
- item.id
10175
- )) : /* @__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: [
10176
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: "No items found" }),
10177
- /* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: [
10178
- 'No items found for "',
10179
- query2,
10180
- '".'
10181
- ] })
10182
- ] }) })
10183
- ] })
10184
- ] }),
10185
- /* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
10186
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[1fr_0.5fr_0.5fr] gap-3", children: [
10187
- /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: "Subtotal" }) }),
10188
- /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsxs(
10189
- ui.Text,
10190
- {
10191
- size: "small",
10192
- leading: "compact",
10193
- className: "text-ui-fg-subtle",
10194
- children: [
10195
- itemCount,
10196
- " ",
10197
- itemCount === 1 ? "item" : "items"
10198
- ]
10199
- }
10200
- ) }),
10201
- /* @__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) }) })
10202
- ] })
10203
- ] }) }),
10204
- modalContent && (modalContent === "add-items" ? /* @__PURE__ */ jsxRuntime.jsx(ExistingItemsForm, { orderId: preview.id, items: preview.items }) : modalContent === "add-custom-item" ? /* @__PURE__ */ jsxRuntime.jsx(
10205
- CustomItemForm,
10206
- {
10207
- orderId: preview.id,
10208
- currencyCode
10209
- }
10210
- ) : null)
10211
- ]
10212
- }
10213
- ) }),
10214
- /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
10215
- /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
10216
- /* @__PURE__ */ jsxRuntime.jsx(
10217
- ui.Button,
10218
- {
10219
- size: "small",
10220
- type: "button",
10221
- onClick: onSubmit,
10222
- isLoading: isSubmitting,
10223
- children: "Save"
10224
- }
10225
- )
10226
- ] }) })
10227
- ] });
10228
- };
10229
- const Item = ({ item, preview, currencyCode }) => {
10230
- if (item.variant_id) {
10231
- return /* @__PURE__ */ jsxRuntime.jsx(VariantItem, { item, preview, currencyCode });
10232
- }
10233
- return /* @__PURE__ */ jsxRuntime.jsx(CustomItem, { item, preview, currencyCode });
10234
- };
10235
- const VariantItem = ({ item, preview, currencyCode }) => {
10236
- const [editing, setEditing] = React.useState(false);
10237
- const form = reactHookForm.useForm({
10238
- defaultValues: {
10239
- quantity: item.quantity,
10240
- unit_price: item.unit_price
10241
- },
10242
- resolver: zod.zodResolver(variantItemSchema)
10243
- });
10244
- const actionId = React.useMemo(() => {
10245
- var _a, _b;
10246
- return (_b = (_a = item.actions) == null ? void 0 : _a.find((a) => a.action === "ITEM_ADD")) == null ? void 0 : _b.id;
10247
- }, [item]);
10248
- const { mutateAsync: updateActionItem, isPending: isUpdatingActionItem } = useDraftOrderUpdateActionItem(preview.id);
10249
- const { mutateAsync: updateOriginalItem, isPending: isUpdatingOriginalItem } = useDraftOrderUpdateItem(preview.id);
10250
- const isPending = isUpdatingActionItem || isUpdatingOriginalItem;
10251
- const onSubmit = form.handleSubmit(async (data) => {
10252
- if (convertNumber(data.unit_price) === item.unit_price && data.quantity === item.quantity) {
10253
- setEditing(false);
10254
- return;
10255
- }
10256
- if (!actionId) {
10257
- await updateOriginalItem(
10258
- {
10259
- item_id: item.id,
10260
- quantity: data.quantity,
10261
- unit_price: convertNumber(data.unit_price)
10262
- },
10263
- {
10264
- onSuccess: () => {
10265
- setEditing(false);
10266
- },
10267
- onError: (e) => {
10268
- ui.toast.error(e.message);
10269
- }
10270
- }
10271
- );
10272
- return;
10273
- }
10274
- await updateActionItem(
10275
- {
10276
- action_id: actionId,
10277
- quantity: data.quantity,
10278
- unit_price: convertNumber(data.unit_price)
10279
- },
10280
- {
10281
- onSuccess: () => {
10282
- setEditing(false);
10283
- },
10284
- onError: (e) => {
10285
- ui.toast.error(e.message);
10286
- }
10287
- }
10288
- );
10289
- });
10290
- 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: [
10291
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full items-center gap-x-3", children: [
10292
- /* @__PURE__ */ jsxRuntime.jsx(
10293
- Thumbnail,
10294
- {
10295
- thumbnail: item.thumbnail,
10296
- alt: item.product_title ?? void 0
10297
- }
10298
- ),
10299
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
10300
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-1", children: [
10301
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: item.product_title }),
10302
- /* @__PURE__ */ jsxRuntime.jsxs(
10303
- ui.Text,
10304
- {
10305
- size: "small",
10306
- leading: "compact",
10307
- className: "text-ui-fg-subtle",
10308
- children: [
10309
- "(",
10310
- item.variant_title,
10311
- ")"
10312
- ]
10313
- }
10314
- )
10315
- ] }),
10316
- /* @__PURE__ */ jsxRuntime.jsx(
10317
- ui.Text,
10318
- {
10319
- size: "small",
10320
- leading: "compact",
10321
- className: "text-ui-fg-subtle",
10322
- children: item.variant_sku
10323
- }
10324
- )
10325
- ] })
10326
- ] }),
10327
- editing ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
10328
- Form$2.Field,
10329
- {
10330
- control: form.control,
10331
- name: "quantity",
10332
- render: ({ field }) => {
10333
- return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(NumberInput, { ...field }) }) });
10334
- }
10335
- }
10336
- ) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: item.quantity }) }),
10337
- editing ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
10338
- Form$2.Field,
10339
- {
10340
- control: form.control,
10341
- name: "unit_price",
10342
- render: ({ field: { onChange, ...field } }) => {
10343
- return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
10344
- ui.CurrencyInput,
10345
- {
10346
- ...field,
10347
- symbol: getNativeSymbol(currencyCode),
10348
- code: currencyCode,
10349
- onValueChange: (_value, _name, values) => onChange(values == null ? void 0 : values.value)
10350
- }
10351
- ) }) });
10352
- }
10353
- }
10354
- ) }) : /* @__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) }) }),
10355
- /* @__PURE__ */ jsxRuntime.jsx(
10356
- ui.IconButton,
10357
- {
10358
- type: "button",
10359
- size: "small",
10360
- onClick: editing ? onSubmit : () => {
10361
- setEditing(true);
10362
- },
10363
- disabled: isPending,
10364
- children: editing ? /* @__PURE__ */ jsxRuntime.jsx(icons.Check, {}) : /* @__PURE__ */ jsxRuntime.jsx(icons.PencilSquare, {})
10365
- }
10366
- )
10367
- ] }) }) });
10054
+ ),
10055
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu.Content, { children: [
10056
+ /* @__PURE__ */ jsxRuntime.jsxs(
10057
+ ui.DropdownMenu.Item,
10058
+ {
10059
+ className: "gap-x-2",
10060
+ onClick: () => insertRow(index, "above"),
10061
+ children: [
10062
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpMini, { className: "text-ui-fg-subtle" }),
10063
+ "Insert row above"
10064
+ ]
10065
+ }
10066
+ ),
10067
+ /* @__PURE__ */ jsxRuntime.jsxs(
10068
+ ui.DropdownMenu.Item,
10069
+ {
10070
+ className: "gap-x-2",
10071
+ onClick: () => insertRow(index, "below"),
10072
+ children: [
10073
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownMini, { className: "text-ui-fg-subtle" }),
10074
+ "Insert row below"
10075
+ ]
10076
+ }
10077
+ ),
10078
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Separator, {}),
10079
+ /* @__PURE__ */ jsxRuntime.jsxs(
10080
+ ui.DropdownMenu.Item,
10081
+ {
10082
+ className: "gap-x-2",
10083
+ onClick: () => deleteRow(index),
10084
+ children: [
10085
+ /* @__PURE__ */ jsxRuntime.jsx(icons.Trash, { className: "text-ui-fg-subtle" }),
10086
+ "Delete row"
10087
+ ]
10088
+ }
10089
+ )
10090
+ ] })
10091
+ ] })
10092
+ ] })
10093
+ },
10094
+ field.id
10095
+ );
10096
+ })
10097
+ ] }),
10098
+ hasUneditableRows && /* @__PURE__ */ jsxRuntime.jsx(InlineTip, { variant: "warning", label: "Some rows are disabled", children: "This object contains non-primitive metadata, such as arrays or objects, that can't be edited here. To edit the disabled rows, use the API directly." })
10099
+ ] }),
10100
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
10101
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
10102
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "submit", isLoading: isPending, children: "Save" })
10103
+ ] }) })
10104
+ ]
10105
+ }
10106
+ ) });
10368
10107
  };
10369
- const variantItemSchema = objectType({
10370
- quantity: numberType(),
10371
- unit_price: unionType([numberType(), stringType()])
10108
+ const GridInput = React.forwardRef(({ className, ...props }, ref) => {
10109
+ return /* @__PURE__ */ jsxRuntime.jsx(
10110
+ "input",
10111
+ {
10112
+ ref,
10113
+ ...props,
10114
+ autoComplete: "off",
10115
+ className: ui.clx(
10116
+ "txt-compact-small text-ui-fg-base placeholder:text-ui-fg-muted disabled:text-ui-fg-disabled disabled:bg-ui-bg-base bg-transparent px-2 py-1.5 outline-none",
10117
+ className
10118
+ )
10119
+ }
10120
+ );
10372
10121
  });
10373
- const CustomItem = ({ item, preview, currencyCode }) => {
10374
- const [editing, setEditing] = React.useState(false);
10375
- const { quantity, unit_price, title } = item;
10376
- const form = reactHookForm.useForm({
10377
- defaultValues: {
10378
- title,
10379
- quantity,
10380
- unit_price
10381
- },
10382
- resolver: zod.zodResolver(customItemSchema)
10122
+ GridInput.displayName = "MetadataForm.GridInput";
10123
+ const PlaceholderInner = () => {
10124
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 flex-col overflow-hidden", children: [
10125
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Body, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Skeleton, { className: "h-[148ox] w-full rounded-lg" }) }),
10126
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
10127
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Skeleton, { className: "h-7 w-12 rounded-md" }),
10128
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Skeleton, { className: "h-7 w-12 rounded-md" })
10129
+ ] }) })
10130
+ ] });
10131
+ };
10132
+ const EDITABLE_TYPES = ["string", "number", "boolean"];
10133
+ function getDefaultValues(metadata) {
10134
+ if (!metadata || !Object.keys(metadata).length) {
10135
+ return [
10136
+ {
10137
+ key: "",
10138
+ value: "",
10139
+ disabled: false
10140
+ }
10141
+ ];
10142
+ }
10143
+ return Object.entries(metadata).map(([key, value]) => {
10144
+ if (!EDITABLE_TYPES.includes(typeof value)) {
10145
+ return {
10146
+ key,
10147
+ value,
10148
+ disabled: true
10149
+ };
10150
+ }
10151
+ let stringValue = value;
10152
+ if (typeof value !== "string") {
10153
+ stringValue = JSON.stringify(value);
10154
+ }
10155
+ return {
10156
+ key,
10157
+ value: stringValue,
10158
+ original_key: key
10159
+ };
10383
10160
  });
10384
- React.useEffect(() => {
10385
- form.reset({
10386
- title,
10387
- quantity,
10388
- unit_price
10389
- });
10390
- }, [form, title, quantity, unit_price]);
10391
- const actionId = React.useMemo(() => {
10392
- var _a, _b;
10393
- return (_b = (_a = item.actions) == null ? void 0 : _a.find((a) => a.action === "ITEM_ADD")) == null ? void 0 : _b.id;
10394
- }, [item]);
10395
- const { mutateAsync: updateActionItem, isPending: isUpdatingActionItem } = useDraftOrderUpdateActionItem(preview.id);
10396
- const { mutateAsync: removeActionItem, isPending: isRemovingActionItem } = useDraftOrderRemoveActionItem(preview.id);
10397
- const { mutateAsync: updateOriginalItem, isPending: isUpdatingOriginalItem } = useDraftOrderUpdateItem(preview.id);
10398
- const isPending = isUpdatingActionItem || isUpdatingOriginalItem;
10399
- const onSubmit = form.handleSubmit(async (data) => {
10400
- if (convertNumber(data.unit_price) === item.unit_price && data.quantity === item.quantity && data.title === item.title) {
10401
- setEditing(false);
10161
+ }
10162
+ function parseValues(values) {
10163
+ const metadata = values.metadata;
10164
+ const isEmpty = !metadata.length || metadata.length === 1 && !metadata[0].key && !metadata[0].value;
10165
+ if (isEmpty) {
10166
+ return null;
10167
+ }
10168
+ const update = {};
10169
+ metadata.forEach((field) => {
10170
+ let key = field.key;
10171
+ let value = field.value;
10172
+ const disabled = field.disabled;
10173
+ if (!key || !value) {
10402
10174
  return;
10403
10175
  }
10404
- if (!actionId) {
10405
- await updateOriginalItem(
10406
- {
10407
- item_id: item.id,
10408
- quantity: data.quantity,
10409
- unit_price: convertNumber(data.unit_price)
10410
- },
10411
- {
10412
- onSuccess: () => {
10413
- setEditing(false);
10414
- },
10415
- onError: (e) => {
10416
- ui.toast.error(e.message);
10417
- }
10418
- }
10419
- );
10176
+ if (disabled) {
10177
+ update[key] = value;
10420
10178
  return;
10421
10179
  }
10422
- if (data.quantity === 0) {
10423
- await removeActionItem(actionId, {
10424
- onSuccess: () => {
10425
- setEditing(false);
10426
- },
10427
- onError: (e) => {
10428
- ui.toast.error(e.message);
10429
- }
10430
- });
10431
- return;
10180
+ key = key.trim();
10181
+ value = value.trim();
10182
+ if (value === "true") {
10183
+ update[key] = true;
10184
+ } else if (value === "false") {
10185
+ update[key] = false;
10186
+ } else {
10187
+ const parsedNumber = parseFloat(value);
10188
+ if (!isNaN(parsedNumber)) {
10189
+ update[key] = parsedNumber;
10190
+ } else {
10191
+ update[key] = value;
10192
+ }
10432
10193
  }
10433
- await updateActionItem(
10434
- {
10435
- action_id: actionId,
10436
- quantity: data.quantity,
10437
- unit_price: convertNumber(data.unit_price)
10438
- },
10194
+ });
10195
+ return update;
10196
+ }
10197
+ function getHasUneditableRows(metadata) {
10198
+ if (!metadata) {
10199
+ return false;
10200
+ }
10201
+ return Object.values(metadata).some(
10202
+ (value) => !EDITABLE_TYPES.includes(typeof value)
10203
+ );
10204
+ }
10205
+ const NumberInput = React.forwardRef(
10206
+ ({
10207
+ value,
10208
+ onChange,
10209
+ size = "base",
10210
+ min = 0,
10211
+ max = 100,
10212
+ step = 1,
10213
+ className,
10214
+ disabled,
10215
+ ...props
10216
+ }, ref) => {
10217
+ const handleChange = (event) => {
10218
+ const newValue = event.target.value === "" ? min : Number(event.target.value);
10219
+ if (!isNaN(newValue) && (max === void 0 || newValue <= max) && (min === void 0 || newValue >= min)) {
10220
+ onChange(newValue);
10221
+ }
10222
+ };
10223
+ const handleIncrement = () => {
10224
+ const newValue = value + step;
10225
+ if (max === void 0 || newValue <= max) {
10226
+ onChange(newValue);
10227
+ }
10228
+ };
10229
+ const handleDecrement = () => {
10230
+ const newValue = value - step;
10231
+ if (min === void 0 || newValue >= min) {
10232
+ onChange(newValue);
10233
+ }
10234
+ };
10235
+ return /* @__PURE__ */ jsxRuntime.jsxs(
10236
+ "div",
10439
10237
  {
10440
- onSuccess: () => {
10441
- setEditing(false);
10442
- },
10443
- onError: (e) => {
10444
- ui.toast.error(e.message);
10445
- }
10238
+ className: ui.clx(
10239
+ "inline-flex rounded-md bg-ui-bg-field shadow-borders-base overflow-hidden divide-x transition-fg",
10240
+ "[&:has(input:focus)]:shadow-borders-interactive-with-active",
10241
+ {
10242
+ "h-7": size === "small",
10243
+ "h-8": size === "base"
10244
+ },
10245
+ className
10246
+ ),
10247
+ children: [
10248
+ /* @__PURE__ */ jsxRuntime.jsx(
10249
+ "input",
10250
+ {
10251
+ ref,
10252
+ type: "number",
10253
+ value,
10254
+ onChange: handleChange,
10255
+ min,
10256
+ max,
10257
+ step,
10258
+ className: ui.clx(
10259
+ "flex-1 px-2 py-1 bg-transparent txt-compact-small text-ui-fg-base outline-none [appearance:textfield]",
10260
+ "[&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none",
10261
+ "placeholder:text-ui-fg-muted"
10262
+ ),
10263
+ ...props
10264
+ }
10265
+ ),
10266
+ /* @__PURE__ */ jsxRuntime.jsxs(
10267
+ "button",
10268
+ {
10269
+ className: ui.clx(
10270
+ "flex items-center justify-center outline-none transition-fg",
10271
+ "disabled:cursor-not-allowed disabled:text-ui-fg-muted",
10272
+ "focus:bg-ui-bg-field-component-hover",
10273
+ "hover:bg-ui-bg-field-component-hover",
10274
+ {
10275
+ "size-7": size === "small",
10276
+ "size-8": size === "base"
10277
+ }
10278
+ ),
10279
+ type: "button",
10280
+ onClick: handleDecrement,
10281
+ disabled: min !== void 0 && value <= min || disabled,
10282
+ children: [
10283
+ /* @__PURE__ */ jsxRuntime.jsx(icons.Minus, {}),
10284
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: `Decrease by ${step}` })
10285
+ ]
10286
+ }
10287
+ ),
10288
+ /* @__PURE__ */ jsxRuntime.jsxs(
10289
+ "button",
10290
+ {
10291
+ className: ui.clx(
10292
+ "flex items-center justify-center outline-none transition-fg",
10293
+ "disabled:cursor-not-allowed disabled:text-ui-fg-muted",
10294
+ "focus:bg-ui-bg-field-hover",
10295
+ "hover:bg-ui-bg-field-hover",
10296
+ {
10297
+ "size-7": size === "small",
10298
+ "size-8": size === "base"
10299
+ }
10300
+ ),
10301
+ type: "button",
10302
+ onClick: handleIncrement,
10303
+ disabled: max !== void 0 && value >= max || disabled,
10304
+ children: [
10305
+ /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}),
10306
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: `Increase by ${step}` })
10307
+ ]
10308
+ }
10309
+ )
10310
+ ]
10446
10311
  }
10447
10312
  );
10313
+ }
10314
+ );
10315
+ const PRODUCT_VARIANTS_QUERY_KEY = "product-variants";
10316
+ const productVariantsQueryKeys = {
10317
+ list: (query2) => [
10318
+ PRODUCT_VARIANTS_QUERY_KEY,
10319
+ query2 ? query2 : void 0
10320
+ ]
10321
+ };
10322
+ const useProductVariants = (query2, options) => {
10323
+ const { data, ...rest } = reactQuery.useQuery({
10324
+ queryKey: productVariantsQueryKeys.list(query2),
10325
+ queryFn: async () => await sdk.admin.productVariant.list(query2),
10326
+ ...options
10448
10327
  });
10449
- 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: [
10450
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-3", children: [
10451
- /* @__PURE__ */ jsxRuntime.jsx(
10452
- Thumbnail,
10453
- {
10454
- thumbnail: item.thumbnail,
10455
- alt: item.title ?? void 0
10456
- }
10457
- ),
10458
- editing ? /* @__PURE__ */ jsxRuntime.jsx(
10459
- Form$2.Field,
10460
- {
10461
- control: form.control,
10462
- name: "title",
10463
- render: ({ field }) => {
10464
- return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }) });
10465
- }
10466
- }
10467
- ) : /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: item.title })
10468
- ] }),
10469
- editing ? /* @__PURE__ */ jsxRuntime.jsx(
10470
- Form$2.Field,
10471
- {
10472
- control: form.control,
10473
- name: "quantity",
10474
- render: ({ field }) => {
10475
- return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(NumberInput, { ...field }) }) });
10476
- }
10328
+ return { ...data, ...rest };
10329
+ };
10330
+ const useCancelOrderEdit = ({ preview }) => {
10331
+ const { mutateAsync: cancelOrderEdit } = useDraftOrderCancelEdit(preview == null ? void 0 : preview.id);
10332
+ const onCancel = React.useCallback(async () => {
10333
+ if (!preview) {
10334
+ return true;
10335
+ }
10336
+ let res = false;
10337
+ await cancelOrderEdit(void 0, {
10338
+ onError: (e) => {
10339
+ ui.toast.error(e.message);
10340
+ },
10341
+ onSuccess: () => {
10342
+ res = true;
10477
10343
  }
10478
- ) : /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: item.quantity }),
10479
- editing ? /* @__PURE__ */ jsxRuntime.jsx(
10480
- Form$2.Field,
10481
- {
10482
- control: form.control,
10483
- name: "unit_price",
10484
- render: ({ field: { onChange, ...field } }) => {
10485
- return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
10486
- ui.CurrencyInput,
10487
- {
10488
- ...field,
10489
- symbol: getNativeSymbol(currencyCode),
10490
- code: currencyCode,
10491
- onValueChange: (_value, _name, values) => onChange(values == null ? void 0 : values.value)
10492
- }
10493
- ) }) });
10494
- }
10344
+ });
10345
+ return res;
10346
+ }, [preview, cancelOrderEdit]);
10347
+ return { onCancel };
10348
+ };
10349
+ let IS_REQUEST_RUNNING = false;
10350
+ const useInitiateOrderEdit = ({
10351
+ preview
10352
+ }) => {
10353
+ const navigate = reactRouterDom.useNavigate();
10354
+ const { mutateAsync } = useDraftOrderBeginEdit(preview == null ? void 0 : preview.id);
10355
+ React.useEffect(() => {
10356
+ async function run() {
10357
+ if (IS_REQUEST_RUNNING || !preview) {
10358
+ return;
10495
10359
  }
10496
- ) : /* @__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) }) }),
10497
- /* @__PURE__ */ jsxRuntime.jsx(
10498
- ui.IconButton,
10499
- {
10500
- type: "button",
10501
- size: "small",
10502
- onClick: editing ? onSubmit : () => {
10503
- setEditing(true);
10504
- },
10505
- disabled: isPending,
10506
- children: editing ? /* @__PURE__ */ jsxRuntime.jsx(icons.Check, {}) : /* @__PURE__ */ jsxRuntime.jsx(icons.PencilSquare, {})
10360
+ if (preview.order_change) {
10361
+ return;
10507
10362
  }
10508
- )
10509
- ] }) }) });
10363
+ IS_REQUEST_RUNNING = true;
10364
+ await mutateAsync(void 0, {
10365
+ onError: (e) => {
10366
+ ui.toast.error(e.message);
10367
+ navigate(`/draft-orders/${preview.id}`, { replace: true });
10368
+ return;
10369
+ }
10370
+ });
10371
+ IS_REQUEST_RUNNING = false;
10372
+ }
10373
+ run();
10374
+ }, [preview, navigate, mutateAsync]);
10510
10375
  };
10511
- const StackedModalTrigger$1 = ({
10512
- type,
10513
- setModalContent
10514
- }) => {
10515
- const { setIsOpen } = useStackedModal();
10516
- const onClick = React.useCallback(() => {
10517
- setModalContent(type);
10518
- setIsOpen(STACKED_MODAL_ID, true);
10519
- }, [setModalContent, setIsOpen, type]);
10520
- 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" }) });
10376
+ function convertNumber(value) {
10377
+ return typeof value === "string" ? Number(value.replace(",", ".")) : value;
10378
+ }
10379
+ const STACKED_MODAL_ID = "items_stacked_modal";
10380
+ const Items = () => {
10381
+ const { id } = reactRouterDom.useParams();
10382
+ const {
10383
+ order: preview,
10384
+ isPending: isPreviewPending,
10385
+ isError: isPreviewError,
10386
+ error: previewError
10387
+ } = useOrderPreview(id, void 0, {
10388
+ placeholderData: reactQuery.keepPreviousData
10389
+ });
10390
+ useInitiateOrderEdit({ preview });
10391
+ const { draft_order, isPending, isError, error } = useDraftOrder(
10392
+ id,
10393
+ {
10394
+ fields: "currency_code"
10395
+ },
10396
+ {
10397
+ enabled: !!id
10398
+ }
10399
+ );
10400
+ const { onCancel } = useCancelOrderEdit({ preview });
10401
+ if (isError) {
10402
+ throw error;
10403
+ }
10404
+ if (isPreviewError) {
10405
+ throw previewError;
10406
+ }
10407
+ const ready = !!preview && !isPreviewPending && !!draft_order && !isPending;
10408
+ return /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal, { onClose: onCancel, children: ready ? /* @__PURE__ */ jsxRuntime.jsx(ItemsForm, { preview, currencyCode: draft_order.currency_code }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
10409
+ /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Edit Items" }) }),
10410
+ /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Loading data for the draft order, please wait..." }) })
10411
+ ] }) });
10521
10412
  };
10522
- const VARIANT_PREFIX = "items";
10523
- const LIMIT = 50;
10524
- const ExistingItemsForm = ({ orderId, items }) => {
10525
- const { setIsOpen } = useStackedModal();
10526
- const [rowSelection, setRowSelection] = React.useState(
10527
- items.reduce((acc, item) => {
10528
- acc[item.variant_id] = true;
10529
- return acc;
10530
- }, {})
10413
+ const ItemsForm = ({ preview, currencyCode }) => {
10414
+ var _a;
10415
+ const [isSubmitting, setIsSubmitting] = React.useState(false);
10416
+ const [modalContent, setModalContent] = React.useState(
10417
+ null
10531
10418
  );
10532
- React.useEffect(() => {
10533
- setRowSelection(
10534
- items.reduce((acc, item) => {
10535
- if (item.variant_id) {
10536
- acc[item.variant_id] = true;
10419
+ const { handleSuccess } = useRouteModal();
10420
+ const { searchValue, onSearchValueChange, query: query2 } = useDebouncedSearch();
10421
+ const { mutateAsync: confirmOrderEdit } = useDraftOrderConfirmEdit(preview.id);
10422
+ const { mutateAsync: requestOrderEdit } = useDraftOrderRequestEdit(preview.id);
10423
+ const itemCount = ((_a = preview.items) == null ? void 0 : _a.reduce((acc, item) => acc + item.quantity, 0)) || 0;
10424
+ const matches = React.useMemo(() => {
10425
+ return matchSorter.matchSorter(preview.items, query2, {
10426
+ keys: ["product_title", "variant_title", "variant_sku", "title"]
10427
+ });
10428
+ }, [preview.items, query2]);
10429
+ const onSubmit = async () => {
10430
+ setIsSubmitting(true);
10431
+ let requestSucceeded = false;
10432
+ await requestOrderEdit(void 0, {
10433
+ onError: (e) => {
10434
+ ui.toast.error(`Failed to request order edit: ${e.message}`);
10435
+ },
10436
+ onSuccess: () => {
10437
+ requestSucceeded = true;
10438
+ }
10439
+ });
10440
+ if (!requestSucceeded) {
10441
+ setIsSubmitting(false);
10442
+ return;
10443
+ }
10444
+ await confirmOrderEdit(void 0, {
10445
+ onError: (e) => {
10446
+ ui.toast.error(`Failed to confirm order edit: ${e.message}`);
10447
+ },
10448
+ onSuccess: () => {
10449
+ handleSuccess();
10450
+ },
10451
+ onSettled: () => {
10452
+ setIsSubmitting(false);
10453
+ }
10454
+ });
10455
+ };
10456
+ const onKeyDown = React.useCallback(
10457
+ (e) => {
10458
+ if (e.key === "Enter" && (e.ctrlKey || e.metaKey)) {
10459
+ if (modalContent || isSubmitting) {
10460
+ return;
10537
10461
  }
10538
- return acc;
10539
- }, {})
10540
- );
10541
- }, [items]);
10542
- const { q, order, offset } = useQueryParams(
10543
- ["q", "order", "offset"],
10544
- VARIANT_PREFIX
10545
- );
10546
- const { variants, count, isPending, isError, error } = useProductVariants(
10547
- {
10548
- q,
10549
- order,
10550
- offset: offset ? parseInt(offset) : void 0,
10551
- limit: LIMIT
10462
+ onSubmit();
10463
+ }
10552
10464
  },
10553
- {
10554
- placeholderData: reactQuery.keepPreviousData
10555
- }
10465
+ [modalContent, isSubmitting, onSubmit]
10556
10466
  );
10557
- const columns = useColumns();
10558
- const { mutateAsync } = useDraftOrderAddItems(orderId);
10559
- const onSubmit = async () => {
10560
- const ids = Object.keys(rowSelection).filter(
10561
- (id) => !items.find((i) => i.variant_id === id)
10562
- );
10563
- await mutateAsync(
10564
- {
10565
- items: ids.map((id) => ({
10566
- variant_id: id,
10567
- quantity: 1
10568
- }))
10569
- },
10467
+ React.useEffect(() => {
10468
+ document.addEventListener("keydown", onKeyDown);
10469
+ return () => {
10470
+ document.removeEventListener("keydown", onKeyDown);
10471
+ };
10472
+ }, [onKeyDown]);
10473
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full flex-col overflow-hidden", children: [
10474
+ /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Header, {}),
10475
+ /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Body, { className: "flex flex-1 flex-col overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsxs(
10476
+ StackedFocusModal,
10570
10477
  {
10571
- onSuccess: () => {
10572
- setRowSelection({});
10573
- setIsOpen(STACKED_MODAL_ID, false);
10478
+ id: STACKED_MODAL_ID,
10479
+ onOpenChangeCallback: (open) => {
10480
+ if (!open) {
10481
+ setModalContent(null);
10482
+ }
10574
10483
  },
10575
- onError: (e) => {
10576
- ui.toast.error(e.message);
10577
- }
10484
+ children: [
10485
+ /* @__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: [
10486
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
10487
+ /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Items" }) }),
10488
+ /* @__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" }) })
10489
+ ] }),
10490
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
10491
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-6", children: [
10492
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 items-center gap-3", children: [
10493
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
10494
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: "Items" }),
10495
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Choose items from the product catalog." })
10496
+ ] }),
10497
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
10498
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
10499
+ ui.Input,
10500
+ {
10501
+ type: "search",
10502
+ placeholder: "Search items",
10503
+ value: searchValue,
10504
+ onChange: (e) => onSearchValueChange(e.target.value)
10505
+ }
10506
+ ) }),
10507
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
10508
+ /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.IconButton, { type: "button", children: /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}) }) }),
10509
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu.Content, { children: [
10510
+ /* @__PURE__ */ jsxRuntime.jsx(
10511
+ StackedModalTrigger$1,
10512
+ {
10513
+ type: "add-items",
10514
+ setModalContent
10515
+ }
10516
+ ),
10517
+ /* @__PURE__ */ jsxRuntime.jsx(
10518
+ StackedModalTrigger$1,
10519
+ {
10520
+ type: "add-custom-item",
10521
+ setModalContent
10522
+ }
10523
+ )
10524
+ ] })
10525
+ ] })
10526
+ ] })
10527
+ ] }),
10528
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-ui-bg-subtle shadow-elevation-card-rest rounded-xl", children: [
10529
+ /* @__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: [
10530
+ /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: "Item" }) }),
10531
+ /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: "Quantity" }) }),
10532
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-right", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: "Price" }) }),
10533
+ /* @__PURE__ */ jsxRuntime.jsx("div", {})
10534
+ ] }) }),
10535
+ /* @__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: [
10536
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: "There are no items in this order" }),
10537
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: "Add items to the order to get started." })
10538
+ ] }) : matches.length > 0 ? matches == null ? void 0 : matches.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
10539
+ Item,
10540
+ {
10541
+ item,
10542
+ preview,
10543
+ currencyCode
10544
+ },
10545
+ item.id
10546
+ )) : /* @__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: [
10547
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: "No items found" }),
10548
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: [
10549
+ 'No items found for "',
10550
+ query2,
10551
+ '".'
10552
+ ] })
10553
+ ] }) })
10554
+ ] })
10555
+ ] }),
10556
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
10557
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[1fr_0.5fr_0.5fr] gap-3", children: [
10558
+ /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: "Subtotal" }) }),
10559
+ /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsxs(
10560
+ ui.Text,
10561
+ {
10562
+ size: "small",
10563
+ leading: "compact",
10564
+ className: "text-ui-fg-subtle",
10565
+ children: [
10566
+ itemCount,
10567
+ " ",
10568
+ itemCount === 1 ? "item" : "items"
10569
+ ]
10570
+ }
10571
+ ) }),
10572
+ /* @__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) }) })
10573
+ ] })
10574
+ ] }) }),
10575
+ modalContent && (modalContent === "add-items" ? /* @__PURE__ */ jsxRuntime.jsx(ExistingItemsForm, { orderId: preview.id, items: preview.items }) : modalContent === "add-custom-item" ? /* @__PURE__ */ jsxRuntime.jsx(
10576
+ CustomItemForm,
10577
+ {
10578
+ orderId: preview.id,
10579
+ currencyCode
10580
+ }
10581
+ ) : null)
10582
+ ]
10578
10583
  }
10579
- );
10580
- };
10581
- if (isError) {
10582
- throw error;
10583
- }
10584
- return /* @__PURE__ */ jsxRuntime.jsxs(
10585
- StackedFocusModal.Content,
10586
- {
10587
- onOpenAutoFocus: (e) => {
10588
- e.preventDefault();
10589
- const searchInput = document.querySelector(
10590
- "[data-modal-id='modal-search-input']"
10591
- );
10592
- if (searchInput) {
10593
- searchInput.focus();
10584
+ ) }),
10585
+ /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
10586
+ /* @__PURE__ */ jsxRuntime.jsx(RouteFocusModal.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
10587
+ /* @__PURE__ */ jsxRuntime.jsx(
10588
+ ui.Button,
10589
+ {
10590
+ size: "small",
10591
+ type: "button",
10592
+ onClick: onSubmit,
10593
+ isLoading: isSubmitting,
10594
+ children: "Save"
10594
10595
  }
10595
- },
10596
- children: [
10597
- /* @__PURE__ */ jsxRuntime.jsxs(StackedFocusModal.Header, { children: [
10598
- /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Product Variants" }) }),
10599
- /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Choose product variants to add to the order." }) })
10600
- ] }),
10601
- /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Body, { className: "flex-1 overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx(
10602
- DataTable,
10603
- {
10604
- data: variants,
10605
- columns,
10606
- isLoading: isPending,
10607
- getRowId: (row) => row.id,
10608
- rowCount: count,
10609
- prefix: VARIANT_PREFIX,
10610
- layout: "fill",
10611
- rowSelection: {
10612
- state: rowSelection,
10613
- onRowSelectionChange: setRowSelection,
10614
- enableRowSelection: (row) => {
10615
- return !items.find((i) => i.variant_id === row.original.id);
10616
- }
10617
- },
10618
- autoFocusSearch: true
10619
- }
10620
- ) }),
10621
- /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
10622
- /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
10623
- /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "button", onClick: onSubmit, children: "Update items" })
10624
- ] }) })
10625
- ]
10626
- }
10627
- );
10596
+ )
10597
+ ] }) })
10598
+ ] });
10628
10599
  };
10629
- const columnHelper = ui.createDataTableColumnHelper();
10630
- const useColumns = () => {
10631
- return React.useMemo(() => {
10632
- return [
10633
- columnHelper.select(),
10634
- columnHelper.accessor("product.title", {
10635
- header: "Product",
10636
- cell: ({ row }) => {
10637
- var _a, _b, _c;
10638
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-2", children: [
10639
- /* @__PURE__ */ jsxRuntime.jsx(
10640
- Thumbnail,
10641
- {
10642
- thumbnail: (_a = row.original.product) == null ? void 0 : _a.thumbnail,
10643
- alt: (_b = row.original.product) == null ? void 0 : _b.title
10644
- }
10645
- ),
10646
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: (_c = row.original.product) == null ? void 0 : _c.title })
10647
- ] });
10600
+ const Item = ({ item, preview, currencyCode }) => {
10601
+ if (item.variant_id) {
10602
+ return /* @__PURE__ */ jsxRuntime.jsx(VariantItem, { item, preview, currencyCode });
10603
+ }
10604
+ return /* @__PURE__ */ jsxRuntime.jsx(CustomItem, { item, preview, currencyCode });
10605
+ };
10606
+ const VariantItem = ({ item, preview, currencyCode }) => {
10607
+ const [editing, setEditing] = React.useState(false);
10608
+ const form = reactHookForm.useForm({
10609
+ defaultValues: {
10610
+ quantity: item.quantity,
10611
+ unit_price: item.unit_price
10612
+ },
10613
+ resolver: zod.zodResolver(variantItemSchema)
10614
+ });
10615
+ const actionId = React.useMemo(() => {
10616
+ var _a, _b;
10617
+ return (_b = (_a = item.actions) == null ? void 0 : _a.find((a) => a.action === "ITEM_ADD")) == null ? void 0 : _b.id;
10618
+ }, [item]);
10619
+ const { mutateAsync: updateActionItem, isPending: isUpdatingActionItem } = useDraftOrderUpdateActionItem(preview.id);
10620
+ const { mutateAsync: updateOriginalItem, isPending: isUpdatingOriginalItem } = useDraftOrderUpdateItem(preview.id);
10621
+ const isPending = isUpdatingActionItem || isUpdatingOriginalItem;
10622
+ const onSubmit = form.handleSubmit(async (data) => {
10623
+ if (convertNumber(data.unit_price) === item.unit_price && data.quantity === item.quantity) {
10624
+ setEditing(false);
10625
+ return;
10626
+ }
10627
+ if (!actionId) {
10628
+ await updateOriginalItem(
10629
+ {
10630
+ item_id: item.id,
10631
+ quantity: data.quantity,
10632
+ unit_price: convertNumber(data.unit_price)
10648
10633
  },
10649
- enableSorting: true
10650
- }),
10651
- columnHelper.accessor("title", {
10652
- header: "Variant",
10653
- enableSorting: true
10654
- }),
10655
- columnHelper.accessor("sku", {
10656
- header: "SKU",
10657
- cell: ({ getValue }) => {
10658
- return getValue() ?? "-";
10634
+ {
10635
+ onSuccess: () => {
10636
+ setEditing(false);
10637
+ },
10638
+ onError: (e) => {
10639
+ ui.toast.error(e.message);
10640
+ }
10641
+ }
10642
+ );
10643
+ return;
10644
+ }
10645
+ await updateActionItem(
10646
+ {
10647
+ action_id: actionId,
10648
+ quantity: data.quantity,
10649
+ unit_price: convertNumber(data.unit_price)
10650
+ },
10651
+ {
10652
+ onSuccess: () => {
10653
+ setEditing(false);
10659
10654
  },
10660
- enableSorting: true
10661
- }),
10662
- columnHelper.accessor("updated_at", {
10663
- header: "Updated",
10664
- cell: ({ getValue }) => {
10665
- return /* @__PURE__ */ jsxRuntime.jsx(
10666
- ui.Tooltip,
10655
+ onError: (e) => {
10656
+ ui.toast.error(e.message);
10657
+ }
10658
+ }
10659
+ );
10660
+ });
10661
+ 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: [
10662
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full items-center gap-x-3", children: [
10663
+ /* @__PURE__ */ jsxRuntime.jsx(
10664
+ Thumbnail,
10665
+ {
10666
+ thumbnail: item.thumbnail,
10667
+ alt: item.product_title ?? void 0
10668
+ }
10669
+ ),
10670
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
10671
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-1", children: [
10672
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", leading: "compact", children: item.product_title }),
10673
+ /* @__PURE__ */ jsxRuntime.jsxs(
10674
+ ui.Text,
10667
10675
  {
10668
- content: getFullDate({ date: getValue(), includeTime: true }),
10669
- children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: getFullDate({ date: getValue() }) })
10676
+ size: "small",
10677
+ leading: "compact",
10678
+ className: "text-ui-fg-subtle",
10679
+ children: [
10680
+ "(",
10681
+ item.variant_title,
10682
+ ")"
10683
+ ]
10670
10684
  }
10671
- );
10672
- },
10673
- enableSorting: true,
10674
- sortAscLabel: "Oldest first",
10675
- sortDescLabel: "Newest first"
10676
- }),
10677
- columnHelper.accessor("created_at", {
10678
- header: "Created",
10679
- cell: ({ getValue }) => {
10680
- return /* @__PURE__ */ jsxRuntime.jsx(
10681
- ui.Tooltip,
10685
+ )
10686
+ ] }),
10687
+ /* @__PURE__ */ jsxRuntime.jsx(
10688
+ ui.Text,
10689
+ {
10690
+ size: "small",
10691
+ leading: "compact",
10692
+ className: "text-ui-fg-subtle",
10693
+ children: item.variant_sku
10694
+ }
10695
+ )
10696
+ ] })
10697
+ ] }),
10698
+ editing ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
10699
+ Form$2.Field,
10700
+ {
10701
+ control: form.control,
10702
+ name: "quantity",
10703
+ render: ({ field }) => {
10704
+ return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(NumberInput, { ...field }) }) });
10705
+ }
10706
+ }
10707
+ ) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: item.quantity }) }),
10708
+ editing ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
10709
+ Form$2.Field,
10710
+ {
10711
+ control: form.control,
10712
+ name: "unit_price",
10713
+ render: ({ field: { onChange, ...field } }) => {
10714
+ return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
10715
+ ui.CurrencyInput,
10682
10716
  {
10683
- content: getFullDate({ date: getValue(), includeTime: true }),
10684
- children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: getFullDate({ date: getValue() }) })
10717
+ ...field,
10718
+ symbol: getNativeSymbol(currencyCode),
10719
+ code: currencyCode,
10720
+ onValueChange: (_value, _name, values) => onChange(values == null ? void 0 : values.value)
10685
10721
  }
10686
- );
10722
+ ) }) });
10723
+ }
10724
+ }
10725
+ ) }) : /* @__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) }) }),
10726
+ /* @__PURE__ */ jsxRuntime.jsx(
10727
+ ui.IconButton,
10728
+ {
10729
+ type: "button",
10730
+ size: "small",
10731
+ onClick: editing ? onSubmit : () => {
10732
+ setEditing(true);
10687
10733
  },
10688
- enableSorting: true,
10689
- sortAscLabel: "Oldest first",
10690
- sortDescLabel: "Newest first"
10691
- })
10692
- ];
10693
- }, []);
10734
+ disabled: isPending,
10735
+ children: editing ? /* @__PURE__ */ jsxRuntime.jsx(icons.Check, {}) : /* @__PURE__ */ jsxRuntime.jsx(icons.PencilSquare, {})
10736
+ }
10737
+ )
10738
+ ] }) }) });
10694
10739
  };
10695
- const CustomItemForm = ({ orderId, currencyCode }) => {
10696
- const { setIsOpen } = useStackedModal();
10697
- const { mutateAsync: addItems } = useDraftOrderAddItems(orderId);
10740
+ const variantItemSchema = objectType({
10741
+ quantity: numberType(),
10742
+ unit_price: unionType([numberType(), stringType()])
10743
+ });
10744
+ const CustomItem = ({ item, preview, currencyCode }) => {
10745
+ const [editing, setEditing] = React.useState(false);
10746
+ const { quantity, unit_price, title } = item;
10698
10747
  const form = reactHookForm.useForm({
10699
10748
  defaultValues: {
10700
- title: "",
10701
- quantity: 1,
10702
- unit_price: ""
10749
+ title,
10750
+ quantity,
10751
+ unit_price
10703
10752
  },
10704
10753
  resolver: zod.zodResolver(customItemSchema)
10705
10754
  });
10755
+ React.useEffect(() => {
10756
+ form.reset({
10757
+ title,
10758
+ quantity,
10759
+ unit_price
10760
+ });
10761
+ }, [form, title, quantity, unit_price]);
10762
+ const actionId = React.useMemo(() => {
10763
+ var _a, _b;
10764
+ return (_b = (_a = item.actions) == null ? void 0 : _a.find((a) => a.action === "ITEM_ADD")) == null ? void 0 : _b.id;
10765
+ }, [item]);
10766
+ const { mutateAsync: updateActionItem, isPending: isUpdatingActionItem } = useDraftOrderUpdateActionItem(preview.id);
10767
+ const { mutateAsync: removeActionItem, isPending: isRemovingActionItem } = useDraftOrderRemoveActionItem(preview.id);
10768
+ const { mutateAsync: updateOriginalItem, isPending: isUpdatingOriginalItem } = useDraftOrderUpdateItem(preview.id);
10769
+ const isPending = isUpdatingActionItem || isUpdatingOriginalItem;
10706
10770
  const onSubmit = form.handleSubmit(async (data) => {
10707
- await addItems(
10708
- {
10709
- items: [
10710
- {
10711
- title: data.title,
10712
- quantity: data.quantity,
10713
- unit_price: convertNumber(data.unit_price)
10771
+ if (convertNumber(data.unit_price) === item.unit_price && data.quantity === item.quantity && data.title === item.title) {
10772
+ setEditing(false);
10773
+ return;
10774
+ }
10775
+ if (!actionId) {
10776
+ await updateOriginalItem(
10777
+ {
10778
+ item_id: item.id,
10779
+ quantity: data.quantity,
10780
+ unit_price: convertNumber(data.unit_price)
10781
+ },
10782
+ {
10783
+ onSuccess: () => {
10784
+ setEditing(false);
10785
+ },
10786
+ onError: (e) => {
10787
+ ui.toast.error(e.message);
10714
10788
  }
10715
- ]
10789
+ }
10790
+ );
10791
+ return;
10792
+ }
10793
+ if (data.quantity === 0) {
10794
+ await removeActionItem(actionId, {
10795
+ onSuccess: () => {
10796
+ setEditing(false);
10797
+ },
10798
+ onError: (e) => {
10799
+ ui.toast.error(e.message);
10800
+ }
10801
+ });
10802
+ return;
10803
+ }
10804
+ await updateActionItem(
10805
+ {
10806
+ action_id: actionId,
10807
+ quantity: data.quantity,
10808
+ unit_price: convertNumber(data.unit_price)
10716
10809
  },
10717
10810
  {
10718
10811
  onSuccess: () => {
10719
- setIsOpen(STACKED_MODAL_ID, false);
10812
+ setEditing(false);
10720
10813
  },
10721
10814
  onError: (e) => {
10722
10815
  ui.toast.error(e.message);
@@ -10724,437 +10817,365 @@ const CustomItemForm = ({ orderId, currencyCode }) => {
10724
10817
  }
10725
10818
  );
10726
10819
  });
10727
- return /* @__PURE__ */ jsxRuntime.jsx(Form$2, { ...form, children: /* @__PURE__ */ jsxRuntime.jsx(KeyboundForm, { onSubmit, children: /* @__PURE__ */ jsxRuntime.jsxs(StackedFocusModal.Content, { children: [
10728
- /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Header, {}),
10729
- /* @__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: [
10730
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
10731
- /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Add custom item" }) }),
10732
- /* @__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." }) })
10733
- ] }),
10734
- /* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
10735
- /* @__PURE__ */ jsxRuntime.jsx(
10736
- Form$2.Field,
10737
- {
10738
- control: form.control,
10739
- name: "title",
10740
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
10741
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
10742
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Title" }),
10743
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Hint, { children: "Enter the title of the item" })
10744
- ] }),
10745
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
10746
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
10747
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
10748
- ] })
10749
- ] }) })
10750
- }
10751
- ),
10752
- /* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
10820
+ 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: [
10821
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-3", children: [
10753
10822
  /* @__PURE__ */ jsxRuntime.jsx(
10754
- Form$2.Field,
10823
+ Thumbnail,
10755
10824
  {
10756
- control: form.control,
10757
- name: "unit_price",
10758
- render: ({ field: { onChange, ...field } }) => /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
10759
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
10760
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Unit price" }),
10761
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Hint, { children: "Enter the unit price of the item" })
10762
- ] }),
10763
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
10764
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
10765
- ui.CurrencyInput,
10766
- {
10767
- symbol: getNativeSymbol(currencyCode),
10768
- code: currencyCode,
10769
- onValueChange: (_value, _name, values) => onChange(values == null ? void 0 : values.value),
10770
- ...field
10771
- }
10772
- ) }),
10773
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
10774
- ] })
10775
- ] }) })
10825
+ thumbnail: item.thumbnail,
10826
+ alt: item.title ?? void 0
10776
10827
  }
10777
10828
  ),
10778
- /* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
10779
- /* @__PURE__ */ jsxRuntime.jsx(
10829
+ editing ? /* @__PURE__ */ jsxRuntime.jsx(
10780
10830
  Form$2.Field,
10781
10831
  {
10782
10832
  control: form.control,
10783
- name: "quantity",
10784
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
10785
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
10786
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Quantity" }),
10787
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Hint, { children: "Enter the quantity of the item" })
10788
- ] }),
10789
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full flex-1", children: [
10790
- /* @__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" }) }) }),
10791
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
10792
- ] })
10793
- ] }) })
10833
+ name: "title",
10834
+ render: ({ field }) => {
10835
+ return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }) });
10836
+ }
10794
10837
  }
10795
- )
10796
- ] }) }) }),
10797
- /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
10798
- /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
10799
- /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "button", onClick: onSubmit, children: "Add item" })
10800
- ] }) })
10801
- ] }) }) });
10802
- };
10803
- const customItemSchema = objectType({
10804
- title: stringType().min(1),
10805
- quantity: numberType(),
10806
- unit_price: unionType([numberType(), stringType()])
10807
- });
10808
- const InlineTip = React.forwardRef(
10809
- ({ variant = "tip", label, className, children, ...props }, ref) => {
10810
- const labelValue = label || (variant === "warning" ? "Warning" : "Tip");
10811
- return /* @__PURE__ */ jsxRuntime.jsxs(
10812
- "div",
10838
+ ) : /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: item.title })
10839
+ ] }),
10840
+ editing ? /* @__PURE__ */ jsxRuntime.jsx(
10841
+ Form$2.Field,
10813
10842
  {
10814
- ref,
10815
- className: ui.clx(
10816
- "bg-ui-bg-component txt-small text-ui-fg-subtle grid grid-cols-[4px_1fr] items-start gap-3 rounded-lg border p-3",
10817
- className
10818
- ),
10819
- ...props,
10820
- children: [
10821
- /* @__PURE__ */ jsxRuntime.jsx(
10822
- "div",
10843
+ control: form.control,
10844
+ name: "quantity",
10845
+ render: ({ field }) => {
10846
+ return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(NumberInput, { ...field }) }) });
10847
+ }
10848
+ }
10849
+ ) : /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", children: item.quantity }),
10850
+ editing ? /* @__PURE__ */ jsxRuntime.jsx(
10851
+ Form$2.Field,
10852
+ {
10853
+ control: form.control,
10854
+ name: "unit_price",
10855
+ render: ({ field: { onChange, ...field } }) => {
10856
+ return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
10857
+ ui.CurrencyInput,
10823
10858
  {
10824
- role: "presentation",
10825
- className: ui.clx("w-4px bg-ui-tag-neutral-icon h-full rounded-full", {
10826
- "bg-ui-tag-orange-icon": variant === "warning"
10827
- })
10859
+ ...field,
10860
+ symbol: getNativeSymbol(currencyCode),
10861
+ code: currencyCode,
10862
+ onValueChange: (_value, _name, values) => onChange(values == null ? void 0 : values.value)
10828
10863
  }
10829
- ),
10830
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-pretty", children: [
10831
- /* @__PURE__ */ jsxRuntime.jsxs("strong", { className: "txt-small-plus text-ui-fg-base", children: [
10832
- labelValue,
10833
- ":"
10834
- ] }),
10835
- " ",
10836
- children
10837
- ] })
10838
- ]
10864
+ ) }) });
10865
+ }
10839
10866
  }
10840
- );
10841
- }
10842
- );
10843
- InlineTip.displayName = "InlineTip";
10844
- const MetadataFieldSchema = objectType({
10845
- key: stringType(),
10846
- disabled: booleanType().optional(),
10847
- value: anyType()
10848
- });
10849
- const MetadataSchema = objectType({
10850
- metadata: arrayType(MetadataFieldSchema)
10851
- });
10852
- const Metadata = () => {
10853
- const { id } = reactRouterDom.useParams();
10854
- const { order, isPending, isError, error } = useOrder(id, {
10855
- fields: "metadata"
10856
- });
10857
- if (isError) {
10858
- throw error;
10859
- }
10860
- const isReady = !isPending && !!order;
10861
- return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { children: [
10862
- /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer.Header, { children: [
10863
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Metadata" }) }),
10864
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Add metadata to the draft order." }) })
10865
- ] }),
10866
- !isReady ? /* @__PURE__ */ jsxRuntime.jsx(PlaceholderInner, {}) : /* @__PURE__ */ jsxRuntime.jsx(MetadataForm, { orderId: id, metadata: order == null ? void 0 : order.metadata })
10867
- ] });
10867
+ ) : /* @__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) }) }),
10868
+ /* @__PURE__ */ jsxRuntime.jsx(
10869
+ ui.IconButton,
10870
+ {
10871
+ type: "button",
10872
+ size: "small",
10873
+ onClick: editing ? onSubmit : () => {
10874
+ setEditing(true);
10875
+ },
10876
+ disabled: isPending,
10877
+ children: editing ? /* @__PURE__ */ jsxRuntime.jsx(icons.Check, {}) : /* @__PURE__ */ jsxRuntime.jsx(icons.PencilSquare, {})
10878
+ }
10879
+ )
10880
+ ] }) }) });
10868
10881
  };
10869
- const METADATA_KEY_LABEL_ID = "metadata-form-key-label";
10870
- const METADATA_VALUE_LABEL_ID = "metadata-form-value-label";
10871
- const MetadataForm = ({ orderId, metadata }) => {
10872
- const { handleSuccess } = useRouteModal();
10873
- const hasUneditableRows = getHasUneditableRows(metadata);
10874
- const { mutateAsync, isPending } = useUpdateDraftOrder(orderId);
10875
- const form = reactHookForm.useForm({
10876
- defaultValues: {
10877
- metadata: getDefaultValues(metadata)
10882
+ const StackedModalTrigger$1 = ({
10883
+ type,
10884
+ setModalContent
10885
+ }) => {
10886
+ const { setIsOpen } = useStackedModal();
10887
+ const onClick = React.useCallback(() => {
10888
+ setModalContent(type);
10889
+ setIsOpen(STACKED_MODAL_ID, true);
10890
+ }, [setModalContent, setIsOpen, type]);
10891
+ return /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Item, { onClick, children: type === "add-items" ? "Add items" : "Add custom item" }) });
10892
+ };
10893
+ const VARIANT_PREFIX = "items";
10894
+ const LIMIT = 50;
10895
+ const ExistingItemsForm = ({ orderId, items }) => {
10896
+ const { setIsOpen } = useStackedModal();
10897
+ const [rowSelection, setRowSelection] = React.useState(
10898
+ items.reduce((acc, item) => {
10899
+ acc[item.variant_id] = true;
10900
+ return acc;
10901
+ }, {})
10902
+ );
10903
+ React.useEffect(() => {
10904
+ setRowSelection(
10905
+ items.reduce((acc, item) => {
10906
+ if (item.variant_id) {
10907
+ acc[item.variant_id] = true;
10908
+ }
10909
+ return acc;
10910
+ }, {})
10911
+ );
10912
+ }, [items]);
10913
+ const { q, order, offset } = useQueryParams(
10914
+ ["q", "order", "offset"],
10915
+ VARIANT_PREFIX
10916
+ );
10917
+ const { variants, count, isPending, isError, error } = useProductVariants(
10918
+ {
10919
+ q,
10920
+ order,
10921
+ offset: offset ? parseInt(offset) : void 0,
10922
+ limit: LIMIT
10878
10923
  },
10879
- resolver: zod.zodResolver(MetadataSchema)
10880
- });
10881
- const handleSubmit = form.handleSubmit(async (data) => {
10882
- const parsedData = parseValues(data);
10924
+ {
10925
+ placeholderData: reactQuery.keepPreviousData
10926
+ }
10927
+ );
10928
+ const columns = useColumns();
10929
+ const { mutateAsync } = useDraftOrderAddItems(orderId);
10930
+ const onSubmit = async () => {
10931
+ const ids = Object.keys(rowSelection).filter(
10932
+ (id) => !items.find((i) => i.variant_id === id)
10933
+ );
10883
10934
  await mutateAsync(
10884
10935
  {
10885
- metadata: parsedData
10936
+ items: ids.map((id) => ({
10937
+ variant_id: id,
10938
+ quantity: 1
10939
+ }))
10886
10940
  },
10887
10941
  {
10888
10942
  onSuccess: () => {
10889
- ui.toast.success("Metadata updated");
10890
- handleSuccess();
10943
+ setRowSelection({});
10944
+ setIsOpen(STACKED_MODAL_ID, false);
10891
10945
  },
10892
- onError: (error) => {
10893
- ui.toast.error(error.message);
10946
+ onError: (e) => {
10947
+ ui.toast.error(e.message);
10894
10948
  }
10895
10949
  }
10896
10950
  );
10897
- });
10898
- const { fields, insert, remove } = reactHookForm.useFieldArray({
10899
- control: form.control,
10900
- name: "metadata"
10901
- });
10902
- function deleteRow(index) {
10903
- remove(index);
10904
- if (fields.length === 1) {
10905
- insert(0, {
10906
- key: "",
10907
- value: "",
10908
- disabled: false
10909
- });
10910
- }
10911
- }
10912
- function insertRow(index, position) {
10913
- insert(index + (position === "above" ? 0 : 1), {
10914
- key: "",
10915
- value: "",
10916
- disabled: false
10917
- });
10918
- }
10919
- return /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxRuntime.jsxs(
10920
- KeyboundForm,
10951
+ };
10952
+ if (isError) {
10953
+ throw error;
10954
+ }
10955
+ return /* @__PURE__ */ jsxRuntime.jsxs(
10956
+ StackedFocusModal.Content,
10921
10957
  {
10922
- onSubmit: handleSubmit,
10923
- className: "flex flex-1 flex-col overflow-hidden",
10958
+ onOpenAutoFocus: (e) => {
10959
+ e.preventDefault();
10960
+ const searchInput = document.querySelector(
10961
+ "[data-modal-id='modal-search-input']"
10962
+ );
10963
+ if (searchInput) {
10964
+ searchInput.focus();
10965
+ }
10966
+ },
10924
10967
  children: [
10925
- /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer.Body, { className: "flex flex-1 flex-col gap-y-8 overflow-y-auto", children: [
10926
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-ui-bg-base shadow-elevation-card-rest grid grid-cols-1 divide-y rounded-lg", children: [
10927
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-ui-bg-subtle grid grid-cols-2 divide-x rounded-t-lg", children: [
10928
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "txt-compact-small-plus text-ui-fg-subtle px-2 py-1.5", children: /* @__PURE__ */ jsxRuntime.jsx("label", { id: METADATA_KEY_LABEL_ID, children: "Key" }) }),
10929
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "txt-compact-small-plus text-ui-fg-subtle px-2 py-1.5", children: /* @__PURE__ */ jsxRuntime.jsx("label", { id: METADATA_VALUE_LABEL_ID, children: "Value" }) })
10930
- ] }),
10931
- fields.map((field, index) => {
10932
- const isDisabled = field.disabled || false;
10933
- let placeholder = "-";
10934
- if (typeof field.value === "object") {
10935
- placeholder = "{ ... }";
10936
- }
10937
- if (Array.isArray(field.value)) {
10938
- placeholder = "[ ... ]";
10939
- }
10940
- return /* @__PURE__ */ jsxRuntime.jsx(
10941
- ConditionalTooltip,
10942
- {
10943
- showTooltip: isDisabled,
10944
- content: "This row is disabled because it contains non-primitive data.",
10945
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "group/table relative", children: [
10946
- /* @__PURE__ */ jsxRuntime.jsxs(
10947
- "div",
10948
- {
10949
- className: ui.clx("grid grid-cols-2 divide-x", {
10950
- "overflow-hidden rounded-b-lg": index === fields.length - 1
10951
- }),
10952
- children: [
10953
- /* @__PURE__ */ jsxRuntime.jsx(
10954
- Form$2.Field,
10955
- {
10956
- control: form.control,
10957
- name: `metadata.${index}.key`,
10958
- render: ({ field: field2 }) => {
10959
- return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
10960
- GridInput,
10961
- {
10962
- "aria-labelledby": METADATA_KEY_LABEL_ID,
10963
- ...field2,
10964
- disabled: isDisabled,
10965
- placeholder: "Key"
10966
- }
10967
- ) }) });
10968
- }
10969
- }
10970
- ),
10971
- /* @__PURE__ */ jsxRuntime.jsx(
10972
- Form$2.Field,
10973
- {
10974
- control: form.control,
10975
- name: `metadata.${index}.value`,
10976
- render: ({ field: { value, ...field2 } }) => {
10977
- return /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
10978
- GridInput,
10979
- {
10980
- "aria-labelledby": METADATA_VALUE_LABEL_ID,
10981
- ...field2,
10982
- value: isDisabled ? placeholder : value,
10983
- disabled: isDisabled,
10984
- placeholder: "Value"
10985
- }
10986
- ) }) });
10987
- }
10988
- }
10989
- )
10990
- ]
10991
- }
10992
- ),
10993
- /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu, { children: [
10994
- /* @__PURE__ */ jsxRuntime.jsx(
10995
- ui.DropdownMenu.Trigger,
10996
- {
10997
- className: ui.clx(
10998
- "invisible absolute inset-y-0 -right-2.5 my-auto group-hover/table:visible data-[state='open']:visible",
10999
- {
11000
- hidden: isDisabled
11001
- }
11002
- ),
11003
- disabled: isDisabled,
11004
- asChild: true,
11005
- children: /* @__PURE__ */ jsxRuntime.jsx(ui.IconButton, { size: "2xsmall", children: /* @__PURE__ */ jsxRuntime.jsx(icons.EllipsisVertical, {}) })
11006
- }
11007
- ),
11008
- /* @__PURE__ */ jsxRuntime.jsxs(ui.DropdownMenu.Content, { children: [
11009
- /* @__PURE__ */ jsxRuntime.jsxs(
11010
- ui.DropdownMenu.Item,
11011
- {
11012
- className: "gap-x-2",
11013
- onClick: () => insertRow(index, "above"),
11014
- children: [
11015
- /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpMini, { className: "text-ui-fg-subtle" }),
11016
- "Insert row above"
11017
- ]
11018
- }
11019
- ),
11020
- /* @__PURE__ */ jsxRuntime.jsxs(
11021
- ui.DropdownMenu.Item,
11022
- {
11023
- className: "gap-x-2",
11024
- onClick: () => insertRow(index, "below"),
11025
- children: [
11026
- /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowDownMini, { className: "text-ui-fg-subtle" }),
11027
- "Insert row below"
11028
- ]
11029
- }
11030
- ),
11031
- /* @__PURE__ */ jsxRuntime.jsx(ui.DropdownMenu.Separator, {}),
11032
- /* @__PURE__ */ jsxRuntime.jsxs(
11033
- ui.DropdownMenu.Item,
11034
- {
11035
- className: "gap-x-2",
11036
- onClick: () => deleteRow(index),
11037
- children: [
11038
- /* @__PURE__ */ jsxRuntime.jsx(icons.Trash, { className: "text-ui-fg-subtle" }),
11039
- "Delete row"
11040
- ]
11041
- }
11042
- )
11043
- ] })
11044
- ] })
11045
- ] })
11046
- },
11047
- field.id
11048
- );
11049
- })
11050
- ] }),
11051
- hasUneditableRows && /* @__PURE__ */ jsxRuntime.jsx(InlineTip, { variant: "warning", label: "Some rows are disabled", children: "This object contains non-primitive metadata, such as arrays or objects, that can't be edited here. To edit the disabled rows, use the API directly." })
10968
+ /* @__PURE__ */ jsxRuntime.jsxs(StackedFocusModal.Header, { children: [
10969
+ /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Product Variants" }) }),
10970
+ /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Choose product variants to add to the order." }) })
11052
10971
  ] }),
11053
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
11054
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
11055
- /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "submit", isLoading: isPending, children: "Save" })
10972
+ /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Body, { className: "flex-1 overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx(
10973
+ DataTable,
10974
+ {
10975
+ data: variants,
10976
+ columns,
10977
+ isLoading: isPending,
10978
+ getRowId: (row) => row.id,
10979
+ rowCount: count,
10980
+ prefix: VARIANT_PREFIX,
10981
+ layout: "fill",
10982
+ rowSelection: {
10983
+ state: rowSelection,
10984
+ onRowSelectionChange: setRowSelection,
10985
+ enableRowSelection: (row) => {
10986
+ return !items.find((i) => i.variant_id === row.original.id);
10987
+ }
10988
+ },
10989
+ autoFocusSearch: true
10990
+ }
10991
+ ) }),
10992
+ /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
10993
+ /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
10994
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "button", onClick: onSubmit, children: "Update items" })
11056
10995
  ] }) })
11057
10996
  ]
11058
10997
  }
11059
- ) });
11060
- };
11061
- const GridInput = React.forwardRef(({ className, ...props }, ref) => {
11062
- return /* @__PURE__ */ jsxRuntime.jsx(
11063
- "input",
11064
- {
11065
- ref,
11066
- ...props,
11067
- autoComplete: "off",
11068
- className: ui.clx(
11069
- "txt-compact-small text-ui-fg-base placeholder:text-ui-fg-muted disabled:text-ui-fg-disabled disabled:bg-ui-bg-base bg-transparent px-2 py-1.5 outline-none",
11070
- className
11071
- )
11072
- }
11073
10998
  );
11074
- });
11075
- GridInput.displayName = "MetadataForm.GridInput";
11076
- const PlaceholderInner = () => {
11077
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 flex-col overflow-hidden", children: [
11078
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Body, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Skeleton, { className: "h-[148ox] w-full rounded-lg" }) }),
11079
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
11080
- /* @__PURE__ */ jsxRuntime.jsx(ui.Skeleton, { className: "h-7 w-12 rounded-md" }),
11081
- /* @__PURE__ */ jsxRuntime.jsx(ui.Skeleton, { className: "h-7 w-12 rounded-md" })
11082
- ] }) })
11083
- ] });
11084
10999
  };
11085
- const EDITABLE_TYPES = ["string", "number", "boolean"];
11086
- function getDefaultValues(metadata) {
11087
- if (!metadata || !Object.keys(metadata).length) {
11000
+ const columnHelper = ui.createDataTableColumnHelper();
11001
+ const useColumns = () => {
11002
+ return React.useMemo(() => {
11088
11003
  return [
11089
- {
11090
- key: "",
11091
- value: "",
11092
- disabled: false
11093
- }
11004
+ columnHelper.select(),
11005
+ columnHelper.accessor("product.title", {
11006
+ header: "Product",
11007
+ cell: ({ row }) => {
11008
+ var _a, _b, _c;
11009
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-2", children: [
11010
+ /* @__PURE__ */ jsxRuntime.jsx(
11011
+ Thumbnail,
11012
+ {
11013
+ thumbnail: (_a = row.original.product) == null ? void 0 : _a.thumbnail,
11014
+ alt: (_b = row.original.product) == null ? void 0 : _b.title
11015
+ }
11016
+ ),
11017
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: (_c = row.original.product) == null ? void 0 : _c.title })
11018
+ ] });
11019
+ },
11020
+ enableSorting: true
11021
+ }),
11022
+ columnHelper.accessor("title", {
11023
+ header: "Variant",
11024
+ enableSorting: true
11025
+ }),
11026
+ columnHelper.accessor("sku", {
11027
+ header: "SKU",
11028
+ cell: ({ getValue }) => {
11029
+ return getValue() ?? "-";
11030
+ },
11031
+ enableSorting: true
11032
+ }),
11033
+ columnHelper.accessor("updated_at", {
11034
+ header: "Updated",
11035
+ cell: ({ getValue }) => {
11036
+ return /* @__PURE__ */ jsxRuntime.jsx(
11037
+ ui.Tooltip,
11038
+ {
11039
+ content: getFullDate({ date: getValue(), includeTime: true }),
11040
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: getFullDate({ date: getValue() }) })
11041
+ }
11042
+ );
11043
+ },
11044
+ enableSorting: true,
11045
+ sortAscLabel: "Oldest first",
11046
+ sortDescLabel: "Newest first"
11047
+ }),
11048
+ columnHelper.accessor("created_at", {
11049
+ header: "Created",
11050
+ cell: ({ getValue }) => {
11051
+ return /* @__PURE__ */ jsxRuntime.jsx(
11052
+ ui.Tooltip,
11053
+ {
11054
+ content: getFullDate({ date: getValue(), includeTime: true }),
11055
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: getFullDate({ date: getValue() }) })
11056
+ }
11057
+ );
11058
+ },
11059
+ enableSorting: true,
11060
+ sortAscLabel: "Oldest first",
11061
+ sortDescLabel: "Newest first"
11062
+ })
11094
11063
  ];
11095
- }
11096
- return Object.entries(metadata).map(([key, value]) => {
11097
- if (!EDITABLE_TYPES.includes(typeof value)) {
11098
- return {
11099
- key,
11100
- value,
11101
- disabled: true
11102
- };
11103
- }
11104
- let stringValue = value;
11105
- if (typeof value !== "string") {
11106
- stringValue = JSON.stringify(value);
11107
- }
11108
- return {
11109
- key,
11110
- value: stringValue,
11111
- original_key: key
11112
- };
11064
+ }, []);
11065
+ };
11066
+ const CustomItemForm = ({ orderId, currencyCode }) => {
11067
+ const { setIsOpen } = useStackedModal();
11068
+ const { mutateAsync: addItems } = useDraftOrderAddItems(orderId);
11069
+ const form = reactHookForm.useForm({
11070
+ defaultValues: {
11071
+ title: "",
11072
+ quantity: 1,
11073
+ unit_price: ""
11074
+ },
11075
+ resolver: zod.zodResolver(customItemSchema)
11113
11076
  });
11114
- }
11115
- function parseValues(values) {
11116
- const metadata = values.metadata;
11117
- const isEmpty = !metadata.length || metadata.length === 1 && !metadata[0].key && !metadata[0].value;
11118
- if (isEmpty) {
11119
- return null;
11120
- }
11121
- const update = {};
11122
- metadata.forEach((field) => {
11123
- let key = field.key;
11124
- let value = field.value;
11125
- const disabled = field.disabled;
11126
- if (!key || !value) {
11127
- return;
11128
- }
11129
- if (disabled) {
11130
- update[key] = value;
11131
- return;
11132
- }
11133
- key = key.trim();
11134
- value = value.trim();
11135
- if (value === "true") {
11136
- update[key] = true;
11137
- } else if (value === "false") {
11138
- update[key] = false;
11139
- } else {
11140
- const parsedNumber = parseFloat(value);
11141
- if (!isNaN(parsedNumber)) {
11142
- update[key] = parsedNumber;
11143
- } else {
11144
- update[key] = value;
11077
+ const onSubmit = form.handleSubmit(async (data) => {
11078
+ await addItems(
11079
+ {
11080
+ items: [
11081
+ {
11082
+ title: data.title,
11083
+ quantity: data.quantity,
11084
+ unit_price: convertNumber(data.unit_price)
11085
+ }
11086
+ ]
11087
+ },
11088
+ {
11089
+ onSuccess: () => {
11090
+ setIsOpen(STACKED_MODAL_ID, false);
11091
+ },
11092
+ onError: (e) => {
11093
+ ui.toast.error(e.message);
11094
+ }
11145
11095
  }
11146
- }
11096
+ );
11147
11097
  });
11148
- return update;
11149
- }
11150
- function getHasUneditableRows(metadata) {
11151
- if (!metadata) {
11152
- return false;
11153
- }
11154
- return Object.values(metadata).some(
11155
- (value) => !EDITABLE_TYPES.includes(typeof value)
11156
- );
11157
- }
11098
+ return /* @__PURE__ */ jsxRuntime.jsx(Form$2, { ...form, children: /* @__PURE__ */ jsxRuntime.jsx(KeyboundForm, { onSubmit, children: /* @__PURE__ */ jsxRuntime.jsxs(StackedFocusModal.Content, { children: [
11099
+ /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Header, {}),
11100
+ /* @__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: [
11101
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
11102
+ /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Add custom item" }) }),
11103
+ /* @__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." }) })
11104
+ ] }),
11105
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
11106
+ /* @__PURE__ */ jsxRuntime.jsx(
11107
+ Form$2.Field,
11108
+ {
11109
+ control: form.control,
11110
+ name: "title",
11111
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
11112
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
11113
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Title" }),
11114
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Hint, { children: "Enter the title of the item" })
11115
+ ] }),
11116
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
11117
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
11118
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
11119
+ ] })
11120
+ ] }) })
11121
+ }
11122
+ ),
11123
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
11124
+ /* @__PURE__ */ jsxRuntime.jsx(
11125
+ Form$2.Field,
11126
+ {
11127
+ control: form.control,
11128
+ name: "unit_price",
11129
+ render: ({ field: { onChange, ...field } }) => /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
11130
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
11131
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Unit price" }),
11132
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Hint, { children: "Enter the unit price of the item" })
11133
+ ] }),
11134
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
11135
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
11136
+ ui.CurrencyInput,
11137
+ {
11138
+ symbol: getNativeSymbol(currencyCode),
11139
+ code: currencyCode,
11140
+ onValueChange: (_value, _name, values) => onChange(values == null ? void 0 : values.value),
11141
+ ...field
11142
+ }
11143
+ ) }),
11144
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
11145
+ ] })
11146
+ ] }) })
11147
+ }
11148
+ ),
11149
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Divider, { variant: "dashed" }),
11150
+ /* @__PURE__ */ jsxRuntime.jsx(
11151
+ Form$2.Field,
11152
+ {
11153
+ control: form.control,
11154
+ name: "quantity",
11155
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsx(Form$2.Item, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-x-3", children: [
11156
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
11157
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Quantity" }),
11158
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Hint, { children: "Enter the quantity of the item" })
11159
+ ] }),
11160
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full flex-1", children: [
11161
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(NumberInput, { ...field, className: "w-full" }) }) }),
11162
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
11163
+ ] })
11164
+ ] }) })
11165
+ }
11166
+ )
11167
+ ] }) }) }),
11168
+ /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-x-2", children: [
11169
+ /* @__PURE__ */ jsxRuntime.jsx(StackedFocusModal.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", type: "button", children: "Cancel" }) }),
11170
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "button", onClick: onSubmit, children: "Add item" })
11171
+ ] }) })
11172
+ ] }) }) });
11173
+ };
11174
+ const customItemSchema = objectType({
11175
+ title: stringType().min(1),
11176
+ quantity: numberType(),
11177
+ unit_price: unionType([numberType(), stringType()])
11178
+ });
11158
11179
  const PROMOTION_QUERY_KEY = "promotions";
11159
11180
  const promotionsQueryKeys = {
11160
11181
  list: (query2) => [
@@ -11429,9 +11450,115 @@ function getPromotionIds(items, shippingMethods) {
11429
11450
  }
11430
11451
  }
11431
11452
  }
11432
- }
11433
- return Array.from(promotionIds);
11434
- }
11453
+ }
11454
+ return Array.from(promotionIds);
11455
+ }
11456
+ const SalesChannel = () => {
11457
+ const { id } = reactRouterDom.useParams();
11458
+ const { draft_order, isPending, isError, error } = useDraftOrder(
11459
+ id,
11460
+ {
11461
+ fields: "+sales_channel_id"
11462
+ },
11463
+ {
11464
+ enabled: !!id
11465
+ }
11466
+ );
11467
+ if (isError) {
11468
+ throw error;
11469
+ }
11470
+ const ISrEADY = !!draft_order && !isPending;
11471
+ return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { children: [
11472
+ /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer.Header, { children: [
11473
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Sales Channel" }) }),
11474
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Update which sales channel the draft order is associated with" }) })
11475
+ ] }),
11476
+ ISrEADY && /* @__PURE__ */ jsxRuntime.jsx(SalesChannelForm, { order: draft_order })
11477
+ ] });
11478
+ };
11479
+ const SalesChannelForm = ({ order }) => {
11480
+ const form = reactHookForm.useForm({
11481
+ defaultValues: {
11482
+ sales_channel_id: order.sales_channel_id || ""
11483
+ },
11484
+ resolver: zod.zodResolver(schema$2)
11485
+ });
11486
+ const { mutateAsync, isPending } = useUpdateDraftOrder(order.id);
11487
+ const { handleSuccess } = useRouteModal();
11488
+ const onSubmit = form.handleSubmit(async (data) => {
11489
+ await mutateAsync(
11490
+ {
11491
+ sales_channel_id: data.sales_channel_id
11492
+ },
11493
+ {
11494
+ onSuccess: () => {
11495
+ ui.toast.success("Sales channel updated");
11496
+ handleSuccess();
11497
+ },
11498
+ onError: (error) => {
11499
+ ui.toast.error(error.message);
11500
+ }
11501
+ }
11502
+ );
11503
+ });
11504
+ return /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxRuntime.jsxs(
11505
+ KeyboundForm,
11506
+ {
11507
+ className: "flex flex-1 flex-col overflow-hidden",
11508
+ onSubmit,
11509
+ children: [
11510
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Body, { className: "flex flex-col gap-y-6 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx(SalesChannelField, { control: form.control, order }) }),
11511
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2", children: [
11512
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
11513
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "submit", isLoading: isPending, children: "Save" })
11514
+ ] }) })
11515
+ ]
11516
+ }
11517
+ ) });
11518
+ };
11519
+ const SalesChannelField = ({ control, order }) => {
11520
+ const salesChannels = useComboboxData({
11521
+ queryFn: async (params) => {
11522
+ return await sdk.admin.salesChannel.list(params);
11523
+ },
11524
+ queryKey: ["sales-channels"],
11525
+ getOptions: (data) => {
11526
+ return data.sales_channels.map((salesChannel) => ({
11527
+ label: salesChannel.name,
11528
+ value: salesChannel.id
11529
+ }));
11530
+ },
11531
+ defaultValue: order.sales_channel_id || void 0
11532
+ });
11533
+ return /* @__PURE__ */ jsxRuntime.jsx(
11534
+ Form$2.Field,
11535
+ {
11536
+ control,
11537
+ name: "sales_channel_id",
11538
+ render: ({ field }) => {
11539
+ return /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
11540
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Sales Channel" }),
11541
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
11542
+ Combobox,
11543
+ {
11544
+ options: salesChannels.options,
11545
+ fetchNextPage: salesChannels.fetchNextPage,
11546
+ isFetchingNextPage: salesChannels.isFetchingNextPage,
11547
+ searchValue: salesChannels.searchValue,
11548
+ onSearchValueChange: salesChannels.onSearchValueChange,
11549
+ placeholder: "Select sales channel",
11550
+ ...field
11551
+ }
11552
+ ) }),
11553
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
11554
+ ] });
11555
+ }
11556
+ }
11557
+ );
11558
+ };
11559
+ const schema$2 = objectType({
11560
+ sales_channel_id: stringType().min(1)
11561
+ });
11435
11562
  const STACKED_FOCUS_MODAL_ID = "shipping-form";
11436
11563
  const Shipping = () => {
11437
11564
  var _a;
@@ -12239,46 +12366,60 @@ const CustomAmountField = ({
12239
12366
  }
12240
12367
  );
12241
12368
  };
12242
- const SalesChannel = () => {
12369
+ const ShippingAddress = () => {
12243
12370
  const { id } = reactRouterDom.useParams();
12244
- const { draft_order, isPending, isError, error } = useDraftOrder(
12245
- id,
12246
- {
12247
- fields: "+sales_channel_id"
12248
- },
12249
- {
12250
- enabled: !!id
12251
- }
12252
- );
12371
+ const { order, isPending, isError, error } = useOrder(id, {
12372
+ fields: "+shipping_address"
12373
+ });
12253
12374
  if (isError) {
12254
12375
  throw error;
12255
12376
  }
12256
- const ISrEADY = !!draft_order && !isPending;
12377
+ const isReady = !isPending && !!order;
12257
12378
  return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { children: [
12258
12379
  /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer.Header, { children: [
12259
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Sales Channel" }) }),
12260
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Update which sales channel the draft order is associated with" }) })
12380
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Shipping Address" }) }),
12381
+ /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Edit the shipping address for the draft order" }) })
12261
12382
  ] }),
12262
- ISrEADY && /* @__PURE__ */ jsxRuntime.jsx(SalesChannelForm, { order: draft_order })
12383
+ isReady && /* @__PURE__ */ jsxRuntime.jsx(ShippingAddressForm, { order })
12263
12384
  ] });
12264
12385
  };
12265
- const SalesChannelForm = ({ order }) => {
12386
+ const ShippingAddressForm = ({ order }) => {
12387
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
12266
12388
  const form = reactHookForm.useForm({
12267
12389
  defaultValues: {
12268
- sales_channel_id: order.sales_channel_id || ""
12390
+ first_name: ((_a = order.shipping_address) == null ? void 0 : _a.first_name) ?? "",
12391
+ last_name: ((_b = order.shipping_address) == null ? void 0 : _b.last_name) ?? "",
12392
+ company: ((_c = order.shipping_address) == null ? void 0 : _c.company) ?? "",
12393
+ address_1: ((_d = order.shipping_address) == null ? void 0 : _d.address_1) ?? "",
12394
+ address_2: ((_e = order.shipping_address) == null ? void 0 : _e.address_2) ?? "",
12395
+ city: ((_f = order.shipping_address) == null ? void 0 : _f.city) ?? "",
12396
+ province: ((_g = order.shipping_address) == null ? void 0 : _g.province) ?? "",
12397
+ country_code: ((_h = order.shipping_address) == null ? void 0 : _h.country_code) ?? "",
12398
+ postal_code: ((_i = order.shipping_address) == null ? void 0 : _i.postal_code) ?? "",
12399
+ phone: ((_j = order.shipping_address) == null ? void 0 : _j.phone) ?? ""
12269
12400
  },
12270
- resolver: zod.zodResolver(schema$3)
12401
+ resolver: zod.zodResolver(schema$1)
12271
12402
  });
12272
12403
  const { mutateAsync, isPending } = useUpdateDraftOrder(order.id);
12273
12404
  const { handleSuccess } = useRouteModal();
12274
12405
  const onSubmit = form.handleSubmit(async (data) => {
12275
12406
  await mutateAsync(
12276
12407
  {
12277
- sales_channel_id: data.sales_channel_id
12408
+ shipping_address: {
12409
+ first_name: data.first_name,
12410
+ last_name: data.last_name,
12411
+ company: data.company,
12412
+ address_1: data.address_1,
12413
+ address_2: data.address_2,
12414
+ city: data.city,
12415
+ province: data.province,
12416
+ country_code: data.country_code,
12417
+ postal_code: data.postal_code,
12418
+ phone: data.phone
12419
+ }
12278
12420
  },
12279
12421
  {
12280
12422
  onSuccess: () => {
12281
- ui.toast.success("Sales channel updated");
12282
12423
  handleSuccess();
12283
12424
  },
12284
12425
  onError: (error) => {
@@ -12293,58 +12434,141 @@ const SalesChannelForm = ({ order }) => {
12293
12434
  className: "flex flex-1 flex-col overflow-hidden",
12294
12435
  onSubmit,
12295
12436
  children: [
12296
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Body, { className: "flex flex-col gap-y-6 overflow-y-auto", children: /* @__PURE__ */ jsxRuntime.jsx(SalesChannelField, { control: form.control, order }) }),
12437
+ /* @__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: [
12438
+ /* @__PURE__ */ jsxRuntime.jsx(
12439
+ Form$2.Field,
12440
+ {
12441
+ control: form.control,
12442
+ name: "country_code",
12443
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12444
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Country" }),
12445
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(CountrySelect, { ...field }) }),
12446
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12447
+ ] })
12448
+ }
12449
+ ),
12450
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
12451
+ /* @__PURE__ */ jsxRuntime.jsx(
12452
+ Form$2.Field,
12453
+ {
12454
+ control: form.control,
12455
+ name: "first_name",
12456
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12457
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "First name" }),
12458
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12459
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12460
+ ] })
12461
+ }
12462
+ ),
12463
+ /* @__PURE__ */ jsxRuntime.jsx(
12464
+ Form$2.Field,
12465
+ {
12466
+ control: form.control,
12467
+ name: "last_name",
12468
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12469
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Last name" }),
12470
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12471
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12472
+ ] })
12473
+ }
12474
+ )
12475
+ ] }),
12476
+ /* @__PURE__ */ jsxRuntime.jsx(
12477
+ Form$2.Field,
12478
+ {
12479
+ control: form.control,
12480
+ name: "company",
12481
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12482
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { optional: true, children: "Company" }),
12483
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12484
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12485
+ ] })
12486
+ }
12487
+ ),
12488
+ /* @__PURE__ */ jsxRuntime.jsx(
12489
+ Form$2.Field,
12490
+ {
12491
+ control: form.control,
12492
+ name: "address_1",
12493
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12494
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Address" }),
12495
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12496
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12497
+ ] })
12498
+ }
12499
+ ),
12500
+ /* @__PURE__ */ jsxRuntime.jsx(
12501
+ Form$2.Field,
12502
+ {
12503
+ control: form.control,
12504
+ name: "address_2",
12505
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12506
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { optional: true, children: "Apartment, suite, etc." }),
12507
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12508
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12509
+ ] })
12510
+ }
12511
+ ),
12512
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
12513
+ /* @__PURE__ */ jsxRuntime.jsx(
12514
+ Form$2.Field,
12515
+ {
12516
+ control: form.control,
12517
+ name: "postal_code",
12518
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12519
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Postal code" }),
12520
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12521
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12522
+ ] })
12523
+ }
12524
+ ),
12525
+ /* @__PURE__ */ jsxRuntime.jsx(
12526
+ Form$2.Field,
12527
+ {
12528
+ control: form.control,
12529
+ name: "city",
12530
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12531
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "City" }),
12532
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12533
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12534
+ ] })
12535
+ }
12536
+ )
12537
+ ] }),
12538
+ /* @__PURE__ */ jsxRuntime.jsx(
12539
+ Form$2.Field,
12540
+ {
12541
+ control: form.control,
12542
+ name: "province",
12543
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12544
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { optional: true, children: "Province / State" }),
12545
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12546
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12547
+ ] })
12548
+ }
12549
+ ),
12550
+ /* @__PURE__ */ jsxRuntime.jsx(
12551
+ Form$2.Field,
12552
+ {
12553
+ control: form.control,
12554
+ name: "phone",
12555
+ render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12556
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { optional: true, children: "Phone" }),
12557
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12558
+ /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12559
+ ] })
12560
+ }
12561
+ )
12562
+ ] }) }),
12297
12563
  /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2", children: [
12298
12564
  /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
12299
12565
  /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "submit", isLoading: isPending, children: "Save" })
12300
12566
  ] }) })
12301
12567
  ]
12302
12568
  }
12303
- ) });
12304
- };
12305
- const SalesChannelField = ({ control, order }) => {
12306
- const salesChannels = useComboboxData({
12307
- queryFn: async (params) => {
12308
- return await sdk.admin.salesChannel.list(params);
12309
- },
12310
- queryKey: ["sales-channels"],
12311
- getOptions: (data) => {
12312
- return data.sales_channels.map((salesChannel) => ({
12313
- label: salesChannel.name,
12314
- value: salesChannel.id
12315
- }));
12316
- },
12317
- defaultValue: order.sales_channel_id || void 0
12318
- });
12319
- return /* @__PURE__ */ jsxRuntime.jsx(
12320
- Form$2.Field,
12321
- {
12322
- control,
12323
- name: "sales_channel_id",
12324
- render: ({ field }) => {
12325
- return /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12326
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Sales Channel" }),
12327
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(
12328
- Combobox,
12329
- {
12330
- options: salesChannels.options,
12331
- fetchNextPage: salesChannels.fetchNextPage,
12332
- isFetchingNextPage: salesChannels.isFetchingNextPage,
12333
- searchValue: salesChannels.searchValue,
12334
- onSearchValueChange: salesChannels.onSearchValueChange,
12335
- placeholder: "Select sales channel",
12336
- ...field
12337
- }
12338
- ) }),
12339
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12340
- ] });
12341
- }
12342
- }
12343
- );
12569
+ ) });
12344
12570
  };
12345
- const schema$3 = objectType({
12346
- sales_channel_id: stringType().min(1)
12347
- });
12571
+ const schema$1 = addressSchema;
12348
12572
  const TransferOwnership = () => {
12349
12573
  const { id } = reactRouterDom.useParams();
12350
12574
  const { draft_order, isPending, isError, error } = useDraftOrder(id, {
@@ -12368,7 +12592,7 @@ const TransferOwnershipForm = ({ order }) => {
12368
12592
  defaultValues: {
12369
12593
  customer_id: order.customer_id || ""
12370
12594
  },
12371
- resolver: zod.zodResolver(schema$2)
12595
+ resolver: zod.zodResolver(schema)
12372
12596
  });
12373
12597
  const { mutateAsync, isPending } = useUpdateDraftOrder(order.id);
12374
12598
  const { handleSuccess } = useRouteModal();
@@ -12818,232 +13042,8 @@ const Illustration = () => {
12818
13042
  }
12819
13043
  );
12820
13044
  };
12821
- const schema$2 = objectType({
12822
- customer_id: stringType().min(1)
12823
- });
12824
- const ShippingAddress = () => {
12825
- const { id } = reactRouterDom.useParams();
12826
- const { order, isPending, isError, error } = useOrder(id, {
12827
- fields: "+shipping_address"
12828
- });
12829
- if (isError) {
12830
- throw error;
12831
- }
12832
- const isReady = !isPending && !!order;
12833
- return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { children: [
12834
- /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer.Header, { children: [
12835
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Shipping Address" }) }),
12836
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Description, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Edit the shipping address for the draft order" }) })
12837
- ] }),
12838
- isReady && /* @__PURE__ */ jsxRuntime.jsx(ShippingAddressForm, { order })
12839
- ] });
12840
- };
12841
- const ShippingAddressForm = ({ order }) => {
12842
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
12843
- const form = reactHookForm.useForm({
12844
- defaultValues: {
12845
- first_name: ((_a = order.shipping_address) == null ? void 0 : _a.first_name) ?? "",
12846
- last_name: ((_b = order.shipping_address) == null ? void 0 : _b.last_name) ?? "",
12847
- company: ((_c = order.shipping_address) == null ? void 0 : _c.company) ?? "",
12848
- address_1: ((_d = order.shipping_address) == null ? void 0 : _d.address_1) ?? "",
12849
- address_2: ((_e = order.shipping_address) == null ? void 0 : _e.address_2) ?? "",
12850
- city: ((_f = order.shipping_address) == null ? void 0 : _f.city) ?? "",
12851
- province: ((_g = order.shipping_address) == null ? void 0 : _g.province) ?? "",
12852
- country_code: ((_h = order.shipping_address) == null ? void 0 : _h.country_code) ?? "",
12853
- postal_code: ((_i = order.shipping_address) == null ? void 0 : _i.postal_code) ?? "",
12854
- phone: ((_j = order.shipping_address) == null ? void 0 : _j.phone) ?? ""
12855
- },
12856
- resolver: zod.zodResolver(schema$1)
12857
- });
12858
- const { mutateAsync, isPending } = useUpdateDraftOrder(order.id);
12859
- const { handleSuccess } = useRouteModal();
12860
- const onSubmit = form.handleSubmit(async (data) => {
12861
- await mutateAsync(
12862
- {
12863
- shipping_address: {
12864
- first_name: data.first_name,
12865
- last_name: data.last_name,
12866
- company: data.company,
12867
- address_1: data.address_1,
12868
- address_2: data.address_2,
12869
- city: data.city,
12870
- province: data.province,
12871
- country_code: data.country_code,
12872
- postal_code: data.postal_code,
12873
- phone: data.phone
12874
- }
12875
- },
12876
- {
12877
- onSuccess: () => {
12878
- handleSuccess();
12879
- },
12880
- onError: (error) => {
12881
- ui.toast.error(error.message);
12882
- }
12883
- }
12884
- );
12885
- });
12886
- return /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxRuntime.jsxs(
12887
- KeyboundForm,
12888
- {
12889
- className: "flex flex-1 flex-col overflow-hidden",
12890
- onSubmit,
12891
- children: [
12892
- /* @__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: [
12893
- /* @__PURE__ */ jsxRuntime.jsx(
12894
- Form$2.Field,
12895
- {
12896
- control: form.control,
12897
- name: "country_code",
12898
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12899
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Country" }),
12900
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(CountrySelect, { ...field }) }),
12901
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12902
- ] })
12903
- }
12904
- ),
12905
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
12906
- /* @__PURE__ */ jsxRuntime.jsx(
12907
- Form$2.Field,
12908
- {
12909
- control: form.control,
12910
- name: "first_name",
12911
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12912
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "First name" }),
12913
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12914
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12915
- ] })
12916
- }
12917
- ),
12918
- /* @__PURE__ */ jsxRuntime.jsx(
12919
- Form$2.Field,
12920
- {
12921
- control: form.control,
12922
- name: "last_name",
12923
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12924
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Last name" }),
12925
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12926
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12927
- ] })
12928
- }
12929
- )
12930
- ] }),
12931
- /* @__PURE__ */ jsxRuntime.jsx(
12932
- Form$2.Field,
12933
- {
12934
- control: form.control,
12935
- name: "company",
12936
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12937
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { optional: true, children: "Company" }),
12938
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12939
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12940
- ] })
12941
- }
12942
- ),
12943
- /* @__PURE__ */ jsxRuntime.jsx(
12944
- Form$2.Field,
12945
- {
12946
- control: form.control,
12947
- name: "address_1",
12948
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12949
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Address" }),
12950
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12951
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12952
- ] })
12953
- }
12954
- ),
12955
- /* @__PURE__ */ jsxRuntime.jsx(
12956
- Form$2.Field,
12957
- {
12958
- control: form.control,
12959
- name: "address_2",
12960
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12961
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { optional: true, children: "Apartment, suite, etc." }),
12962
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12963
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12964
- ] })
12965
- }
12966
- ),
12967
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
12968
- /* @__PURE__ */ jsxRuntime.jsx(
12969
- Form$2.Field,
12970
- {
12971
- control: form.control,
12972
- name: "postal_code",
12973
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12974
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "Postal code" }),
12975
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12976
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12977
- ] })
12978
- }
12979
- ),
12980
- /* @__PURE__ */ jsxRuntime.jsx(
12981
- Form$2.Field,
12982
- {
12983
- control: form.control,
12984
- name: "city",
12985
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12986
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { children: "City" }),
12987
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
12988
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
12989
- ] })
12990
- }
12991
- )
12992
- ] }),
12993
- /* @__PURE__ */ jsxRuntime.jsx(
12994
- Form$2.Field,
12995
- {
12996
- control: form.control,
12997
- name: "province",
12998
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
12999
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { optional: true, children: "Province / State" }),
13000
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
13001
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
13002
- ] })
13003
- }
13004
- ),
13005
- /* @__PURE__ */ jsxRuntime.jsx(
13006
- Form$2.Field,
13007
- {
13008
- control: form.control,
13009
- name: "phone",
13010
- render: ({ field }) => /* @__PURE__ */ jsxRuntime.jsxs(Form$2.Item, { children: [
13011
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Label, { optional: true, children: "Phone" }),
13012
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.Control, { children: /* @__PURE__ */ jsxRuntime.jsx(ui.Input, { ...field }) }),
13013
- /* @__PURE__ */ jsxRuntime.jsx(Form$2.ErrorMessage, {})
13014
- ] })
13015
- }
13016
- )
13017
- ] }) }),
13018
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2", children: [
13019
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
13020
- /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "submit", isLoading: isPending, children: "Save" })
13021
- ] }) })
13022
- ]
13023
- }
13024
- ) });
13025
- };
13026
- const schema$1 = addressSchema;
13027
- const CustomItems = () => {
13028
- return /* @__PURE__ */ jsxRuntime.jsxs(RouteDrawer, { children: [
13029
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Title, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { children: "Edit Custom Items" }) }) }),
13030
- /* @__PURE__ */ jsxRuntime.jsx(CustomItemsForm, {})
13031
- ] });
13032
- };
13033
- const CustomItemsForm = () => {
13034
- const form = reactHookForm.useForm({
13035
- resolver: zod.zodResolver(schema)
13036
- });
13037
- return /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Form, { form, children: /* @__PURE__ */ jsxRuntime.jsxs(KeyboundForm, { className: "flex flex-1 flex-col", children: [
13038
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Body, {}),
13039
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-2", children: [
13040
- /* @__PURE__ */ jsxRuntime.jsx(RouteDrawer.Close, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", variant: "secondary", children: "Cancel" }) }),
13041
- /* @__PURE__ */ jsxRuntime.jsx(ui.Button, { size: "small", type: "submit", children: "Save" })
13042
- ] }) })
13043
- ] }) });
13044
- };
13045
13045
  const schema = objectType({
13046
- email: stringType().email()
13046
+ customer_id: stringType().min(1)
13047
13047
  });
13048
13048
  const widgetModule = { widgets: [] };
13049
13049
  const routeModule = {
@@ -13066,44 +13066,44 @@ const routeModule = {
13066
13066
  loader,
13067
13067
  children: [
13068
13068
  {
13069
- Component: BillingAddress,
13070
- path: "/draft-orders/:id/billing-address"
13069
+ Component: CustomItems,
13070
+ path: "/draft-orders/:id/custom-items"
13071
13071
  },
13072
13072
  {
13073
13073
  Component: Email,
13074
13074
  path: "/draft-orders/:id/email"
13075
13075
  },
13076
13076
  {
13077
- Component: Items,
13078
- path: "/draft-orders/:id/items"
13077
+ Component: BillingAddress,
13078
+ path: "/draft-orders/:id/billing-address"
13079
13079
  },
13080
13080
  {
13081
13081
  Component: Metadata,
13082
13082
  path: "/draft-orders/:id/metadata"
13083
13083
  },
13084
13084
  {
13085
- Component: Promotions,
13086
- path: "/draft-orders/:id/promotions"
13085
+ Component: Items,
13086
+ path: "/draft-orders/:id/items"
13087
13087
  },
13088
13088
  {
13089
- Component: Shipping,
13090
- path: "/draft-orders/:id/shipping"
13089
+ Component: Promotions,
13090
+ path: "/draft-orders/:id/promotions"
13091
13091
  },
13092
13092
  {
13093
13093
  Component: SalesChannel,
13094
13094
  path: "/draft-orders/:id/sales-channel"
13095
13095
  },
13096
13096
  {
13097
- Component: TransferOwnership,
13098
- path: "/draft-orders/:id/transfer-ownership"
13097
+ Component: Shipping,
13098
+ path: "/draft-orders/:id/shipping"
13099
13099
  },
13100
13100
  {
13101
13101
  Component: ShippingAddress,
13102
13102
  path: "/draft-orders/:id/shipping-address"
13103
13103
  },
13104
13104
  {
13105
- Component: CustomItems,
13106
- path: "/draft-orders/:id/custom-items"
13105
+ Component: TransferOwnership,
13106
+ path: "/draft-orders/:id/transfer-ownership"
13107
13107
  }
13108
13108
  ]
13109
13109
  }