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