@empty-complete-org/medusa-product-attributes 0.12.1 → 0.13.0
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.
|
@@ -235,6 +235,7 @@ const ProductAttributeValuesWidget = ({
|
|
|
235
235
|
}) => {
|
|
236
236
|
var _a, _b, _c;
|
|
237
237
|
const productId = data.id;
|
|
238
|
+
const productHandle = data.handle || productId;
|
|
238
239
|
const categoryId = ((_b = (_a = data.categories) == null ? void 0 : _a[0]) == null ? void 0 : _b.id) ?? null;
|
|
239
240
|
const qc = reactQuery.useQueryClient();
|
|
240
241
|
const [formValues, setFormValues] = react.useState({});
|
|
@@ -285,20 +286,42 @@ const ProductAttributeValuesWidget = ({
|
|
|
285
286
|
const attributesToUpdate = attributes2.filter((attr) => formValues[attr.id] !== void 0).map((attr) => ({ id: attr.id, value: formValues[attr.id] ?? "" }));
|
|
286
287
|
saveMutation.mutate({ attributes: attributesToUpdate });
|
|
287
288
|
};
|
|
288
|
-
const handleFileUpload = async (
|
|
289
|
+
const handleFileUpload = async (attr, file) => {
|
|
289
290
|
var _a2, _b2;
|
|
291
|
+
const attrId = attr.id;
|
|
290
292
|
setUploadingId(attrId);
|
|
291
293
|
try {
|
|
294
|
+
const dot = file.name.lastIndexOf(".");
|
|
295
|
+
const ext = dot > -1 ? file.name.slice(dot) : "";
|
|
296
|
+
const renamed = new File(
|
|
297
|
+
[file],
|
|
298
|
+
`${productHandle}_${attr.key}${ext}`,
|
|
299
|
+
{ type: file.type }
|
|
300
|
+
);
|
|
292
301
|
const formData = new FormData();
|
|
293
|
-
formData.append("files",
|
|
294
|
-
const
|
|
302
|
+
formData.append("files", renamed);
|
|
303
|
+
const response = await fetch(`/admin/uploads`, {
|
|
295
304
|
method: "POST",
|
|
305
|
+
credentials: "include",
|
|
296
306
|
body: formData
|
|
297
307
|
});
|
|
308
|
+
if (!response.ok) {
|
|
309
|
+
const text = await response.text();
|
|
310
|
+
console.error("Upload failed", response.status, text);
|
|
311
|
+
alert(`Ошибка загрузки файла: ${response.status}`);
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
const res = await response.json();
|
|
298
315
|
const url = (_b2 = (_a2 = res == null ? void 0 : res.files) == null ? void 0 : _a2[0]) == null ? void 0 : _b2.url;
|
|
299
316
|
if (url) {
|
|
300
317
|
setFormValues((prev) => ({ ...prev, [attrId]: url }));
|
|
318
|
+
} else {
|
|
319
|
+
console.error("No URL in upload response", res);
|
|
320
|
+
alert("Файл загружен, но URL не получен");
|
|
301
321
|
}
|
|
322
|
+
} catch (err) {
|
|
323
|
+
console.error("Upload error", err);
|
|
324
|
+
alert("Ошибка загрузки файла");
|
|
302
325
|
} finally {
|
|
303
326
|
setUploadingId(null);
|
|
304
327
|
}
|
|
@@ -354,7 +377,7 @@ const ProductAttributeValuesWidget = ({
|
|
|
354
377
|
onChange: (e) => {
|
|
355
378
|
var _a2;
|
|
356
379
|
const f = (_a2 = e.target.files) == null ? void 0 : _a2[0];
|
|
357
|
-
if (f) handleFileUpload(attr
|
|
380
|
+
if (f) handleFileUpload(attr, f);
|
|
358
381
|
}
|
|
359
382
|
}
|
|
360
383
|
),
|
|
@@ -232,6 +232,7 @@ const ProductAttributeValuesWidget = ({
|
|
|
232
232
|
}) => {
|
|
233
233
|
var _a, _b, _c;
|
|
234
234
|
const productId = data.id;
|
|
235
|
+
const productHandle = data.handle || productId;
|
|
235
236
|
const categoryId = ((_b = (_a = data.categories) == null ? void 0 : _a[0]) == null ? void 0 : _b.id) ?? null;
|
|
236
237
|
const qc = useQueryClient();
|
|
237
238
|
const [formValues, setFormValues] = useState({});
|
|
@@ -282,20 +283,42 @@ const ProductAttributeValuesWidget = ({
|
|
|
282
283
|
const attributesToUpdate = attributes2.filter((attr) => formValues[attr.id] !== void 0).map((attr) => ({ id: attr.id, value: formValues[attr.id] ?? "" }));
|
|
283
284
|
saveMutation.mutate({ attributes: attributesToUpdate });
|
|
284
285
|
};
|
|
285
|
-
const handleFileUpload = async (
|
|
286
|
+
const handleFileUpload = async (attr, file) => {
|
|
286
287
|
var _a2, _b2;
|
|
288
|
+
const attrId = attr.id;
|
|
287
289
|
setUploadingId(attrId);
|
|
288
290
|
try {
|
|
291
|
+
const dot = file.name.lastIndexOf(".");
|
|
292
|
+
const ext = dot > -1 ? file.name.slice(dot) : "";
|
|
293
|
+
const renamed = new File(
|
|
294
|
+
[file],
|
|
295
|
+
`${productHandle}_${attr.key}${ext}`,
|
|
296
|
+
{ type: file.type }
|
|
297
|
+
);
|
|
289
298
|
const formData = new FormData();
|
|
290
|
-
formData.append("files",
|
|
291
|
-
const
|
|
299
|
+
formData.append("files", renamed);
|
|
300
|
+
const response = await fetch(`/admin/uploads`, {
|
|
292
301
|
method: "POST",
|
|
302
|
+
credentials: "include",
|
|
293
303
|
body: formData
|
|
294
304
|
});
|
|
305
|
+
if (!response.ok) {
|
|
306
|
+
const text = await response.text();
|
|
307
|
+
console.error("Upload failed", response.status, text);
|
|
308
|
+
alert(`Ошибка загрузки файла: ${response.status}`);
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
const res = await response.json();
|
|
295
312
|
const url = (_b2 = (_a2 = res == null ? void 0 : res.files) == null ? void 0 : _a2[0]) == null ? void 0 : _b2.url;
|
|
296
313
|
if (url) {
|
|
297
314
|
setFormValues((prev) => ({ ...prev, [attrId]: url }));
|
|
315
|
+
} else {
|
|
316
|
+
console.error("No URL in upload response", res);
|
|
317
|
+
alert("Файл загружен, но URL не получен");
|
|
298
318
|
}
|
|
319
|
+
} catch (err) {
|
|
320
|
+
console.error("Upload error", err);
|
|
321
|
+
alert("Ошибка загрузки файла");
|
|
299
322
|
} finally {
|
|
300
323
|
setUploadingId(null);
|
|
301
324
|
}
|
|
@@ -351,7 +374,7 @@ const ProductAttributeValuesWidget = ({
|
|
|
351
374
|
onChange: (e) => {
|
|
352
375
|
var _a2;
|
|
353
376
|
const f = (_a2 = e.target.files) == null ? void 0 : _a2[0];
|
|
354
|
-
if (f) handleFileUpload(attr
|
|
377
|
+
if (f) handleFileUpload(attr, f);
|
|
355
378
|
}
|
|
356
379
|
}
|
|
357
380
|
),
|
|
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
+
const transliteration_1 = require("transliteration");
|
|
7
8
|
const category_custom_attribute_1 = __importDefault(require("./models/category-custom-attribute"));
|
|
8
9
|
const product_custom_attribute_1 = __importDefault(require("./models/product-custom-attribute"));
|
|
9
10
|
const models = {
|
|
@@ -74,10 +75,7 @@ class CustomAttributeService extends (0, utils_1.MedusaService)(models) {
|
|
|
74
75
|
});
|
|
75
76
|
}
|
|
76
77
|
generateKey(label) {
|
|
77
|
-
return label
|
|
78
|
-
.toLowerCase()
|
|
79
|
-
.replace(/[^a-z0-9]+/g, "_")
|
|
80
|
-
.replace(/^_|_$/g, "");
|
|
78
|
+
return (0, transliteration_1.slugify)(label, { separator: "_", lowercase: true }) || "attr";
|
|
81
79
|
}
|
|
82
80
|
}
|
|
83
81
|
exports.default = CustomAttributeService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../../src/modules/product-attributes/service.ts"],"names":[],"mappings":";;;;;AAAA,qDAAyD;AACzD,mGAAwE;AACxE,iGAAsE;AAEtE,MAAM,MAAM,GAAG;IACb,uBAAuB,EAAvB,mCAAuB;IACvB,sBAAsB,EAAtB,kCAAsB;CACvB,CAAA;AAID,2EAA2E;AAC3E,MAAM,sBAAuB,SAAQ,IAAA,qBAAa,EAAC,MAAM,CAAC;IACxD,KAAK,CAAC,qBAAqB,CAAC,UAAkB;QAC5C,iDAAiD;QACjD,OAAO,MAAM,IAAI,CAAC,4BAA4B,CAAC;YAC7C,WAAW,EAAE,UAAU;YACvB,UAAU,EAAE,IAAI;SACjB,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,0BAA0B,CAAC,WAAqB;QACpD,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7C,OAAO,EAAE,CAAA;QACX,CAAC;QACD,iDAAiD;QACjD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC;YACzD,WAAW,EAAE,WAAW;YACxB,UAAU,EAAE,IAAI;SACjB,CAAC,CAAA;QACF,wEAAwE;QACxE,iDAAiD;QACjD,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;QAC7B,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC;YACpC,GAAG,IAAI;YACP,SAAS,EAAE,IAAI,CAAC,WAAW,KAAK,MAAM;YACtC,kBAAkB,EAAE,IAAI,CAAC,WAAW;SACrC,CAAC,CAAC,CAAA;IACL,CAAC;IAED,KAAK,CAAC,uBAAuB,CAAC,IAO7B;QACC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACxC,iDAAiD;QACjD,OAAO,MAAM,IAAI,CAAC,8BAA8B,CAAC;YAC/C,GAAG,IAAI;YACP,GAAG;YACH,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,KAAK;YACtC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC;SACjC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,uBAAuB,CAC3B,EAAU,EACV,IAMC;QAED,MAAM,UAAU,GAAwB,EAAE,GAAG,IAAI,EAAE,CAAA;QACnD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC/C,CAAC;QACD,iDAAiD;QACjD,OAAO,MAAM,IAAI,CAAC,8BAA8B,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAA;IAC3E,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,IAM5B;QACC,iDAAiD;QACjD,OAAO,MAAM,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAA;IACvD,CAAC;IAED,KAAK,CAAC,sBAAsB,CAC1B,EAAU,EACV,IAKC;QAED,iDAAiD;QACjD,OAAO,MAAM,IAAI,CAAC,6BAA6B,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAA;IACpE,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,SAAiB;QAC1C,iDAAiD;QACjD,OAAO,MAAM,IAAI,CAAC,2BAA2B,CAAC;YAC5C,UAAU,EAAE,SAAS;YACrB,UAAU,EAAE,IAAI;SACjB,EAAE;YACD,SAAS,EAAE,CAAC,2BAA2B,CAAC;SACzC,CAAC,CAAA;IACJ,CAAC;IAEO,WAAW,CAAC,KAAa;QAC/B,OAAO,KAAK
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../../src/modules/product-attributes/service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@empty-complete-org/medusa-product-attributes",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "Custom attributes module for Medusa v2 with support for text, number, file types and units of measurement",
|
|
5
5
|
"author": "empty-complete",
|
|
6
6
|
"license": "MIT",
|
|
@@ -82,5 +82,8 @@
|
|
|
82
82
|
},
|
|
83
83
|
"publishConfig": {
|
|
84
84
|
"registry": "https://registry.npmjs.org"
|
|
85
|
+
},
|
|
86
|
+
"dependencies": {
|
|
87
|
+
"transliteration": "^2.6.1"
|
|
85
88
|
}
|
|
86
|
-
}
|
|
89
|
+
}
|