web-mojo 2.1.1043 → 2.1.1087
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/README.md +19 -16
- package/dist/admin.cjs.js +1 -1
- package/dist/admin.cjs.js.map +1 -1
- package/dist/admin.es.js +16 -14
- package/dist/admin.es.js.map +1 -1
- package/dist/auth.cjs.js +1 -1
- package/dist/auth.cjs.js.map +1 -1
- package/dist/auth.css +305 -266
- package/dist/auth.es.js +537 -2175
- package/dist/auth.es.js.map +1 -1
- package/dist/charts.cjs.js +1 -1
- package/dist/charts.cjs.js.map +1 -1
- package/dist/charts.css +319 -0
- package/dist/charts.es.js +555 -2
- package/dist/charts.es.js.map +1 -1
- package/dist/chunks/ChatView-BnC15uoD.js +2 -0
- package/dist/chunks/{ChatView-CGBaudUc.js.map → ChatView-BnC15uoD.js.map} +1 -1
- package/dist/chunks/{ChatView-DguKw-gR.js → ChatView-D-5lHZ5H.js} +7 -8
- package/dist/chunks/{ChatView-DguKw-gR.js.map → ChatView-D-5lHZ5H.js.map} +1 -1
- package/dist/chunks/{Collection-DD1_31eh.js → Collection-B64LJ92k.js} +2 -2
- package/dist/chunks/{Collection-DD1_31eh.js.map → Collection-B64LJ92k.js.map} +1 -1
- package/dist/chunks/{Collection-YRfGoT73.js → Collection-CsAk0UhA.js} +2 -2
- package/dist/chunks/{Collection-YRfGoT73.js.map → Collection-CsAk0UhA.js.map} +1 -1
- package/dist/chunks/ContextMenu-CfMAB33c.js +3 -0
- package/dist/chunks/ContextMenu-CfMAB33c.js.map +1 -0
- package/dist/chunks/{ContextMenu-B4_YS0G8.js → ContextMenu-Cvls3QC_.js} +350 -3
- package/dist/chunks/ContextMenu-Cvls3QC_.js.map +1 -0
- package/dist/chunks/DataView-DESqBxT-.js +2 -0
- package/dist/chunks/DataView-DESqBxT-.js.map +1 -0
- package/dist/chunks/{DataView-OUqaLmGB.js → DataView-QXyfcg2M.js} +3 -2
- package/dist/chunks/DataView-QXyfcg2M.js.map +1 -0
- package/dist/chunks/Dialog-BfXN-fFA.js +2 -0
- package/dist/chunks/Dialog-BfXN-fFA.js.map +1 -0
- package/dist/chunks/{Dialog-BiVgKzSK.js → Dialog-DHUsZ92-.js} +1375 -7
- package/dist/chunks/Dialog-DHUsZ92-.js.map +1 -0
- package/dist/chunks/{FormView-BClEkzmE.js → FormView-DGRmcKUG.js} +282 -123
- package/dist/chunks/FormView-DGRmcKUG.js.map +1 -0
- package/dist/chunks/FormView-KGvr68ju.js +3 -0
- package/dist/chunks/FormView-KGvr68ju.js.map +1 -0
- package/dist/chunks/{ListView-BMNhd5-B.js → ListView-BGJG4GYH.js} +3 -3
- package/dist/chunks/{ListView-BMNhd5-B.js.map → ListView-BGJG4GYH.js.map} +1 -1
- package/dist/chunks/{ListView-BRGiITfD.js → ListView-BpGEatee.js} +2 -2
- package/dist/chunks/{ListView-BRGiITfD.js.map → ListView-BpGEatee.js.map} +1 -1
- package/dist/chunks/{MetricsMiniChartWidget-CCroU6BZ.js → MetricsMiniChartWidget-BKbFGvXG.js} +4 -4
- package/dist/chunks/{MetricsMiniChartWidget-CCroU6BZ.js.map → MetricsMiniChartWidget-BKbFGvXG.js.map} +1 -1
- package/dist/chunks/MetricsMiniChartWidget-BNdGuSZV.js +2 -0
- package/dist/chunks/{MetricsMiniChartWidget-Esvv-lFp.js.map → MetricsMiniChartWidget-BNdGuSZV.js.map} +1 -1
- package/dist/chunks/{PDFViewer-NeL91Gon.js → PDFViewer-BIBNhuWY.js} +3 -3
- package/dist/chunks/{PDFViewer-NeL91Gon.js.map → PDFViewer-BIBNhuWY.js.map} +1 -1
- package/dist/chunks/{PDFViewer-D4uo3oiA.js → PDFViewer-nZAQQScE.js} +2 -2
- package/dist/chunks/{PDFViewer-D4uo3oiA.js.map → PDFViewer-nZAQQScE.js.map} +1 -1
- package/dist/chunks/Rest-BpDyhFfG.js +2 -0
- package/dist/chunks/Rest-BpDyhFfG.js.map +1 -0
- package/dist/chunks/{Rest-CS4jRCAs.js → Rest-DpbPbmra.js} +96 -5
- package/dist/chunks/Rest-DpbPbmra.js.map +1 -0
- package/dist/chunks/TokenManager-BWc_pRpg.js +2 -0
- package/dist/chunks/TokenManager-BWc_pRpg.js.map +1 -0
- package/dist/chunks/{TopNav-DC8oGpHp.js → TokenManager-N3e5wDu1.js} +369 -6
- package/dist/chunks/TokenManager-N3e5wDu1.js.map +1 -0
- package/dist/chunks/{WebSocketClient-D-5DJoMX.js → WebSocketClient-DghNkEyO.js} +2 -2
- package/dist/chunks/{WebSocketClient-D-5DJoMX.js.map → WebSocketClient-DghNkEyO.js.map} +1 -1
- package/dist/chunks/{WebSocketClient-DzcqAmho.js → WebSocketClient-E08hfP5f.js} +2 -2
- package/dist/chunks/{WebSocketClient-DzcqAmho.js.map → WebSocketClient-E08hfP5f.js.map} +1 -1
- package/dist/chunks/version-CKPqwcQJ.js +2 -0
- package/dist/chunks/version-CKPqwcQJ.js.map +1 -0
- package/dist/chunks/version-Dtwh-YkD.js +38 -0
- package/dist/chunks/version-Dtwh-YkD.js.map +1 -0
- package/dist/css/web-mojo.css +1 -17
- package/dist/docit.cjs.js +1 -1
- package/dist/docit.cjs.js.map +1 -1
- package/dist/docit.es.js +6 -8
- package/dist/docit.es.js.map +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +34 -36
- package/dist/index.es.js.map +1 -1
- package/dist/lightbox.cjs.js +1 -1
- package/dist/lightbox.cjs.js.map +1 -1
- package/dist/lightbox.es.js +5 -4
- package/dist/lightbox.es.js.map +1 -1
- package/dist/map.cjs.js +1 -1
- package/dist/map.cjs.js.map +1 -1
- package/dist/map.es.js +82 -3
- package/dist/map.es.js.map +1 -1
- package/dist/timeline.cjs.js +1 -1
- package/dist/timeline.es.js +4 -4
- package/package.json +1 -1
- package/dist/chunks/ChatView-CGBaudUc.js +0 -2
- package/dist/chunks/ContextMenu-B4_YS0G8.js.map +0 -1
- package/dist/chunks/ContextMenu-DcLhcYMp.js +0 -3
- package/dist/chunks/ContextMenu-DcLhcYMp.js.map +0 -1
- package/dist/chunks/DataView-CdDY9ijM.js +0 -2
- package/dist/chunks/DataView-CdDY9ijM.js.map +0 -1
- package/dist/chunks/DataView-OUqaLmGB.js.map +0 -1
- package/dist/chunks/Dialog-BiVgKzSK.js.map +0 -1
- package/dist/chunks/Dialog-DmIPK_Bi.js +0 -2
- package/dist/chunks/Dialog-DmIPK_Bi.js.map +0 -1
- package/dist/chunks/FormView-BClEkzmE.js.map +0 -1
- package/dist/chunks/FormView-nulck4nL.js +0 -3
- package/dist/chunks/FormView-nulck4nL.js.map +0 -1
- package/dist/chunks/MetricsMiniChartWidget-Esvv-lFp.js +0 -2
- package/dist/chunks/Page-CvbwEoLv.js +0 -2
- package/dist/chunks/Page-CvbwEoLv.js.map +0 -1
- package/dist/chunks/Page-Deq4y2Kq.js +0 -351
- package/dist/chunks/Page-Deq4y2Kq.js.map +0 -1
- package/dist/chunks/Rest-BNYqGlnP.js +0 -2
- package/dist/chunks/Rest-BNYqGlnP.js.map +0 -1
- package/dist/chunks/Rest-CS4jRCAs.js.map +0 -1
- package/dist/chunks/TokenManager-CAZNcCMs.js +0 -366
- package/dist/chunks/TokenManager-CAZNcCMs.js.map +0 -1
- package/dist/chunks/TokenManager-CJBYcVqs.js +0 -2
- package/dist/chunks/TokenManager-CJBYcVqs.js.map +0 -1
- package/dist/chunks/TopNav-23B5R-dl.js +0 -2
- package/dist/chunks/TopNav-23B5R-dl.js.map +0 -1
- package/dist/chunks/TopNav-DC8oGpHp.js.map +0 -1
- package/dist/chunks/WebApp-C1vcdSuu.js +0 -1388
- package/dist/chunks/WebApp-C1vcdSuu.js.map +0 -1
- package/dist/chunks/WebApp-CpxtmTk0.js +0 -2
- package/dist/chunks/WebApp-CpxtmTk0.js.map +0 -1
|
@@ -1,4 +1,124 @@
|
|
|
1
|
-
import { a as Mustache, M as MOJOUtils, V as View } from "./Rest-
|
|
1
|
+
import { a as Mustache, M as MOJOUtils, V as View } from "./Rest-DpbPbmra.js";
|
|
2
|
+
class FormPlugins {
|
|
3
|
+
// Registered plugins
|
|
4
|
+
static _plugins = [];
|
|
5
|
+
// Map of field type => { renderer: Function, pluginId: string }
|
|
6
|
+
static _renderers = /* @__PURE__ */ new Map();
|
|
7
|
+
/**
|
|
8
|
+
* Register a plugin. If a plugin with the same id exists, it's replaced.
|
|
9
|
+
* @param {object} plugin - Plugin definition (see header)
|
|
10
|
+
* @returns {Function} unregister function
|
|
11
|
+
*/
|
|
12
|
+
static register(plugin) {
|
|
13
|
+
if (!plugin || typeof plugin !== "object") {
|
|
14
|
+
console.warn("[FormPlugins] register called with invalid plugin:", plugin);
|
|
15
|
+
return () => {
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
if (!plugin.id || typeof plugin.id !== "string") {
|
|
19
|
+
console.warn('[FormPlugins] plugin must have a unique string "id"', plugin);
|
|
20
|
+
return () => {
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
this.unregister(plugin.id);
|
|
24
|
+
if (plugin.fieldTypes && typeof plugin.fieldTypes === "object") {
|
|
25
|
+
Object.entries(plugin.fieldTypes).forEach(([type, renderer]) => {
|
|
26
|
+
if (typeof renderer === "function") {
|
|
27
|
+
this._renderers.set(type, { renderer, pluginId: plugin.id });
|
|
28
|
+
} else {
|
|
29
|
+
console.warn(`[FormPlugins] renderer for type "${type}" is not a function`);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
this._plugins.push(plugin);
|
|
34
|
+
return () => this.unregister(plugin.id);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Unregister a plugin by id. Removes its field renderers as well.
|
|
38
|
+
* @param {string} id - Plugin id
|
|
39
|
+
*/
|
|
40
|
+
static unregister(id) {
|
|
41
|
+
if (!id) return;
|
|
42
|
+
this._plugins = this._plugins.filter((p) => p.id !== id);
|
|
43
|
+
for (const [type, meta] of this._renderers.entries()) {
|
|
44
|
+
if (meta?.pluginId === id) {
|
|
45
|
+
this._renderers.delete(type);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get a custom field renderer by type (if registered).
|
|
51
|
+
* @param {string} type - Field type
|
|
52
|
+
* @returns {(builder: any, fieldConfig: object) => string | null}
|
|
53
|
+
*/
|
|
54
|
+
static getRenderer(type) {
|
|
55
|
+
const meta = this._renderers.get(type);
|
|
56
|
+
return meta?.renderer || null;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Returns true if a renderer exists for a field type
|
|
60
|
+
*/
|
|
61
|
+
static hasRenderer(type) {
|
|
62
|
+
return this._renderers.has(type);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get a shallow copy of registered plugins (read-only use).
|
|
66
|
+
*/
|
|
67
|
+
static getPlugins() {
|
|
68
|
+
return [...this._plugins];
|
|
69
|
+
}
|
|
70
|
+
// -----------------------------
|
|
71
|
+
// Safe dispatch to plugin hooks
|
|
72
|
+
// -----------------------------
|
|
73
|
+
static _invoke(plugin, hook, ...args) {
|
|
74
|
+
const fn = plugin?.[hook];
|
|
75
|
+
if (typeof fn !== "function") return;
|
|
76
|
+
try {
|
|
77
|
+
return fn.apply(plugin, args);
|
|
78
|
+
} catch (err) {
|
|
79
|
+
console.error(`[FormPlugins] ${hook} error from plugin "${plugin.id}":`, err);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Called by FormBuilder (e.g., in ctor or initializeTemplates)
|
|
84
|
+
* @param {any} builder
|
|
85
|
+
*/
|
|
86
|
+
static onFormBuilderInit(builder) {
|
|
87
|
+
this._plugins.forEach((p) => this._invoke(p, "onFormBuilderInit", builder));
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Called by FormView constructor or early init
|
|
91
|
+
* @param {any} formView
|
|
92
|
+
*/
|
|
93
|
+
static onFormViewInit(formView) {
|
|
94
|
+
this._plugins.forEach((p) => this._invoke(p, "onFormViewInit", formView));
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Called by FormView.onAfterRender
|
|
98
|
+
* @param {any} formView
|
|
99
|
+
*/
|
|
100
|
+
static onFormViewAfterRender(formView) {
|
|
101
|
+
this._plugins.forEach((p) => this._invoke(p, "onAfterRender", formView));
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Called when a specific field element is initialized (after DOM exists)
|
|
105
|
+
* @param {any} formView
|
|
106
|
+
* @param {HTMLElement} fieldEl
|
|
107
|
+
* @param {object} fieldConfig
|
|
108
|
+
*/
|
|
109
|
+
static onFieldInit(formView, fieldEl, fieldConfig) {
|
|
110
|
+
this._plugins.forEach((p) => this._invoke(p, "onFieldInit", formView, fieldEl, fieldConfig));
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Called when a field value changes (normalized point)
|
|
114
|
+
* @param {any} formView
|
|
115
|
+
* @param {string} fieldName
|
|
116
|
+
* @param {any} value
|
|
117
|
+
*/
|
|
118
|
+
static onFieldChange(formView, fieldName, value) {
|
|
119
|
+
this._plugins.forEach((p) => this._invoke(p, "onFieldChange", formView, fieldName, value));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
2
122
|
class FormBuilder {
|
|
3
123
|
constructor(config = {}) {
|
|
4
124
|
this.fields = config.fields || [];
|
|
@@ -15,6 +135,8 @@ class FormBuilder {
|
|
|
15
135
|
if (groupField.cols && !groupField.columns) {
|
|
16
136
|
groupField.columns = groupField.cols;
|
|
17
137
|
delete groupField.cols;
|
|
138
|
+
} else if (!groupField.columns) {
|
|
139
|
+
groupField.columns = 12;
|
|
18
140
|
}
|
|
19
141
|
});
|
|
20
142
|
}
|
|
@@ -42,6 +164,7 @@ class FormBuilder {
|
|
|
42
164
|
* Initialize field templates
|
|
43
165
|
*/
|
|
44
166
|
initializeTemplates() {
|
|
167
|
+
FormPlugins.onFormBuilderInit?.(this);
|
|
45
168
|
this.templates = {
|
|
46
169
|
input: `
|
|
47
170
|
<div class="mojo-form-control">
|
|
@@ -499,10 +622,12 @@ class FormBuilder {
|
|
|
499
622
|
return this.buildFieldHTML(field);
|
|
500
623
|
}).join("");
|
|
501
624
|
return `
|
|
502
|
-
<div class="
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
625
|
+
<div class="${colClass}">
|
|
626
|
+
<div class="mojo-form-group ${groupClass}">
|
|
627
|
+
${title ? `<div class="${titleClass}">${this.escapeHtml(title)}</div>` : ""}
|
|
628
|
+
<div class="row">
|
|
629
|
+
${fieldsHTML}
|
|
630
|
+
</div>
|
|
506
631
|
</div>
|
|
507
632
|
</div>
|
|
508
633
|
`;
|
|
@@ -515,122 +640,135 @@ class FormBuilder {
|
|
|
515
640
|
buildFieldHTML(field) {
|
|
516
641
|
const { type, columns, class: fieldClass = "" } = field;
|
|
517
642
|
let fieldHTML = "";
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
643
|
+
const customRenderer = FormPlugins && typeof FormPlugins.getRenderer === "function" ? FormPlugins.getRenderer(type) : null;
|
|
644
|
+
if (typeof customRenderer === "function") {
|
|
645
|
+
try {
|
|
646
|
+
const custom = customRenderer(this, field);
|
|
647
|
+
if (custom !== void 0 && custom !== null) {
|
|
648
|
+
fieldHTML = String(custom);
|
|
649
|
+
}
|
|
650
|
+
} catch (err) {
|
|
651
|
+
console.error("FormPlugins custom renderer error:", err);
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
if (!fieldHTML) {
|
|
655
|
+
console.log("buildFieldHTML - Processing field type:", type, "for field:", field.name);
|
|
656
|
+
switch (type) {
|
|
657
|
+
case "text":
|
|
658
|
+
fieldHTML = this.renderTextField(field);
|
|
659
|
+
break;
|
|
660
|
+
case "email":
|
|
661
|
+
fieldHTML = this.renderEmailField(field);
|
|
662
|
+
break;
|
|
663
|
+
case "password":
|
|
664
|
+
fieldHTML = this.renderPasswordField(field);
|
|
665
|
+
break;
|
|
666
|
+
case "number":
|
|
667
|
+
fieldHTML = this.renderNumberField(field);
|
|
668
|
+
break;
|
|
669
|
+
case "tel":
|
|
670
|
+
fieldHTML = this.renderTelField(field);
|
|
671
|
+
break;
|
|
672
|
+
case "url":
|
|
673
|
+
fieldHTML = this.renderUrlField(field);
|
|
674
|
+
break;
|
|
675
|
+
case "search":
|
|
676
|
+
fieldHTML = this.renderSearchField(field);
|
|
677
|
+
break;
|
|
678
|
+
case "hex":
|
|
679
|
+
fieldHTML = this.renderHexField(field);
|
|
680
|
+
break;
|
|
681
|
+
case "textarea":
|
|
682
|
+
fieldHTML = this.renderTextareaField(field);
|
|
683
|
+
break;
|
|
684
|
+
case "json":
|
|
685
|
+
fieldHTML = this.renderJsonField(field);
|
|
686
|
+
break;
|
|
687
|
+
case "select":
|
|
688
|
+
fieldHTML = this.renderSelectField(field);
|
|
689
|
+
break;
|
|
690
|
+
case "checkbox":
|
|
691
|
+
fieldHTML = this.renderCheckboxField(field);
|
|
692
|
+
break;
|
|
693
|
+
case "toggle":
|
|
694
|
+
case "switch":
|
|
695
|
+
fieldHTML = this.renderSwitchField(field);
|
|
696
|
+
break;
|
|
697
|
+
case "radio":
|
|
698
|
+
fieldHTML = this.renderRadioField(field);
|
|
699
|
+
break;
|
|
700
|
+
case "date":
|
|
701
|
+
fieldHTML = this.renderDateField(field);
|
|
702
|
+
break;
|
|
703
|
+
case "datetime":
|
|
704
|
+
fieldHTML = this.renderDateTimeField(field);
|
|
705
|
+
break;
|
|
706
|
+
case "time":
|
|
707
|
+
fieldHTML = this.renderTimeField(field);
|
|
708
|
+
break;
|
|
709
|
+
case "file":
|
|
710
|
+
fieldHTML = this.renderFileField(field);
|
|
711
|
+
break;
|
|
712
|
+
case "image":
|
|
713
|
+
fieldHTML = this.renderImageField(field);
|
|
714
|
+
break;
|
|
715
|
+
case "color":
|
|
716
|
+
fieldHTML = this.renderColorField(field);
|
|
717
|
+
break;
|
|
718
|
+
case "range":
|
|
719
|
+
fieldHTML = this.renderRangeField(field);
|
|
720
|
+
break;
|
|
721
|
+
case "hidden":
|
|
722
|
+
fieldHTML = this.renderHiddenField(field);
|
|
723
|
+
break;
|
|
724
|
+
case "button":
|
|
725
|
+
fieldHTML = this.renderButton(field);
|
|
726
|
+
break;
|
|
727
|
+
case "divider":
|
|
728
|
+
fieldHTML = this.renderDivider(field);
|
|
729
|
+
break;
|
|
730
|
+
case "html":
|
|
731
|
+
fieldHTML = this.renderHtmlField(field);
|
|
732
|
+
break;
|
|
733
|
+
case "heading":
|
|
734
|
+
case "header":
|
|
735
|
+
fieldHTML = this.renderHeaderField(field);
|
|
736
|
+
break;
|
|
737
|
+
case "tag":
|
|
738
|
+
case "tags":
|
|
739
|
+
fieldHTML = this.renderTagField(field);
|
|
740
|
+
break;
|
|
741
|
+
case "collection":
|
|
742
|
+
fieldHTML = this.renderCollectionField(field);
|
|
743
|
+
break;
|
|
744
|
+
case "collectionmultiselect":
|
|
745
|
+
case "collection-multiselect":
|
|
746
|
+
fieldHTML = this.renderCollectionMultiSelectField(field);
|
|
747
|
+
break;
|
|
748
|
+
case "datepicker":
|
|
749
|
+
fieldHTML = this.renderDatePickerField(field);
|
|
750
|
+
break;
|
|
751
|
+
case "daterange":
|
|
752
|
+
fieldHTML = this.renderDateRangeField(field);
|
|
753
|
+
break;
|
|
754
|
+
case "checklistdropdown":
|
|
755
|
+
fieldHTML = this.renderChecklistDropdownField(field);
|
|
756
|
+
break;
|
|
757
|
+
case "buttongroup":
|
|
758
|
+
fieldHTML = this.renderButtonGroupField(field);
|
|
759
|
+
break;
|
|
760
|
+
case "combo":
|
|
761
|
+
case "combobox":
|
|
762
|
+
case "autocomplete":
|
|
763
|
+
fieldHTML = this.renderComboField(field);
|
|
764
|
+
break;
|
|
765
|
+
case "tabset":
|
|
766
|
+
fieldHTML = this.renderTabsetField(field);
|
|
767
|
+
break;
|
|
768
|
+
default:
|
|
769
|
+
console.warn(`Unknown field type: ${type}`);
|
|
770
|
+
fieldHTML = this.renderTextField(field);
|
|
771
|
+
}
|
|
634
772
|
}
|
|
635
773
|
let colClass;
|
|
636
774
|
if (this.isAutoSizingField(field)) {
|
|
@@ -646,7 +784,8 @@ class FormBuilder {
|
|
|
646
784
|
* @returns {string} Unique field ID
|
|
647
785
|
*/
|
|
648
786
|
getFieldId(name) {
|
|
649
|
-
|
|
787
|
+
const safeName = name.replace(/[.\s\[\]]/g, "_");
|
|
788
|
+
return `field_${safeName}`;
|
|
650
789
|
}
|
|
651
790
|
/**
|
|
652
791
|
* Render text input field
|
|
@@ -5602,6 +5741,7 @@ class FormView extends View {
|
|
|
5602
5741
|
className: "form-view",
|
|
5603
5742
|
...viewOptions
|
|
5604
5743
|
});
|
|
5744
|
+
FormPlugins.onFormViewInit?.(this);
|
|
5605
5745
|
this.model = model;
|
|
5606
5746
|
this.defaults = defaults || data;
|
|
5607
5747
|
this._originalData = data;
|
|
@@ -5679,6 +5819,7 @@ class FormView extends View {
|
|
|
5679
5819
|
return false;
|
|
5680
5820
|
});
|
|
5681
5821
|
}
|
|
5822
|
+
FormPlugins.onFormViewAfterRender?.(this);
|
|
5682
5823
|
}
|
|
5683
5824
|
/**
|
|
5684
5825
|
* Populate all form fields with current data values
|
|
@@ -5753,6 +5894,23 @@ class FormView extends View {
|
|
|
5753
5894
|
this.initializeDatePickers();
|
|
5754
5895
|
this.initializeDateRangePickers();
|
|
5755
5896
|
this.initializeComboInputs();
|
|
5897
|
+
try {
|
|
5898
|
+
const visitFields = (fields = []) => {
|
|
5899
|
+
fields.forEach((f) => {
|
|
5900
|
+
if (f && f.type === "group" && Array.isArray(f.fields)) {
|
|
5901
|
+
visitFields(f.fields);
|
|
5902
|
+
} else if (f && f.name) {
|
|
5903
|
+
const el = this.element.querySelector(`[name="${f.name}"], #${f.id || f.name}`);
|
|
5904
|
+
if (el) {
|
|
5905
|
+
FormPlugins.onFieldInit?.(this, el, f);
|
|
5906
|
+
}
|
|
5907
|
+
}
|
|
5908
|
+
});
|
|
5909
|
+
};
|
|
5910
|
+
visitFields(this.formConfig?.fields || []);
|
|
5911
|
+
} catch (err) {
|
|
5912
|
+
console.warn("FormPlugins.onFieldInit error:", err);
|
|
5913
|
+
}
|
|
5756
5914
|
const componentContainers = this.element.querySelectorAll("[data-component]");
|
|
5757
5915
|
componentContainers.forEach((container) => {
|
|
5758
5916
|
container.getAttribute("data-component");
|
|
@@ -6008,6 +6166,7 @@ class FormView extends View {
|
|
|
6008
6166
|
this.model.set(fieldName, value);
|
|
6009
6167
|
}
|
|
6010
6168
|
this.emit("field:change", { field: fieldName, value });
|
|
6169
|
+
FormPlugins.onFieldChange?.(this, fieldName, value);
|
|
6011
6170
|
}
|
|
6012
6171
|
/**
|
|
6013
6172
|
* Handle saving individual field changes to the model with debouncing
|
|
@@ -7590,4 +7749,4 @@ export {
|
|
|
7590
7749
|
applyFileDropMixin as a,
|
|
7591
7750
|
FormView$1 as b
|
|
7592
7751
|
};
|
|
7593
|
-
//# sourceMappingURL=FormView-
|
|
7752
|
+
//# sourceMappingURL=FormView-DGRmcKUG.js.map
|