@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
- setTimeout(() => {
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}"], div[role="combobox"][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
- setTimeout(() => {
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}"], div[role="combobox"][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(
@@ -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-C_wtVXHq.js"))
40
+ Input: async () => Promise.resolve().then(() => require("../_chunks/CompositeInput-Bjv6XSUB.js"))
41
41
  },
42
42
  options: {
43
43
  base: [
@@ -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-CF-LA05U.mjs")
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.5",
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",