@tunghtml/strapi-plugin-composite-field 1.1.5 → 1.1.7
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.
|
@@ -466,6 +466,15 @@ const CompositeInput = (props) => {
|
|
|
466
466
|
onChange({ target: { name, value: newValue, type: "text" } });
|
|
467
467
|
}
|
|
468
468
|
};
|
|
469
|
+
const formatTimeValue = (value2) => {
|
|
470
|
+
if (!value2) return value2;
|
|
471
|
+
const timeRegex = /^(\d{2}):(\d{2}):(\d{2})(\.\d{3})?$/;
|
|
472
|
+
const match = value2.match(timeRegex);
|
|
473
|
+
if (match) {
|
|
474
|
+
return `${match[1]}:${match[2]}`;
|
|
475
|
+
}
|
|
476
|
+
return value2;
|
|
477
|
+
};
|
|
469
478
|
const handleGenerate = React__namespace.default.useCallback(() => {
|
|
470
479
|
const parts = [];
|
|
471
480
|
fields.forEach((fieldPath) => {
|
|
@@ -504,6 +513,7 @@ const CompositeInput = (props) => {
|
|
|
504
513
|
}
|
|
505
514
|
}
|
|
506
515
|
if (fieldValue) {
|
|
516
|
+
fieldValue = formatTimeValue(fieldValue);
|
|
507
517
|
parts.push(fieldValue);
|
|
508
518
|
}
|
|
509
519
|
});
|
|
@@ -516,29 +526,47 @@ const CompositeInput = (props) => {
|
|
|
516
526
|
}, [fields, separator, onChange, name]);
|
|
517
527
|
React__namespace.default.useEffect(() => {
|
|
518
528
|
if (!autoGenerate || fields.length === 0) return;
|
|
529
|
+
let debounceTimer;
|
|
519
530
|
const handleFieldChange = () => {
|
|
520
|
-
|
|
531
|
+
clearTimeout(debounceTimer);
|
|
532
|
+
debounceTimer = setTimeout(() => {
|
|
521
533
|
handleGenerate();
|
|
522
534
|
}, 300);
|
|
523
535
|
};
|
|
524
536
|
const listeners = [];
|
|
537
|
+
const observers = [];
|
|
525
538
|
fields.forEach((fieldPath) => {
|
|
526
539
|
const elements = document.querySelectorAll(
|
|
527
|
-
`input[name="${fieldPath}"], textarea[name="${fieldPath}"], select[name="${fieldPath}"]
|
|
540
|
+
`input[name="${fieldPath}"], textarea[name="${fieldPath}"], select[name="${fieldPath}"]`
|
|
528
541
|
);
|
|
529
542
|
elements.forEach((element) => {
|
|
530
543
|
element.addEventListener("change", handleFieldChange);
|
|
531
544
|
element.addEventListener("input", handleFieldChange);
|
|
532
|
-
element.addEventListener("click", handleFieldChange);
|
|
533
545
|
listeners.push({ element, handler: handleFieldChange });
|
|
534
546
|
});
|
|
547
|
+
const combobox = document.querySelector(
|
|
548
|
+
`div[role="combobox"][name="${fieldPath}"]`
|
|
549
|
+
);
|
|
550
|
+
if (combobox) {
|
|
551
|
+
const observer = new MutationObserver(handleFieldChange);
|
|
552
|
+
observer.observe(combobox, {
|
|
553
|
+
childList: true,
|
|
554
|
+
subtree: true,
|
|
555
|
+
characterData: true
|
|
556
|
+
});
|
|
557
|
+
observers.push(observer);
|
|
558
|
+
combobox.addEventListener("click", handleFieldChange);
|
|
559
|
+
listeners.push({ element: combobox, handler: handleFieldChange });
|
|
560
|
+
}
|
|
535
561
|
});
|
|
536
562
|
return () => {
|
|
563
|
+
clearTimeout(debounceTimer);
|
|
537
564
|
listeners.forEach(({ element, handler }) => {
|
|
538
565
|
element.removeEventListener("change", handler);
|
|
539
566
|
element.removeEventListener("input", handler);
|
|
540
567
|
element.removeEventListener("click", handler);
|
|
541
568
|
});
|
|
569
|
+
observers.forEach((observer) => observer.disconnect());
|
|
542
570
|
};
|
|
543
571
|
}, [autoGenerate, fields, handleGenerate]);
|
|
544
572
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -447,6 +447,15 @@ const CompositeInput = (props) => {
|
|
|
447
447
|
onChange({ target: { name, value: newValue, type: "text" } });
|
|
448
448
|
}
|
|
449
449
|
};
|
|
450
|
+
const formatTimeValue = (value2) => {
|
|
451
|
+
if (!value2) return value2;
|
|
452
|
+
const timeRegex = /^(\d{2}):(\d{2}):(\d{2})(\.\d{3})?$/;
|
|
453
|
+
const match = value2.match(timeRegex);
|
|
454
|
+
if (match) {
|
|
455
|
+
return `${match[1]}:${match[2]}`;
|
|
456
|
+
}
|
|
457
|
+
return value2;
|
|
458
|
+
};
|
|
450
459
|
const handleGenerate = React__default.useCallback(() => {
|
|
451
460
|
const parts = [];
|
|
452
461
|
fields.forEach((fieldPath) => {
|
|
@@ -485,6 +494,7 @@ const CompositeInput = (props) => {
|
|
|
485
494
|
}
|
|
486
495
|
}
|
|
487
496
|
if (fieldValue) {
|
|
497
|
+
fieldValue = formatTimeValue(fieldValue);
|
|
488
498
|
parts.push(fieldValue);
|
|
489
499
|
}
|
|
490
500
|
});
|
|
@@ -497,29 +507,47 @@ const CompositeInput = (props) => {
|
|
|
497
507
|
}, [fields, separator, onChange, name]);
|
|
498
508
|
React__default.useEffect(() => {
|
|
499
509
|
if (!autoGenerate || fields.length === 0) return;
|
|
510
|
+
let debounceTimer;
|
|
500
511
|
const handleFieldChange = () => {
|
|
501
|
-
|
|
512
|
+
clearTimeout(debounceTimer);
|
|
513
|
+
debounceTimer = setTimeout(() => {
|
|
502
514
|
handleGenerate();
|
|
503
515
|
}, 300);
|
|
504
516
|
};
|
|
505
517
|
const listeners = [];
|
|
518
|
+
const observers = [];
|
|
506
519
|
fields.forEach((fieldPath) => {
|
|
507
520
|
const elements = document.querySelectorAll(
|
|
508
|
-
`input[name="${fieldPath}"], textarea[name="${fieldPath}"], select[name="${fieldPath}"]
|
|
521
|
+
`input[name="${fieldPath}"], textarea[name="${fieldPath}"], select[name="${fieldPath}"]`
|
|
509
522
|
);
|
|
510
523
|
elements.forEach((element) => {
|
|
511
524
|
element.addEventListener("change", handleFieldChange);
|
|
512
525
|
element.addEventListener("input", handleFieldChange);
|
|
513
|
-
element.addEventListener("click", handleFieldChange);
|
|
514
526
|
listeners.push({ element, handler: handleFieldChange });
|
|
515
527
|
});
|
|
528
|
+
const combobox = document.querySelector(
|
|
529
|
+
`div[role="combobox"][name="${fieldPath}"]`
|
|
530
|
+
);
|
|
531
|
+
if (combobox) {
|
|
532
|
+
const observer = new MutationObserver(handleFieldChange);
|
|
533
|
+
observer.observe(combobox, {
|
|
534
|
+
childList: true,
|
|
535
|
+
subtree: true,
|
|
536
|
+
characterData: true
|
|
537
|
+
});
|
|
538
|
+
observers.push(observer);
|
|
539
|
+
combobox.addEventListener("click", handleFieldChange);
|
|
540
|
+
listeners.push({ element: combobox, handler: handleFieldChange });
|
|
541
|
+
}
|
|
516
542
|
});
|
|
517
543
|
return () => {
|
|
544
|
+
clearTimeout(debounceTimer);
|
|
518
545
|
listeners.forEach(({ element, handler }) => {
|
|
519
546
|
element.removeEventListener("change", handler);
|
|
520
547
|
element.removeEventListener("input", handler);
|
|
521
548
|
element.removeEventListener("click", handler);
|
|
522
549
|
});
|
|
550
|
+
observers.forEach((observer) => observer.disconnect());
|
|
523
551
|
};
|
|
524
552
|
}, [autoGenerate, fields, handleGenerate]);
|
|
525
553
|
return /* @__PURE__ */ jsx(
|
package/dist/admin/index.js
CHANGED
|
@@ -37,7 +37,7 @@ const index = {
|
|
|
37
37
|
defaultMessage: "Combine multiple fields into one display value"
|
|
38
38
|
},
|
|
39
39
|
components: {
|
|
40
|
-
Input: async () => Promise.resolve().then(() => require("../_chunks/CompositeInput-
|
|
40
|
+
Input: async () => Promise.resolve().then(() => require("../_chunks/CompositeInput-Bjv6XSUB.js"))
|
|
41
41
|
},
|
|
42
42
|
options: {
|
|
43
43
|
base: [
|
package/dist/admin/index.mjs
CHANGED
|
@@ -34,7 +34,7 @@ const index = {
|
|
|
34
34
|
defaultMessage: "Combine multiple fields into one display value"
|
|
35
35
|
},
|
|
36
36
|
components: {
|
|
37
|
-
Input: async () => import("../_chunks/CompositeInput-
|
|
37
|
+
Input: async () => import("../_chunks/CompositeInput-ef71gPFZ.mjs")
|
|
38
38
|
},
|
|
39
39
|
options: {
|
|
40
40
|
base: [
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tunghtml/strapi-plugin-composite-field",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.7",
|
|
4
4
|
"description": "A Strapi v5 plugin to create composite display fields by combining multiple text, string, and enum fields with auto-generate support",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"strapi",
|