@tunghtml/strapi-plugin-composite-field 1.1.5 → 1.1.6

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.
@@ -516,29 +516,47 @@ const CompositeInput = (props) => {
516
516
  }, [fields, separator, onChange, name]);
517
517
  React__namespace.default.useEffect(() => {
518
518
  if (!autoGenerate || fields.length === 0) return;
519
+ let debounceTimer;
519
520
  const handleFieldChange = () => {
520
- setTimeout(() => {
521
+ clearTimeout(debounceTimer);
522
+ debounceTimer = setTimeout(() => {
521
523
  handleGenerate();
522
524
  }, 300);
523
525
  };
524
526
  const listeners = [];
527
+ const observers = [];
525
528
  fields.forEach((fieldPath) => {
526
529
  const elements = document.querySelectorAll(
527
- `input[name="${fieldPath}"], textarea[name="${fieldPath}"], select[name="${fieldPath}"], div[role="combobox"][name="${fieldPath}"]`
530
+ `input[name="${fieldPath}"], textarea[name="${fieldPath}"], select[name="${fieldPath}"]`
528
531
  );
529
532
  elements.forEach((element) => {
530
533
  element.addEventListener("change", handleFieldChange);
531
534
  element.addEventListener("input", handleFieldChange);
532
- element.addEventListener("click", handleFieldChange);
533
535
  listeners.push({ element, handler: handleFieldChange });
534
536
  });
537
+ const combobox = document.querySelector(
538
+ `div[role="combobox"][name="${fieldPath}"]`
539
+ );
540
+ if (combobox) {
541
+ const observer = new MutationObserver(handleFieldChange);
542
+ observer.observe(combobox, {
543
+ childList: true,
544
+ subtree: true,
545
+ characterData: true
546
+ });
547
+ observers.push(observer);
548
+ combobox.addEventListener("click", handleFieldChange);
549
+ listeners.push({ element: combobox, handler: handleFieldChange });
550
+ }
535
551
  });
536
552
  return () => {
553
+ clearTimeout(debounceTimer);
537
554
  listeners.forEach(({ element, handler }) => {
538
555
  element.removeEventListener("change", handler);
539
556
  element.removeEventListener("input", handler);
540
557
  element.removeEventListener("click", handler);
541
558
  });
559
+ observers.forEach((observer) => observer.disconnect());
542
560
  };
543
561
  }, [autoGenerate, fields, handleGenerate]);
544
562
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -497,29 +497,47 @@ const CompositeInput = (props) => {
497
497
  }, [fields, separator, onChange, name]);
498
498
  React__default.useEffect(() => {
499
499
  if (!autoGenerate || fields.length === 0) return;
500
+ let debounceTimer;
500
501
  const handleFieldChange = () => {
501
- setTimeout(() => {
502
+ clearTimeout(debounceTimer);
503
+ debounceTimer = setTimeout(() => {
502
504
  handleGenerate();
503
505
  }, 300);
504
506
  };
505
507
  const listeners = [];
508
+ const observers = [];
506
509
  fields.forEach((fieldPath) => {
507
510
  const elements = document.querySelectorAll(
508
- `input[name="${fieldPath}"], textarea[name="${fieldPath}"], select[name="${fieldPath}"], div[role="combobox"][name="${fieldPath}"]`
511
+ `input[name="${fieldPath}"], textarea[name="${fieldPath}"], select[name="${fieldPath}"]`
509
512
  );
510
513
  elements.forEach((element) => {
511
514
  element.addEventListener("change", handleFieldChange);
512
515
  element.addEventListener("input", handleFieldChange);
513
- element.addEventListener("click", handleFieldChange);
514
516
  listeners.push({ element, handler: handleFieldChange });
515
517
  });
518
+ const combobox = document.querySelector(
519
+ `div[role="combobox"][name="${fieldPath}"]`
520
+ );
521
+ if (combobox) {
522
+ const observer = new MutationObserver(handleFieldChange);
523
+ observer.observe(combobox, {
524
+ childList: true,
525
+ subtree: true,
526
+ characterData: true
527
+ });
528
+ observers.push(observer);
529
+ combobox.addEventListener("click", handleFieldChange);
530
+ listeners.push({ element: combobox, handler: handleFieldChange });
531
+ }
516
532
  });
517
533
  return () => {
534
+ clearTimeout(debounceTimer);
518
535
  listeners.forEach(({ element, handler }) => {
519
536
  element.removeEventListener("change", handler);
520
537
  element.removeEventListener("input", handler);
521
538
  element.removeEventListener("click", handler);
522
539
  });
540
+ observers.forEach((observer) => observer.disconnect());
523
541
  };
524
542
  }, [autoGenerate, fields, handleGenerate]);
525
543
  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-BhDBr5rx.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-DLjmxeUG.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.6",
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",