medusa-product-helper 0.0.20 → 0.0.21
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.
|
@@ -103,7 +103,9 @@ function coerceMetadataValue(descriptor, value) {
|
|
|
103
103
|
const num = typeof value === "number" ? value : Number(String(value).trim());
|
|
104
104
|
return isNaN(num) ? void 0 : num;
|
|
105
105
|
}
|
|
106
|
-
|
|
106
|
+
const trimmed = String(value).trim();
|
|
107
|
+
if (!trimmed) return void 0;
|
|
108
|
+
return trimmed;
|
|
107
109
|
}
|
|
108
110
|
function normalizeKey(value) {
|
|
109
111
|
return typeof value === "string" ? value.trim() || void 0 : void 0;
|
|
@@ -597,23 +599,61 @@ adminSdk.defineWidgetConfig({
|
|
|
597
599
|
const CONFIG_DOCS_URL$1 = "https://docs.medusajs.com/admin/extension-points/widgets#order-details";
|
|
598
600
|
const OrderMetadataTableWidget = ({ data }) => {
|
|
599
601
|
const { data: descriptors = [], isPending, isError } = useOrderMetadataConfig();
|
|
600
|
-
const
|
|
601
|
-
const [baselineMetadata, setBaselineMetadata] = react.useState(
|
|
602
|
+
const orderId = (data == null ? void 0 : data.id) ?? void 0;
|
|
603
|
+
const [baselineMetadata, setBaselineMetadata] = react.useState(
|
|
604
|
+
(data == null ? void 0 : data.metadata) ?? {}
|
|
605
|
+
);
|
|
602
606
|
const queryClient = reactQuery.useQueryClient();
|
|
607
|
+
const previousOrderIdRef = react.useRef(orderId);
|
|
608
|
+
const isInitializedRef = react.useRef(false);
|
|
609
|
+
const dataRef = react.useRef(data);
|
|
610
|
+
const descriptorsRef = react.useRef(descriptors);
|
|
603
611
|
react.useEffect(() => {
|
|
604
|
-
|
|
605
|
-
|
|
612
|
+
dataRef.current = data;
|
|
613
|
+
descriptorsRef.current = descriptors;
|
|
614
|
+
}, [data, descriptors]);
|
|
615
|
+
react.useEffect(() => {
|
|
616
|
+
var _a;
|
|
617
|
+
if (previousOrderIdRef.current === orderId && isInitializedRef.current) {
|
|
618
|
+
return;
|
|
619
|
+
}
|
|
620
|
+
const orderIdChanged = previousOrderIdRef.current !== orderId;
|
|
621
|
+
if (orderIdChanged || !isInitializedRef.current) {
|
|
622
|
+
const currentMetadata = (data == null ? void 0 : data.metadata) ?? ((_a = dataRef.current) == null ? void 0 : _a.metadata) ?? {};
|
|
623
|
+
const currentDescriptors = descriptorsRef.current.length > 0 ? descriptorsRef.current : descriptors;
|
|
624
|
+
if (currentDescriptors.length === 0) {
|
|
625
|
+
return;
|
|
626
|
+
}
|
|
627
|
+
previousOrderIdRef.current = orderId;
|
|
628
|
+
setBaselineMetadata(currentMetadata);
|
|
629
|
+
const newInitialState = buildInitialFormState(currentDescriptors, currentMetadata);
|
|
630
|
+
setValues(newInitialState);
|
|
631
|
+
isInitializedRef.current = true;
|
|
632
|
+
}
|
|
633
|
+
}, [orderId]);
|
|
634
|
+
const metadataStringRef = react.useRef("");
|
|
635
|
+
react.useEffect(() => {
|
|
636
|
+
const hasMetadata = (data == null ? void 0 : data.metadata) && Object.keys(data.metadata).length > 0;
|
|
637
|
+
const descriptorsLoaded = descriptors.length > 0;
|
|
638
|
+
const sameOrder = previousOrderIdRef.current === orderId;
|
|
639
|
+
const notInitialized = !isInitializedRef.current;
|
|
640
|
+
const currentMetadataString = hasMetadata ? JSON.stringify(data.metadata) : "";
|
|
641
|
+
const metadataChanged = currentMetadataString !== metadataStringRef.current;
|
|
642
|
+
if (hasMetadata && descriptorsLoaded && sameOrder && (notInitialized || metadataChanged)) {
|
|
643
|
+
const currentMetadata = data.metadata ?? {};
|
|
644
|
+
const newInitialState = buildInitialFormState(descriptors, currentMetadata);
|
|
645
|
+
setBaselineMetadata(currentMetadata);
|
|
646
|
+
setValues(newInitialState);
|
|
647
|
+
metadataStringRef.current = currentMetadataString;
|
|
648
|
+
isInitializedRef.current = true;
|
|
649
|
+
}
|
|
650
|
+
}, [data, descriptors.length, orderId]);
|
|
606
651
|
const initialState = react.useMemo(
|
|
607
652
|
() => buildInitialFormState(descriptors, baselineMetadata),
|
|
608
653
|
[descriptors, baselineMetadata]
|
|
609
654
|
);
|
|
610
|
-
const [values, setValues] = react.useState(
|
|
611
|
-
initialState
|
|
612
|
-
);
|
|
655
|
+
const [values, setValues] = react.useState({});
|
|
613
656
|
const [isSaving, setIsSaving] = react.useState(false);
|
|
614
|
-
react.useEffect(() => {
|
|
615
|
-
setValues(initialState);
|
|
616
|
-
}, [initialState]);
|
|
617
657
|
const errors = react.useMemo(() => {
|
|
618
658
|
return descriptors.reduce((acc, descriptor) => {
|
|
619
659
|
const error = validateValueForDescriptor(descriptor, values[descriptor.key]);
|
|
@@ -679,6 +719,15 @@ const OrderMetadataTableWidget = ({ data }) => {
|
|
|
679
719
|
await queryClient.invalidateQueries({
|
|
680
720
|
queryKey: ["orders"]
|
|
681
721
|
});
|
|
722
|
+
await queryClient.invalidateQueries({
|
|
723
|
+
queryKey: ["order", data.id]
|
|
724
|
+
});
|
|
725
|
+
if (data.id) {
|
|
726
|
+
queryClient.refetchQueries({
|
|
727
|
+
queryKey: ["order", data.id]
|
|
728
|
+
}).catch(() => {
|
|
729
|
+
});
|
|
730
|
+
}
|
|
682
731
|
} catch (error) {
|
|
683
732
|
ui.toast.error(error instanceof Error ? error.message : "Save failed");
|
|
684
733
|
} finally {
|
|
@@ -693,7 +742,7 @@ const OrderMetadataTableWidget = ({ data }) => {
|
|
|
693
742
|
] }),
|
|
694
743
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-subtle", children: "Structured metadata mapped to the keys you configured in the plugin options." })
|
|
695
744
|
] }),
|
|
696
|
-
isPending ? /* @__PURE__ */ jsxRuntime.jsx(ui.Skeleton, { className: "h-[160px] w-full" }) : isError ? /* @__PURE__ */ jsxRuntime.jsxs(ui.InlineTip, { variant: "error", label: "Configuration unavailable", children: [
|
|
745
|
+
isPending || !isInitializedRef.current || Object.keys(values).length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(ui.Skeleton, { className: "h-[160px] w-full" }) : isError ? /* @__PURE__ */ jsxRuntime.jsxs(ui.InlineTip, { variant: "error", label: "Configuration unavailable", children: [
|
|
697
746
|
"Unable to load metadata configuration for this plugin. Confirm that the plugin is registered with options in ",
|
|
698
747
|
/* @__PURE__ */ jsxRuntime.jsx("code", { children: "medusa-config.ts" }),
|
|
699
748
|
"."
|
|
@@ -934,23 +983,61 @@ adminSdk.defineWidgetConfig({
|
|
|
934
983
|
const CONFIG_DOCS_URL = "https://docs.medusajs.com/admin/extension-points/widgets#product-details";
|
|
935
984
|
const ProductMetadataTableWidget = ({ data }) => {
|
|
936
985
|
const { data: descriptors = [], isPending, isError } = useProductMetadataConfig();
|
|
937
|
-
const
|
|
938
|
-
const [baselineMetadata, setBaselineMetadata] = react.useState(
|
|
986
|
+
const productId = (data == null ? void 0 : data.id) ?? void 0;
|
|
987
|
+
const [baselineMetadata, setBaselineMetadata] = react.useState(
|
|
988
|
+
(data == null ? void 0 : data.metadata) ?? {}
|
|
989
|
+
);
|
|
939
990
|
const queryClient = reactQuery.useQueryClient();
|
|
991
|
+
const previousProductIdRef = react.useRef(productId);
|
|
992
|
+
const isInitializedRef = react.useRef(false);
|
|
993
|
+
const dataRef = react.useRef(data);
|
|
994
|
+
const descriptorsRef = react.useRef(descriptors);
|
|
940
995
|
react.useEffect(() => {
|
|
941
|
-
|
|
942
|
-
|
|
996
|
+
dataRef.current = data;
|
|
997
|
+
descriptorsRef.current = descriptors;
|
|
998
|
+
}, [data, descriptors]);
|
|
999
|
+
react.useEffect(() => {
|
|
1000
|
+
var _a;
|
|
1001
|
+
if (previousProductIdRef.current === productId && isInitializedRef.current) {
|
|
1002
|
+
return;
|
|
1003
|
+
}
|
|
1004
|
+
const productIdChanged = previousProductIdRef.current !== productId;
|
|
1005
|
+
if (productIdChanged || !isInitializedRef.current) {
|
|
1006
|
+
const currentMetadata = (data == null ? void 0 : data.metadata) ?? ((_a = dataRef.current) == null ? void 0 : _a.metadata) ?? {};
|
|
1007
|
+
const currentDescriptors = descriptorsRef.current.length > 0 ? descriptorsRef.current : descriptors;
|
|
1008
|
+
if (currentDescriptors.length === 0) {
|
|
1009
|
+
return;
|
|
1010
|
+
}
|
|
1011
|
+
previousProductIdRef.current = productId;
|
|
1012
|
+
setBaselineMetadata(currentMetadata);
|
|
1013
|
+
const newInitialState = buildInitialFormState(currentDescriptors, currentMetadata);
|
|
1014
|
+
setValues(newInitialState);
|
|
1015
|
+
isInitializedRef.current = true;
|
|
1016
|
+
}
|
|
1017
|
+
}, [productId]);
|
|
1018
|
+
const metadataStringRef = react.useRef("");
|
|
1019
|
+
react.useEffect(() => {
|
|
1020
|
+
const hasMetadata = (data == null ? void 0 : data.metadata) && Object.keys(data.metadata).length > 0;
|
|
1021
|
+
const descriptorsLoaded = descriptors.length > 0;
|
|
1022
|
+
const sameProduct = previousProductIdRef.current === productId;
|
|
1023
|
+
const notInitialized = !isInitializedRef.current;
|
|
1024
|
+
const currentMetadataString = hasMetadata ? JSON.stringify(data.metadata) : "";
|
|
1025
|
+
const metadataChanged = currentMetadataString !== metadataStringRef.current;
|
|
1026
|
+
if (hasMetadata && descriptorsLoaded && sameProduct && (notInitialized || metadataChanged)) {
|
|
1027
|
+
const currentMetadata = data.metadata ?? {};
|
|
1028
|
+
const newInitialState = buildInitialFormState(descriptors, currentMetadata);
|
|
1029
|
+
setBaselineMetadata(currentMetadata);
|
|
1030
|
+
setValues(newInitialState);
|
|
1031
|
+
metadataStringRef.current = currentMetadataString;
|
|
1032
|
+
isInitializedRef.current = true;
|
|
1033
|
+
}
|
|
1034
|
+
}, [data, descriptors.length, productId]);
|
|
943
1035
|
const initialState = react.useMemo(
|
|
944
1036
|
() => buildInitialFormState(descriptors, baselineMetadata),
|
|
945
1037
|
[descriptors, baselineMetadata]
|
|
946
1038
|
);
|
|
947
|
-
const [values, setValues] = react.useState(
|
|
948
|
-
initialState
|
|
949
|
-
);
|
|
1039
|
+
const [values, setValues] = react.useState({});
|
|
950
1040
|
const [isSaving, setIsSaving] = react.useState(false);
|
|
951
|
-
react.useEffect(() => {
|
|
952
|
-
setValues(initialState);
|
|
953
|
-
}, [initialState]);
|
|
954
1041
|
const errors = react.useMemo(() => {
|
|
955
1042
|
return descriptors.reduce((acc, descriptor) => {
|
|
956
1043
|
const error = validateValueForDescriptor(descriptor, values[descriptor.key]);
|
|
@@ -1016,6 +1103,15 @@ const ProductMetadataTableWidget = ({ data }) => {
|
|
|
1016
1103
|
await queryClient.invalidateQueries({
|
|
1017
1104
|
queryKey: ["products"]
|
|
1018
1105
|
});
|
|
1106
|
+
await queryClient.invalidateQueries({
|
|
1107
|
+
queryKey: ["product", data.id]
|
|
1108
|
+
});
|
|
1109
|
+
if (data.id) {
|
|
1110
|
+
queryClient.refetchQueries({
|
|
1111
|
+
queryKey: ["product", data.id]
|
|
1112
|
+
}).catch(() => {
|
|
1113
|
+
});
|
|
1114
|
+
}
|
|
1019
1115
|
} catch (error) {
|
|
1020
1116
|
ui.toast.error(error instanceof Error ? error.message : "Save failed");
|
|
1021
1117
|
} finally {
|
|
@@ -1030,7 +1126,7 @@ const ProductMetadataTableWidget = ({ data }) => {
|
|
|
1030
1126
|
] }),
|
|
1031
1127
|
/* @__PURE__ */ jsxRuntime.jsx(ui.Text, { className: "text-ui-fg-subtle", children: "Structured metadata mapped to the keys you configured in the plugin options." })
|
|
1032
1128
|
] }),
|
|
1033
|
-
isPending ? /* @__PURE__ */ jsxRuntime.jsx(ui.Skeleton, { className: "h-[160px] w-full" }) : isError ? /* @__PURE__ */ jsxRuntime.jsxs(ui.InlineTip, { variant: "error", label: "Configuration unavailable", children: [
|
|
1129
|
+
isPending || !isInitializedRef.current || Object.keys(values).length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(ui.Skeleton, { className: "h-[160px] w-full" }) : isError ? /* @__PURE__ */ jsxRuntime.jsxs(ui.InlineTip, { variant: "error", label: "Configuration unavailable", children: [
|
|
1034
1130
|
"Unable to load metadata configuration for this plugin. Confirm that the plugin is registered with options in ",
|
|
1035
1131
|
/* @__PURE__ */ jsxRuntime.jsx("code", { children: "medusa-config.ts" }),
|
|
1036
1132
|
"."
|
|
@@ -102,7 +102,9 @@ function coerceMetadataValue(descriptor, value) {
|
|
|
102
102
|
const num = typeof value === "number" ? value : Number(String(value).trim());
|
|
103
103
|
return isNaN(num) ? void 0 : num;
|
|
104
104
|
}
|
|
105
|
-
|
|
105
|
+
const trimmed = String(value).trim();
|
|
106
|
+
if (!trimmed) return void 0;
|
|
107
|
+
return trimmed;
|
|
106
108
|
}
|
|
107
109
|
function normalizeKey(value) {
|
|
108
110
|
return typeof value === "string" ? value.trim() || void 0 : void 0;
|
|
@@ -596,23 +598,61 @@ defineWidgetConfig({
|
|
|
596
598
|
const CONFIG_DOCS_URL$1 = "https://docs.medusajs.com/admin/extension-points/widgets#order-details";
|
|
597
599
|
const OrderMetadataTableWidget = ({ data }) => {
|
|
598
600
|
const { data: descriptors = [], isPending, isError } = useOrderMetadataConfig();
|
|
599
|
-
const
|
|
600
|
-
const [baselineMetadata, setBaselineMetadata] = useState(
|
|
601
|
+
const orderId = (data == null ? void 0 : data.id) ?? void 0;
|
|
602
|
+
const [baselineMetadata, setBaselineMetadata] = useState(
|
|
603
|
+
(data == null ? void 0 : data.metadata) ?? {}
|
|
604
|
+
);
|
|
601
605
|
const queryClient = useQueryClient();
|
|
606
|
+
const previousOrderIdRef = useRef(orderId);
|
|
607
|
+
const isInitializedRef = useRef(false);
|
|
608
|
+
const dataRef = useRef(data);
|
|
609
|
+
const descriptorsRef = useRef(descriptors);
|
|
602
610
|
useEffect(() => {
|
|
603
|
-
|
|
604
|
-
|
|
611
|
+
dataRef.current = data;
|
|
612
|
+
descriptorsRef.current = descriptors;
|
|
613
|
+
}, [data, descriptors]);
|
|
614
|
+
useEffect(() => {
|
|
615
|
+
var _a;
|
|
616
|
+
if (previousOrderIdRef.current === orderId && isInitializedRef.current) {
|
|
617
|
+
return;
|
|
618
|
+
}
|
|
619
|
+
const orderIdChanged = previousOrderIdRef.current !== orderId;
|
|
620
|
+
if (orderIdChanged || !isInitializedRef.current) {
|
|
621
|
+
const currentMetadata = (data == null ? void 0 : data.metadata) ?? ((_a = dataRef.current) == null ? void 0 : _a.metadata) ?? {};
|
|
622
|
+
const currentDescriptors = descriptorsRef.current.length > 0 ? descriptorsRef.current : descriptors;
|
|
623
|
+
if (currentDescriptors.length === 0) {
|
|
624
|
+
return;
|
|
625
|
+
}
|
|
626
|
+
previousOrderIdRef.current = orderId;
|
|
627
|
+
setBaselineMetadata(currentMetadata);
|
|
628
|
+
const newInitialState = buildInitialFormState(currentDescriptors, currentMetadata);
|
|
629
|
+
setValues(newInitialState);
|
|
630
|
+
isInitializedRef.current = true;
|
|
631
|
+
}
|
|
632
|
+
}, [orderId]);
|
|
633
|
+
const metadataStringRef = useRef("");
|
|
634
|
+
useEffect(() => {
|
|
635
|
+
const hasMetadata = (data == null ? void 0 : data.metadata) && Object.keys(data.metadata).length > 0;
|
|
636
|
+
const descriptorsLoaded = descriptors.length > 0;
|
|
637
|
+
const sameOrder = previousOrderIdRef.current === orderId;
|
|
638
|
+
const notInitialized = !isInitializedRef.current;
|
|
639
|
+
const currentMetadataString = hasMetadata ? JSON.stringify(data.metadata) : "";
|
|
640
|
+
const metadataChanged = currentMetadataString !== metadataStringRef.current;
|
|
641
|
+
if (hasMetadata && descriptorsLoaded && sameOrder && (notInitialized || metadataChanged)) {
|
|
642
|
+
const currentMetadata = data.metadata ?? {};
|
|
643
|
+
const newInitialState = buildInitialFormState(descriptors, currentMetadata);
|
|
644
|
+
setBaselineMetadata(currentMetadata);
|
|
645
|
+
setValues(newInitialState);
|
|
646
|
+
metadataStringRef.current = currentMetadataString;
|
|
647
|
+
isInitializedRef.current = true;
|
|
648
|
+
}
|
|
649
|
+
}, [data, descriptors.length, orderId]);
|
|
605
650
|
const initialState = useMemo(
|
|
606
651
|
() => buildInitialFormState(descriptors, baselineMetadata),
|
|
607
652
|
[descriptors, baselineMetadata]
|
|
608
653
|
);
|
|
609
|
-
const [values, setValues] = useState(
|
|
610
|
-
initialState
|
|
611
|
-
);
|
|
654
|
+
const [values, setValues] = useState({});
|
|
612
655
|
const [isSaving, setIsSaving] = useState(false);
|
|
613
|
-
useEffect(() => {
|
|
614
|
-
setValues(initialState);
|
|
615
|
-
}, [initialState]);
|
|
616
656
|
const errors = useMemo(() => {
|
|
617
657
|
return descriptors.reduce((acc, descriptor) => {
|
|
618
658
|
const error = validateValueForDescriptor(descriptor, values[descriptor.key]);
|
|
@@ -678,6 +718,15 @@ const OrderMetadataTableWidget = ({ data }) => {
|
|
|
678
718
|
await queryClient.invalidateQueries({
|
|
679
719
|
queryKey: ["orders"]
|
|
680
720
|
});
|
|
721
|
+
await queryClient.invalidateQueries({
|
|
722
|
+
queryKey: ["order", data.id]
|
|
723
|
+
});
|
|
724
|
+
if (data.id) {
|
|
725
|
+
queryClient.refetchQueries({
|
|
726
|
+
queryKey: ["order", data.id]
|
|
727
|
+
}).catch(() => {
|
|
728
|
+
});
|
|
729
|
+
}
|
|
681
730
|
} catch (error) {
|
|
682
731
|
toast.error(error instanceof Error ? error.message : "Save failed");
|
|
683
732
|
} finally {
|
|
@@ -692,7 +741,7 @@ const OrderMetadataTableWidget = ({ data }) => {
|
|
|
692
741
|
] }),
|
|
693
742
|
/* @__PURE__ */ jsx(Text, { className: "text-ui-fg-subtle", children: "Structured metadata mapped to the keys you configured in the plugin options." })
|
|
694
743
|
] }),
|
|
695
|
-
isPending ? /* @__PURE__ */ jsx(Skeleton, { className: "h-[160px] w-full" }) : isError ? /* @__PURE__ */ jsxs(InlineTip, { variant: "error", label: "Configuration unavailable", children: [
|
|
744
|
+
isPending || !isInitializedRef.current || Object.keys(values).length === 0 ? /* @__PURE__ */ jsx(Skeleton, { className: "h-[160px] w-full" }) : isError ? /* @__PURE__ */ jsxs(InlineTip, { variant: "error", label: "Configuration unavailable", children: [
|
|
696
745
|
"Unable to load metadata configuration for this plugin. Confirm that the plugin is registered with options in ",
|
|
697
746
|
/* @__PURE__ */ jsx("code", { children: "medusa-config.ts" }),
|
|
698
747
|
"."
|
|
@@ -933,23 +982,61 @@ defineWidgetConfig({
|
|
|
933
982
|
const CONFIG_DOCS_URL = "https://docs.medusajs.com/admin/extension-points/widgets#product-details";
|
|
934
983
|
const ProductMetadataTableWidget = ({ data }) => {
|
|
935
984
|
const { data: descriptors = [], isPending, isError } = useProductMetadataConfig();
|
|
936
|
-
const
|
|
937
|
-
const [baselineMetadata, setBaselineMetadata] = useState(
|
|
985
|
+
const productId = (data == null ? void 0 : data.id) ?? void 0;
|
|
986
|
+
const [baselineMetadata, setBaselineMetadata] = useState(
|
|
987
|
+
(data == null ? void 0 : data.metadata) ?? {}
|
|
988
|
+
);
|
|
938
989
|
const queryClient = useQueryClient();
|
|
990
|
+
const previousProductIdRef = useRef(productId);
|
|
991
|
+
const isInitializedRef = useRef(false);
|
|
992
|
+
const dataRef = useRef(data);
|
|
993
|
+
const descriptorsRef = useRef(descriptors);
|
|
939
994
|
useEffect(() => {
|
|
940
|
-
|
|
941
|
-
|
|
995
|
+
dataRef.current = data;
|
|
996
|
+
descriptorsRef.current = descriptors;
|
|
997
|
+
}, [data, descriptors]);
|
|
998
|
+
useEffect(() => {
|
|
999
|
+
var _a;
|
|
1000
|
+
if (previousProductIdRef.current === productId && isInitializedRef.current) {
|
|
1001
|
+
return;
|
|
1002
|
+
}
|
|
1003
|
+
const productIdChanged = previousProductIdRef.current !== productId;
|
|
1004
|
+
if (productIdChanged || !isInitializedRef.current) {
|
|
1005
|
+
const currentMetadata = (data == null ? void 0 : data.metadata) ?? ((_a = dataRef.current) == null ? void 0 : _a.metadata) ?? {};
|
|
1006
|
+
const currentDescriptors = descriptorsRef.current.length > 0 ? descriptorsRef.current : descriptors;
|
|
1007
|
+
if (currentDescriptors.length === 0) {
|
|
1008
|
+
return;
|
|
1009
|
+
}
|
|
1010
|
+
previousProductIdRef.current = productId;
|
|
1011
|
+
setBaselineMetadata(currentMetadata);
|
|
1012
|
+
const newInitialState = buildInitialFormState(currentDescriptors, currentMetadata);
|
|
1013
|
+
setValues(newInitialState);
|
|
1014
|
+
isInitializedRef.current = true;
|
|
1015
|
+
}
|
|
1016
|
+
}, [productId]);
|
|
1017
|
+
const metadataStringRef = useRef("");
|
|
1018
|
+
useEffect(() => {
|
|
1019
|
+
const hasMetadata = (data == null ? void 0 : data.metadata) && Object.keys(data.metadata).length > 0;
|
|
1020
|
+
const descriptorsLoaded = descriptors.length > 0;
|
|
1021
|
+
const sameProduct = previousProductIdRef.current === productId;
|
|
1022
|
+
const notInitialized = !isInitializedRef.current;
|
|
1023
|
+
const currentMetadataString = hasMetadata ? JSON.stringify(data.metadata) : "";
|
|
1024
|
+
const metadataChanged = currentMetadataString !== metadataStringRef.current;
|
|
1025
|
+
if (hasMetadata && descriptorsLoaded && sameProduct && (notInitialized || metadataChanged)) {
|
|
1026
|
+
const currentMetadata = data.metadata ?? {};
|
|
1027
|
+
const newInitialState = buildInitialFormState(descriptors, currentMetadata);
|
|
1028
|
+
setBaselineMetadata(currentMetadata);
|
|
1029
|
+
setValues(newInitialState);
|
|
1030
|
+
metadataStringRef.current = currentMetadataString;
|
|
1031
|
+
isInitializedRef.current = true;
|
|
1032
|
+
}
|
|
1033
|
+
}, [data, descriptors.length, productId]);
|
|
942
1034
|
const initialState = useMemo(
|
|
943
1035
|
() => buildInitialFormState(descriptors, baselineMetadata),
|
|
944
1036
|
[descriptors, baselineMetadata]
|
|
945
1037
|
);
|
|
946
|
-
const [values, setValues] = useState(
|
|
947
|
-
initialState
|
|
948
|
-
);
|
|
1038
|
+
const [values, setValues] = useState({});
|
|
949
1039
|
const [isSaving, setIsSaving] = useState(false);
|
|
950
|
-
useEffect(() => {
|
|
951
|
-
setValues(initialState);
|
|
952
|
-
}, [initialState]);
|
|
953
1040
|
const errors = useMemo(() => {
|
|
954
1041
|
return descriptors.reduce((acc, descriptor) => {
|
|
955
1042
|
const error = validateValueForDescriptor(descriptor, values[descriptor.key]);
|
|
@@ -1015,6 +1102,15 @@ const ProductMetadataTableWidget = ({ data }) => {
|
|
|
1015
1102
|
await queryClient.invalidateQueries({
|
|
1016
1103
|
queryKey: ["products"]
|
|
1017
1104
|
});
|
|
1105
|
+
await queryClient.invalidateQueries({
|
|
1106
|
+
queryKey: ["product", data.id]
|
|
1107
|
+
});
|
|
1108
|
+
if (data.id) {
|
|
1109
|
+
queryClient.refetchQueries({
|
|
1110
|
+
queryKey: ["product", data.id]
|
|
1111
|
+
}).catch(() => {
|
|
1112
|
+
});
|
|
1113
|
+
}
|
|
1018
1114
|
} catch (error) {
|
|
1019
1115
|
toast.error(error instanceof Error ? error.message : "Save failed");
|
|
1020
1116
|
} finally {
|
|
@@ -1029,7 +1125,7 @@ const ProductMetadataTableWidget = ({ data }) => {
|
|
|
1029
1125
|
] }),
|
|
1030
1126
|
/* @__PURE__ */ jsx(Text, { className: "text-ui-fg-subtle", children: "Structured metadata mapped to the keys you configured in the plugin options." })
|
|
1031
1127
|
] }),
|
|
1032
|
-
isPending ? /* @__PURE__ */ jsx(Skeleton, { className: "h-[160px] w-full" }) : isError ? /* @__PURE__ */ jsxs(InlineTip, { variant: "error", label: "Configuration unavailable", children: [
|
|
1128
|
+
isPending || !isInitializedRef.current || Object.keys(values).length === 0 ? /* @__PURE__ */ jsx(Skeleton, { className: "h-[160px] w-full" }) : isError ? /* @__PURE__ */ jsxs(InlineTip, { variant: "error", label: "Configuration unavailable", children: [
|
|
1033
1129
|
"Unable to load metadata configuration for this plugin. Confirm that the plugin is registered with options in ",
|
|
1034
1130
|
/* @__PURE__ */ jsx("code", { children: "medusa-config.ts" }),
|
|
1035
1131
|
"."
|
|
@@ -121,7 +121,11 @@ function coerceMetadataValue(descriptor, value) {
|
|
|
121
121
|
const num = typeof value === "number" ? value : Number(String(value).trim());
|
|
122
122
|
return isNaN(num) ? undefined : num;
|
|
123
123
|
}
|
|
124
|
-
|
|
124
|
+
// For text and file types, trim and check if empty
|
|
125
|
+
const trimmed = String(value).trim();
|
|
126
|
+
if (!trimmed)
|
|
127
|
+
return undefined;
|
|
128
|
+
return trimmed;
|
|
125
129
|
}
|
|
126
130
|
function normalizeKey(value) {
|
|
127
131
|
return typeof value === "string" ? value.trim() || undefined : undefined;
|
|
@@ -146,4 +150,4 @@ function isDeepEqual(a, b) {
|
|
|
146
150
|
return false;
|
|
147
151
|
return aKeys.every(key => isDeepEqual(a[key], b[key]));
|
|
148
152
|
}
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
153
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvc2hhcmVkL3Byb2R1Y3QtbWV0YWRhdGEvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFjQSxvRUF5QkM7QUFFRCw0Q0FLQztBQUVELHNEQVVDO0FBRUQsb0RBd0JDO0FBRUQsZ0RBZUM7QUFFRCxnRUF1QkM7QUE5SEQsbUNBS2dCO0FBS2hCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQW9CLDRCQUFvQixDQUFDLENBQUE7QUFDMUUsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtBQUM5RCxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO0FBRWhFLFNBQWdCLDRCQUE0QixDQUFDLEtBQWM7SUFDekQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFFcEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQTtJQUNsQyxPQUFPLEtBQUs7U0FDVCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQW1DLEVBQUUsQ0FDaEQsSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FDakM7U0FDQSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDVixNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUUsSUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQzNDLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBRSxJQUFZLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDOUMsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFFLElBQVksQ0FBQyxLQUFLLENBQUMs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
|