formeo 4.2.3 → 4.2.5

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.
Binary file
@@ -1,7 +1,7 @@
1
1
 
2
2
  /**
3
3
  formeo - https://formeo.io
4
- Version: 4.2.2
4
+ Version: 4.2.4
5
5
  Author: Draggable https://draggable.io
6
6
  */
7
7
 
@@ -433,7 +433,7 @@ if (window !== void 0) {
433
433
  window.SmartTooltip = SmartTooltip;
434
434
  }
435
435
  const name$1 = "formeo";
436
- const version$2 = "4.2.2";
436
+ const version$2 = "4.2.4";
437
437
  const pkg = {
438
438
  name: name$1,
439
439
  version: version$2
@@ -5843,6 +5843,12 @@ const iconFontTemplates = {
5843
5843
  fontello: (icon) => `<i class="${iconPrefix}${icon}">${icon}</i>`
5844
5844
  };
5845
5845
  const inputTags = /* @__PURE__ */ new Set(["input", "textarea", "select"]);
5846
+ const stripOn = (str) => str.replace(/^on([A-Z])/, (_, l) => l.toLowerCase());
5847
+ const useCaptureEvts = /* @__PURE__ */ new Set(["focus", "blur"]);
5848
+ const defaultActionHandler = (event) => {
5849
+ const eventName = stripOn(event);
5850
+ return (node, cb) => node.addEventListener(eventName, cb, useCaptureEvts.has(eventName));
5851
+ };
5846
5852
  const getName = (elem = {}) => {
5847
5853
  let name2 = elem?.attrs?.name || elem?.name;
5848
5854
  if (name2) {
@@ -6048,12 +6054,10 @@ class DOM {
6048
6054
  onRender: dom.onRender,
6049
6055
  render: dom.onRender
6050
6056
  };
6051
- const useCaptureEvts = ["focus", "blur"];
6052
- const defaultHandler = (event) => (node2, cb) => node2.addEventListener(event, cb, useCaptureEvts.includes(event));
6053
6057
  return Object.entries(actions2).map(([event, cb]) => {
6054
6058
  const cbs = Array.isArray(cb) ? cb : [cb];
6055
6059
  return cbs.map((cb2) => {
6056
- const action = handlers[event] || defaultHandler(event);
6060
+ const action = handlers[event] || defaultActionHandler(event);
6057
6061
  return action(node, cb2);
6058
6062
  });
6059
6063
  });
@@ -9147,6 +9151,7 @@ class Column extends Component {
9147
9151
  Sortable.create(childWrap, {
9148
9152
  animation: 150,
9149
9153
  fallbackClass: "field-moving",
9154
+ forceFallback: true,
9150
9155
  group: {
9151
9156
  name: "column",
9152
9157
  pull: true,
@@ -9252,6 +9257,7 @@ class Row extends Component {
9252
9257
  Sortable.create(children, {
9253
9258
  animation: 150,
9254
9259
  fallbackClass: "column-moving",
9260
+ forceFallback: true,
9255
9261
  group: {
9256
9262
  name: "row",
9257
9263
  pull: true,
@@ -9947,30 +9953,37 @@ let Controls$1 = class Controls {
9947
9953
  for (let i2 = groups.length - 1; i2 >= 0; i2--) {
9948
9954
  const storeID = `formeo-controls-${groups[i2]}`;
9949
9955
  if (!this.options.sortable) {
9950
- window.localStorage.removeItem(storeID);
9956
+ globalThis.localStorage.removeItem(storeID);
9951
9957
  }
9952
9958
  Sortable.create(groups[i2], {
9953
9959
  animation: 150,
9954
- forceFallback: true,
9955
9960
  fallbackClass: "control-moving",
9956
9961
  fallbackOnBody: true,
9962
+ forceFallback: true,
9963
+ fallbackTolerance: 5,
9957
9964
  group: {
9958
9965
  name: "controls",
9959
9966
  pull: "clone",
9960
- put: false
9967
+ put: false,
9968
+ revertClone: true
9961
9969
  },
9962
- onStart: async ({ item }) => {
9963
- const { controlData } = this.get(item.id);
9970
+ onClone: ({ clone: clone2, item }) => {
9971
+ clone2.id = item.id;
9964
9972
  if (this.options.ghostPreview) {
9965
- const { default: Field2 } = await Promise.resolve().then(() => field);
9966
- item.innerHTML = "";
9967
- item.appendChild(new Field2(controlData).preview);
9973
+ const { controlData } = this.get(item.id);
9974
+ Promise.resolve().then(() => field).then(({ default: Field2 }) => {
9975
+ clone2.innerHTML = "";
9976
+ clone2.appendChild(new Field2(controlData).preview);
9977
+ });
9968
9978
  }
9969
9979
  },
9970
- onEnd: ({ from, item, clone: clone2 }) => {
9971
- if (from.contains(clone2)) {
9972
- from.replaceChild(item, clone2);
9973
- }
9980
+ onStart: () => {
9981
+ this.originalDocumentOverflow = document.documentElement.style.overflow;
9982
+ document.documentElement.style.overflow = "hidden";
9983
+ },
9984
+ onEnd: () => {
9985
+ document.documentElement.style.overflow = this.originalDocumentOverflow;
9986
+ this.originalDocumentOverflow = null;
9974
9987
  },
9975
9988
  sort: this.options.sortable,
9976
9989
  store: {
@@ -9980,7 +9993,7 @@ let Controls$1 = class Controls {
9980
9993
  * @return {Array}
9981
9994
  */
9982
9995
  get: () => {
9983
- const order = window.localStorage.getItem(storeID);
9996
+ const order = globalThis.localStorage.getItem(storeID);
9984
9997
  return order ? order.split("|") : [];
9985
9998
  },
9986
9999
  /**
@@ -9989,7 +10002,7 @@ let Controls$1 = class Controls {
9989
10002
  */
9990
10003
  set: (sortable) => {
9991
10004
  const order = sortable.toArray();
9992
- window.localStorage.setItem(storeID, order.join("|"));
10005
+ globalThis.localStorage.setItem(storeID, order.join("|"));
9993
10006
  }
9994
10007
  }
9995
10008
  });
@@ -10847,7 +10860,7 @@ const processOptions = ({ editorContainer, renderContainer, formData, ...opts })
10847
10860
  };
10848
10861
  const baseId = (id) => {
10849
10862
  const match2 = id.match(UUID_REGEXP);
10850
- return match2?.[0] || id``;
10863
+ return match2?.[0] || id;
10851
10864
  };
10852
10865
  const isVisible = (elem) => {
10853
10866
  if (!elem) return false;
@@ -10932,12 +10945,13 @@ const targetPropertyMap = {
10932
10945
  };
10933
10946
  let FormeoRenderer$1 = class FormeoRenderer {
10934
10947
  constructor(opts, formDataArg) {
10935
- const { renderContainer, elements, formData } = processOptions(opts);
10936
- this.container = renderContainer;
10948
+ const { renderContainer: container, elements, formData, config } = processOptions(opts);
10949
+ this.container = container;
10937
10950
  this.form = cleanFormData(formDataArg || formData);
10938
- this.dom = dom;
10939
- this.components = /* @__PURE__ */ Object.create(null);
10940
10951
  this.elements = elements;
10952
+ this.config = config;
10953
+ this.components = /* @__PURE__ */ Object.create(null);
10954
+ this.dom = dom;
10941
10955
  }
10942
10956
  get formData() {
10943
10957
  return this.form;
@@ -10945,10 +10959,30 @@ let FormeoRenderer$1 = class FormeoRenderer {
10945
10959
  set formData(data) {
10946
10960
  this.form = cleanFormData(data);
10947
10961
  }
10962
+ /**
10963
+ * Gets the user data from the rendered form as a plain object.
10964
+ * Converts FormData to an object, handling multiple values for the same key
10965
+ * by converting them into arrays.
10966
+ *
10967
+ * @returns {Object.<string, string|string[]>} An object containing form field names as keys
10968
+ * and their values. Fields with multiple values are stored as arrays.
10969
+ *
10970
+ * @example
10971
+ * // Form with single values
10972
+ * { username: 'john', email: 'john@example.com' }
10973
+ *
10974
+ * @example
10975
+ * // Form with multiple values for same key
10976
+ * { username: 'john', hobbies: ['reading', 'gaming'] }
10977
+ */
10948
10978
  get userData() {
10949
- const userData = new FormData(this.renderedForm);
10979
+ const form = this.container.querySelector(".formeo-render") || this.renderedForm;
10980
+ if (!form) {
10981
+ return {};
10982
+ }
10983
+ const formEntries = new FormData(form);
10950
10984
  const formDataObj = {};
10951
- for (const [key, value] of userData.entries()) {
10985
+ for (const [key, value] of formEntries.entries()) {
10952
10986
  if (formDataObj[key]) {
10953
10987
  if (Array.isArray(formDataObj[key])) {
10954
10988
  formDataObj[key].push(value);
@@ -10961,6 +10995,27 @@ let FormeoRenderer$1 = class FormeoRenderer {
10961
10995
  }
10962
10996
  return formDataObj;
10963
10997
  }
10998
+ /**
10999
+ * Gets the user form data as an array of field objects.
11000
+ * Combines user input values with component metadata to create structured field data.
11001
+ *
11002
+ * @returns {Array<{key: string, value: any, label: string}>} An array of field data objects, where each object contains:
11003
+ * - key: The field identifier
11004
+ * - value: The user's input value for the field
11005
+ * - label: The field's label from component configuration (empty string if not found)
11006
+ */
11007
+ get userFormData() {
11008
+ const userFormData = [];
11009
+ for (const [key, value] of Object.entries(this.userData)) {
11010
+ const fieldData = {
11011
+ key,
11012
+ value,
11013
+ label: this.components[baseId(key)]?.config?.label || ""
11014
+ };
11015
+ userFormData.push(fieldData);
11016
+ }
11017
+ return userFormData;
11018
+ }
10964
11019
  set userData(data = {}) {
10965
11020
  const form = this.container.querySelector("form");
10966
11021
  for (const key of Object.keys(data)) {
@@ -10984,6 +11039,7 @@ let FormeoRenderer$1 = class FormeoRenderer {
10984
11039
  * @param {Object} formData
10985
11040
  */
10986
11041
  render(formData = this.form) {
11042
+ this.form = cleanFormData(formData);
10987
11043
  const renderedForm = this.getRenderedForm(formData);
10988
11044
  const existingRenderedForm = this.container.querySelector(".formeo-render");
10989
11045
  if (existingRenderedForm) {
@@ -10996,6 +11052,7 @@ let FormeoRenderer$1 = class FormeoRenderer {
10996
11052
  this.form = cleanFormData(formData);
10997
11053
  const renderCount = document.getElementsByClassName("formeo-render").length;
10998
11054
  const config = {
11055
+ ...this.config,
10999
11056
  tag: "form",
11000
11057
  id: this.form.id,
11001
11058
  className: `formeo-render formeo formeo-rendered-${renderCount}`,
@@ -11021,11 +11078,9 @@ let FormeoRenderer$1 = class FormeoRenderer {
11021
11078
  */
11022
11079
  processColumn = ({ id, ...columnData }) => ({
11023
11080
  ...columnData,
11024
- ...{
11025
- id: this.prefixId(id),
11026
- children: this.processFields(columnData.children),
11027
- style: `width: ${columnData.config.width || "100%"}`
11028
- }
11081
+ id: this.prefixId(id),
11082
+ children: this.processFields(columnData.children),
11083
+ style: `width: ${columnData.config.width || "100%"}`
11029
11084
  });
11030
11085
  processRows = (stageId) => this.orderChildren("rows", this.form.stages[stageId].children).reduce((acc, row) => {
11031
11086
  if (row) {
@@ -11068,11 +11123,16 @@ let FormeoRenderer$1 = class FormeoRenderer {
11068
11123
  };
11069
11124
  };
11070
11125
  cloneComponentData = (componentId) => {
11071
- const { children = [], id, ...rest } = this.components[componentId];
11126
+ const { children = [], id, attrs = {}, ...rest } = this.components[componentId];
11127
+ const updatedAttrs = { ...attrs, "data-clone-of": id };
11128
+ if (rest.tag === "input") {
11129
+ updatedAttrs.name = getName(this.components[componentId]);
11130
+ }
11072
11131
  return {
11073
11132
  ...rest,
11074
- id: uuid(id),
11075
- children: children?.length && children.map(({ id: id2 }) => this.cloneComponentData(baseId(id2)))
11133
+ id: RENDER_PREFIX + uuid(id),
11134
+ children: children?.length && children.map(({ id: id2 }) => this.cloneComponentData(baseId(id2))),
11135
+ attrs: updatedAttrs
11076
11136
  };
11077
11137
  };
11078
11138
  addButton = (id) => ({
@@ -11220,12 +11280,12 @@ let FormeoRenderer$1 = class FormeoRenderer {
11220
11280
  return components2;
11221
11281
  };
11222
11282
  };
11283
+ const listenTypeMap = [
11284
+ ["input", (c) => ["textarea", "text"].includes(c.type)],
11285
+ ["change", (c) => ["select"].includes(c.tagName.toLowerCase()) || ["checkbox", "radio"].includes(c.type)]
11286
+ ];
11223
11287
  const LISTEN_TYPE_MAP = (component) => {
11224
- const typesMap = [
11225
- ["input", (c) => ["textarea", "text"].includes(c.type)],
11226
- ["change", (c) => ["select"].includes(c.tagName.toLowerCase()) || ["checkbox", "radio"].includes(c.type)]
11227
- ];
11228
- const [listenerEvent] = typesMap.find((typeMap) => typeMap[1](component)) || [false];
11288
+ const [listenerEvent] = listenTypeMap.find((typeMap) => typeMap[1](component)) || [false];
11229
11289
  return listenerEvent;
11230
11290
  };
11231
11291
  if (window !== void 0) {
@@ -1,7 +1,7 @@
1
1
 
2
2
  /**
3
3
  formeo - https://formeo.io
4
- Version: 4.2.2
4
+ Version: 4.2.4
5
5
  Author: Draggable https://draggable.io
6
6
  */
7
7
 
@@ -431,7 +431,7 @@ if (window !== void 0) {
431
431
  window.SmartTooltip = SmartTooltip;
432
432
  }
433
433
  const name$1 = "formeo";
434
- const version$2 = "4.2.2";
434
+ const version$2 = "4.2.4";
435
435
  const pkg = {
436
436
  name: name$1,
437
437
  version: version$2
@@ -5841,6 +5841,12 @@ const iconFontTemplates = {
5841
5841
  fontello: (icon) => `<i class="${iconPrefix}${icon}">${icon}</i>`
5842
5842
  };
5843
5843
  const inputTags = /* @__PURE__ */ new Set(["input", "textarea", "select"]);
5844
+ const stripOn = (str) => str.replace(/^on([A-Z])/, (_, l) => l.toLowerCase());
5845
+ const useCaptureEvts = /* @__PURE__ */ new Set(["focus", "blur"]);
5846
+ const defaultActionHandler = (event) => {
5847
+ const eventName = stripOn(event);
5848
+ return (node, cb) => node.addEventListener(eventName, cb, useCaptureEvts.has(eventName));
5849
+ };
5844
5850
  const getName = (elem = {}) => {
5845
5851
  let name2 = elem?.attrs?.name || elem?.name;
5846
5852
  if (name2) {
@@ -6046,12 +6052,10 @@ class DOM {
6046
6052
  onRender: dom.onRender,
6047
6053
  render: dom.onRender
6048
6054
  };
6049
- const useCaptureEvts = ["focus", "blur"];
6050
- const defaultHandler = (event) => (node2, cb) => node2.addEventListener(event, cb, useCaptureEvts.includes(event));
6051
6055
  return Object.entries(actions2).map(([event, cb]) => {
6052
6056
  const cbs = Array.isArray(cb) ? cb : [cb];
6053
6057
  return cbs.map((cb2) => {
6054
- const action = handlers[event] || defaultHandler(event);
6058
+ const action = handlers[event] || defaultActionHandler(event);
6055
6059
  return action(node, cb2);
6056
6060
  });
6057
6061
  });
@@ -9145,6 +9149,7 @@ class Column extends Component {
9145
9149
  Sortable.create(childWrap, {
9146
9150
  animation: 150,
9147
9151
  fallbackClass: "field-moving",
9152
+ forceFallback: true,
9148
9153
  group: {
9149
9154
  name: "column",
9150
9155
  pull: true,
@@ -9250,6 +9255,7 @@ class Row extends Component {
9250
9255
  Sortable.create(children, {
9251
9256
  animation: 150,
9252
9257
  fallbackClass: "column-moving",
9258
+ forceFallback: true,
9253
9259
  group: {
9254
9260
  name: "row",
9255
9261
  pull: true,
@@ -9945,30 +9951,37 @@ let Controls$1 = class Controls {
9945
9951
  for (let i2 = groups.length - 1; i2 >= 0; i2--) {
9946
9952
  const storeID = `formeo-controls-${groups[i2]}`;
9947
9953
  if (!this.options.sortable) {
9948
- window.localStorage.removeItem(storeID);
9954
+ globalThis.localStorage.removeItem(storeID);
9949
9955
  }
9950
9956
  Sortable.create(groups[i2], {
9951
9957
  animation: 150,
9952
- forceFallback: true,
9953
9958
  fallbackClass: "control-moving",
9954
9959
  fallbackOnBody: true,
9960
+ forceFallback: true,
9961
+ fallbackTolerance: 5,
9955
9962
  group: {
9956
9963
  name: "controls",
9957
9964
  pull: "clone",
9958
- put: false
9965
+ put: false,
9966
+ revertClone: true
9959
9967
  },
9960
- onStart: async ({ item }) => {
9961
- const { controlData } = this.get(item.id);
9968
+ onClone: ({ clone: clone2, item }) => {
9969
+ clone2.id = item.id;
9962
9970
  if (this.options.ghostPreview) {
9963
- const { default: Field2 } = await Promise.resolve().then(() => field);
9964
- item.innerHTML = "";
9965
- item.appendChild(new Field2(controlData).preview);
9971
+ const { controlData } = this.get(item.id);
9972
+ Promise.resolve().then(() => field).then(({ default: Field2 }) => {
9973
+ clone2.innerHTML = "";
9974
+ clone2.appendChild(new Field2(controlData).preview);
9975
+ });
9966
9976
  }
9967
9977
  },
9968
- onEnd: ({ from, item, clone: clone2 }) => {
9969
- if (from.contains(clone2)) {
9970
- from.replaceChild(item, clone2);
9971
- }
9978
+ onStart: () => {
9979
+ this.originalDocumentOverflow = document.documentElement.style.overflow;
9980
+ document.documentElement.style.overflow = "hidden";
9981
+ },
9982
+ onEnd: () => {
9983
+ document.documentElement.style.overflow = this.originalDocumentOverflow;
9984
+ this.originalDocumentOverflow = null;
9972
9985
  },
9973
9986
  sort: this.options.sortable,
9974
9987
  store: {
@@ -9978,7 +9991,7 @@ let Controls$1 = class Controls {
9978
9991
  * @return {Array}
9979
9992
  */
9980
9993
  get: () => {
9981
- const order = window.localStorage.getItem(storeID);
9994
+ const order = globalThis.localStorage.getItem(storeID);
9982
9995
  return order ? order.split("|") : [];
9983
9996
  },
9984
9997
  /**
@@ -9987,7 +10000,7 @@ let Controls$1 = class Controls {
9987
10000
  */
9988
10001
  set: (sortable) => {
9989
10002
  const order = sortable.toArray();
9990
- window.localStorage.setItem(storeID, order.join("|"));
10003
+ globalThis.localStorage.setItem(storeID, order.join("|"));
9991
10004
  }
9992
10005
  }
9993
10006
  });
@@ -10845,7 +10858,7 @@ const processOptions = ({ editorContainer, renderContainer, formData, ...opts })
10845
10858
  };
10846
10859
  const baseId = (id) => {
10847
10860
  const match2 = id.match(UUID_REGEXP);
10848
- return match2?.[0] || id``;
10861
+ return match2?.[0] || id;
10849
10862
  };
10850
10863
  const isVisible = (elem) => {
10851
10864
  if (!elem) return false;
@@ -10930,12 +10943,13 @@ const targetPropertyMap = {
10930
10943
  };
10931
10944
  let FormeoRenderer$1 = class FormeoRenderer {
10932
10945
  constructor(opts, formDataArg) {
10933
- const { renderContainer, elements, formData } = processOptions(opts);
10934
- this.container = renderContainer;
10946
+ const { renderContainer: container, elements, formData, config } = processOptions(opts);
10947
+ this.container = container;
10935
10948
  this.form = cleanFormData(formDataArg || formData);
10936
- this.dom = dom;
10937
- this.components = /* @__PURE__ */ Object.create(null);
10938
10949
  this.elements = elements;
10950
+ this.config = config;
10951
+ this.components = /* @__PURE__ */ Object.create(null);
10952
+ this.dom = dom;
10939
10953
  }
10940
10954
  get formData() {
10941
10955
  return this.form;
@@ -10943,10 +10957,30 @@ let FormeoRenderer$1 = class FormeoRenderer {
10943
10957
  set formData(data) {
10944
10958
  this.form = cleanFormData(data);
10945
10959
  }
10960
+ /**
10961
+ * Gets the user data from the rendered form as a plain object.
10962
+ * Converts FormData to an object, handling multiple values for the same key
10963
+ * by converting them into arrays.
10964
+ *
10965
+ * @returns {Object.<string, string|string[]>} An object containing form field names as keys
10966
+ * and their values. Fields with multiple values are stored as arrays.
10967
+ *
10968
+ * @example
10969
+ * // Form with single values
10970
+ * { username: 'john', email: 'john@example.com' }
10971
+ *
10972
+ * @example
10973
+ * // Form with multiple values for same key
10974
+ * { username: 'john', hobbies: ['reading', 'gaming'] }
10975
+ */
10946
10976
  get userData() {
10947
- const userData = new FormData(this.renderedForm);
10977
+ const form = this.container.querySelector(".formeo-render") || this.renderedForm;
10978
+ if (!form) {
10979
+ return {};
10980
+ }
10981
+ const formEntries = new FormData(form);
10948
10982
  const formDataObj = {};
10949
- for (const [key, value] of userData.entries()) {
10983
+ for (const [key, value] of formEntries.entries()) {
10950
10984
  if (formDataObj[key]) {
10951
10985
  if (Array.isArray(formDataObj[key])) {
10952
10986
  formDataObj[key].push(value);
@@ -10959,6 +10993,27 @@ let FormeoRenderer$1 = class FormeoRenderer {
10959
10993
  }
10960
10994
  return formDataObj;
10961
10995
  }
10996
+ /**
10997
+ * Gets the user form data as an array of field objects.
10998
+ * Combines user input values with component metadata to create structured field data.
10999
+ *
11000
+ * @returns {Array<{key: string, value: any, label: string}>} An array of field data objects, where each object contains:
11001
+ * - key: The field identifier
11002
+ * - value: The user's input value for the field
11003
+ * - label: The field's label from component configuration (empty string if not found)
11004
+ */
11005
+ get userFormData() {
11006
+ const userFormData = [];
11007
+ for (const [key, value] of Object.entries(this.userData)) {
11008
+ const fieldData = {
11009
+ key,
11010
+ value,
11011
+ label: this.components[baseId(key)]?.config?.label || ""
11012
+ };
11013
+ userFormData.push(fieldData);
11014
+ }
11015
+ return userFormData;
11016
+ }
10962
11017
  set userData(data = {}) {
10963
11018
  const form = this.container.querySelector("form");
10964
11019
  for (const key of Object.keys(data)) {
@@ -10982,6 +11037,7 @@ let FormeoRenderer$1 = class FormeoRenderer {
10982
11037
  * @param {Object} formData
10983
11038
  */
10984
11039
  render(formData = this.form) {
11040
+ this.form = cleanFormData(formData);
10985
11041
  const renderedForm = this.getRenderedForm(formData);
10986
11042
  const existingRenderedForm = this.container.querySelector(".formeo-render");
10987
11043
  if (existingRenderedForm) {
@@ -10994,6 +11050,7 @@ let FormeoRenderer$1 = class FormeoRenderer {
10994
11050
  this.form = cleanFormData(formData);
10995
11051
  const renderCount = document.getElementsByClassName("formeo-render").length;
10996
11052
  const config = {
11053
+ ...this.config,
10997
11054
  tag: "form",
10998
11055
  id: this.form.id,
10999
11056
  className: `formeo-render formeo formeo-rendered-${renderCount}`,
@@ -11019,11 +11076,9 @@ let FormeoRenderer$1 = class FormeoRenderer {
11019
11076
  */
11020
11077
  processColumn = ({ id, ...columnData }) => ({
11021
11078
  ...columnData,
11022
- ...{
11023
- id: this.prefixId(id),
11024
- children: this.processFields(columnData.children),
11025
- style: `width: ${columnData.config.width || "100%"}`
11026
- }
11079
+ id: this.prefixId(id),
11080
+ children: this.processFields(columnData.children),
11081
+ style: `width: ${columnData.config.width || "100%"}`
11027
11082
  });
11028
11083
  processRows = (stageId) => this.orderChildren("rows", this.form.stages[stageId].children).reduce((acc, row) => {
11029
11084
  if (row) {
@@ -11066,11 +11121,16 @@ let FormeoRenderer$1 = class FormeoRenderer {
11066
11121
  };
11067
11122
  };
11068
11123
  cloneComponentData = (componentId) => {
11069
- const { children = [], id, ...rest } = this.components[componentId];
11124
+ const { children = [], id, attrs = {}, ...rest } = this.components[componentId];
11125
+ const updatedAttrs = { ...attrs, "data-clone-of": id };
11126
+ if (rest.tag === "input") {
11127
+ updatedAttrs.name = getName(this.components[componentId]);
11128
+ }
11070
11129
  return {
11071
11130
  ...rest,
11072
- id: uuid(id),
11073
- children: children?.length && children.map(({ id: id2 }) => this.cloneComponentData(baseId(id2)))
11131
+ id: RENDER_PREFIX + uuid(id),
11132
+ children: children?.length && children.map(({ id: id2 }) => this.cloneComponentData(baseId(id2))),
11133
+ attrs: updatedAttrs
11074
11134
  };
11075
11135
  };
11076
11136
  addButton = (id) => ({
@@ -11218,12 +11278,12 @@ let FormeoRenderer$1 = class FormeoRenderer {
11218
11278
  return components2;
11219
11279
  };
11220
11280
  };
11281
+ const listenTypeMap = [
11282
+ ["input", (c) => ["textarea", "text"].includes(c.type)],
11283
+ ["change", (c) => ["select"].includes(c.tagName.toLowerCase()) || ["checkbox", "radio"].includes(c.type)]
11284
+ ];
11221
11285
  const LISTEN_TYPE_MAP = (component) => {
11222
- const typesMap = [
11223
- ["input", (c) => ["textarea", "text"].includes(c.type)],
11224
- ["change", (c) => ["select"].includes(c.tagName.toLowerCase()) || ["checkbox", "radio"].includes(c.type)]
11225
- ];
11226
- const [listenerEvent] = typesMap.find((typeMap) => typeMap[1](component)) || [false];
11286
+ const [listenerEvent] = listenTypeMap.find((typeMap) => typeMap[1](component)) || [false];
11227
11287
  return listenerEvent;
11228
11288
  };
11229
11289
  if (window !== void 0) {