web-mojo 2.1.1044 → 2.1.1090

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.
Files changed (86) hide show
  1. package/dist/admin.cjs.js +1 -1
  2. package/dist/admin.cjs.js.map +1 -1
  3. package/dist/admin.es.js +75 -72
  4. package/dist/admin.es.js.map +1 -1
  5. package/dist/auth.cjs.js +1 -1
  6. package/dist/auth.es.js +1 -1
  7. package/dist/charts.cjs.js +1 -1
  8. package/dist/charts.cjs.js.map +1 -1
  9. package/dist/charts.css +319 -0
  10. package/dist/charts.es.js +555 -3
  11. package/dist/charts.es.js.map +1 -1
  12. package/dist/chunks/{ChatView-Bvkdj-lq.js → ChatView-DBYroDpU.js} +2 -2
  13. package/dist/chunks/{ChatView-Bvkdj-lq.js.map → ChatView-DBYroDpU.js.map} +1 -1
  14. package/dist/chunks/{ChatView-DBgQzOyI.js → ChatView-e0mc38Pf.js} +7 -7
  15. package/dist/chunks/{ChatView-DBgQzOyI.js.map → ChatView-e0mc38Pf.js.map} +1 -1
  16. package/dist/chunks/{Collection-DD1_31eh.js → Collection-B64LJ92k.js} +2 -2
  17. package/dist/chunks/{Collection-DD1_31eh.js.map → Collection-B64LJ92k.js.map} +1 -1
  18. package/dist/chunks/{Collection-DaTm-2LH.js → Collection-DpdzB_n7.js} +2 -2
  19. package/dist/chunks/{Collection-DaTm-2LH.js.map → Collection-DpdzB_n7.js.map} +1 -1
  20. package/dist/chunks/{ContextMenu-snx9Dd1s.js → ContextMenu-CfMAB33c.js} +2 -2
  21. package/dist/chunks/{ContextMenu-snx9Dd1s.js.map → ContextMenu-CfMAB33c.js.map} +1 -1
  22. package/dist/chunks/{ContextMenu-hQH_6Pyi.js → ContextMenu-DG-2yxqU.js} +3 -3
  23. package/dist/chunks/{ContextMenu-hQH_6Pyi.js.map → ContextMenu-DG-2yxqU.js.map} +1 -1
  24. package/dist/chunks/{DataView-D7j4IWyS.js → DataView-DESqBxT-.js} +2 -2
  25. package/dist/chunks/{DataView-D7j4IWyS.js.map → DataView-DESqBxT-.js.map} +1 -1
  26. package/dist/chunks/{DataView-CWejLV3B.js → DataView-QXyfcg2M.js} +2 -2
  27. package/dist/chunks/{DataView-CWejLV3B.js.map → DataView-QXyfcg2M.js.map} +1 -1
  28. package/dist/chunks/{Dialog-BcJG5Vta.js → Dialog-DvSrCOj1.js} +21 -8
  29. package/dist/chunks/Dialog-DvSrCOj1.js.map +1 -0
  30. package/dist/chunks/Dialog-zrXDKGkH.js +2 -0
  31. package/dist/chunks/Dialog-zrXDKGkH.js.map +1 -0
  32. package/dist/chunks/{FormView-BClEkzmE.js → FormView-DGRmcKUG.js} +282 -123
  33. package/dist/chunks/FormView-DGRmcKUG.js.map +1 -0
  34. package/dist/chunks/FormView-KGvr68ju.js +3 -0
  35. package/dist/chunks/FormView-KGvr68ju.js.map +1 -0
  36. package/dist/chunks/{ListView-BrsQ26R6.js → ListView-B2gyVSMW.js} +3 -3
  37. package/dist/chunks/{ListView-BrsQ26R6.js.map → ListView-B2gyVSMW.js.map} +1 -1
  38. package/dist/chunks/{ListView-BRGiITfD.js → ListView-BpGEatee.js} +2 -2
  39. package/dist/chunks/{ListView-BRGiITfD.js.map → ListView-BpGEatee.js.map} +1 -1
  40. package/dist/chunks/{MetricsMiniChartWidget-CN1HPnWf.js → MetricsMiniChartWidget-C9ou095r.js} +2 -2
  41. package/dist/chunks/{MetricsMiniChartWidget-CN1HPnWf.js.map → MetricsMiniChartWidget-C9ou095r.js.map} +1 -1
  42. package/dist/chunks/{MetricsMiniChartWidget-DALWxrzu.js → MetricsMiniChartWidget-Z-Iz-gxt.js} +4 -4
  43. package/dist/chunks/{MetricsMiniChartWidget-DALWxrzu.js.map → MetricsMiniChartWidget-Z-Iz-gxt.js.map} +1 -1
  44. package/dist/chunks/{PDFViewer-DtJIlPXi.js → PDFViewer-BXcbKJHv.js} +2 -2
  45. package/dist/chunks/{PDFViewer-DtJIlPXi.js.map → PDFViewer-BXcbKJHv.js.map} +1 -1
  46. package/dist/chunks/{PDFViewer-CgdSGU1n.js → PDFViewer-Bq55sL4x.js} +3 -3
  47. package/dist/chunks/{PDFViewer-CgdSGU1n.js.map → PDFViewer-Bq55sL4x.js.map} +1 -1
  48. package/dist/chunks/Rest-BpDyhFfG.js +2 -0
  49. package/dist/chunks/Rest-BpDyhFfG.js.map +1 -0
  50. package/dist/chunks/{Rest-CS4jRCAs.js → Rest-DpbPbmra.js} +96 -5
  51. package/dist/chunks/Rest-DpbPbmra.js.map +1 -0
  52. package/dist/chunks/{TokenManager-BanwFrq7.js → TokenManager-BYVQWApC.js} +5 -5
  53. package/dist/chunks/{TokenManager-BanwFrq7.js.map → TokenManager-BYVQWApC.js.map} +1 -1
  54. package/dist/chunks/{TokenManager-DIEFCQ3B.js → TokenManager-D8VO38Nx.js} +2 -2
  55. package/dist/chunks/{TokenManager-DIEFCQ3B.js.map → TokenManager-D8VO38Nx.js.map} +1 -1
  56. package/dist/chunks/{WebSocketClient-D-5DJoMX.js → WebSocketClient-DghNkEyO.js} +2 -2
  57. package/dist/chunks/{WebSocketClient-D-5DJoMX.js.map → WebSocketClient-DghNkEyO.js.map} +1 -1
  58. package/dist/chunks/{WebSocketClient-DzcqAmho.js → WebSocketClient-E08hfP5f.js} +2 -2
  59. package/dist/chunks/{WebSocketClient-DzcqAmho.js.map → WebSocketClient-E08hfP5f.js.map} +1 -1
  60. package/dist/chunks/{version-WMgX72-y.js → version-BDuk3lxD.js} +2 -2
  61. package/dist/chunks/{version-WMgX72-y.js.map → version-BDuk3lxD.js.map} +1 -1
  62. package/dist/chunks/{version-BaFu2yii.js → version-BsWmst16.js} +4 -4
  63. package/dist/chunks/{version-BaFu2yii.js.map → version-BsWmst16.js.map} +1 -1
  64. package/dist/css/web-mojo.css +1 -1
  65. package/dist/docit.cjs.js +1 -1
  66. package/dist/docit.es.js +6 -6
  67. package/dist/index.cjs.js +1 -1
  68. package/dist/index.es.js +15 -15
  69. package/dist/lightbox.cjs.js +1 -1
  70. package/dist/lightbox.es.js +5 -5
  71. package/dist/map.cjs.js +1 -1
  72. package/dist/map.cjs.js.map +1 -1
  73. package/dist/map.es.js +82 -3
  74. package/dist/map.es.js.map +1 -1
  75. package/dist/timeline.cjs.js +1 -1
  76. package/dist/timeline.es.js +4 -4
  77. package/package.json +1 -1
  78. package/dist/chunks/Dialog-7T8ENHYD.js +0 -2
  79. package/dist/chunks/Dialog-7T8ENHYD.js.map +0 -1
  80. package/dist/chunks/Dialog-BcJG5Vta.js.map +0 -1
  81. package/dist/chunks/FormView-BClEkzmE.js.map +0 -1
  82. package/dist/chunks/FormView-nulck4nL.js +0 -3
  83. package/dist/chunks/FormView-nulck4nL.js.map +0 -1
  84. package/dist/chunks/Rest-BNYqGlnP.js +0 -2
  85. package/dist/chunks/Rest-BNYqGlnP.js.map +0 -1
  86. package/dist/chunks/Rest-CS4jRCAs.js.map +0 -1
@@ -1,4 +1,124 @@
1
- import { a as Mustache, M as MOJOUtils, V as View } from "./Rest-CS4jRCAs.js";
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="mojo-form-group ${colClass} ${groupClass}">
503
- ${title ? `<div class="${titleClass}">${this.escapeHtml(title)}</div>` : ""}
504
- <div class="row">
505
- ${fieldsHTML}
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
- console.log("buildFieldHTML - Processing field type:", type, "for field:", field.name);
519
- switch (type) {
520
- case "text":
521
- fieldHTML = this.renderTextField(field);
522
- break;
523
- case "email":
524
- fieldHTML = this.renderEmailField(field);
525
- break;
526
- case "password":
527
- fieldHTML = this.renderPasswordField(field);
528
- break;
529
- case "number":
530
- fieldHTML = this.renderNumberField(field);
531
- break;
532
- case "tel":
533
- fieldHTML = this.renderTelField(field);
534
- break;
535
- case "url":
536
- fieldHTML = this.renderUrlField(field);
537
- break;
538
- case "search":
539
- fieldHTML = this.renderSearchField(field);
540
- break;
541
- case "hex":
542
- fieldHTML = this.renderHexField(field);
543
- break;
544
- case "textarea":
545
- fieldHTML = this.renderTextareaField(field);
546
- break;
547
- case "json":
548
- fieldHTML = this.renderJsonField(field);
549
- break;
550
- case "select":
551
- fieldHTML = this.renderSelectField(field);
552
- break;
553
- case "checkbox":
554
- fieldHTML = this.renderCheckboxField(field);
555
- break;
556
- case "toggle":
557
- case "switch":
558
- fieldHTML = this.renderSwitchField(field);
559
- break;
560
- case "radio":
561
- fieldHTML = this.renderRadioField(field);
562
- break;
563
- case "date":
564
- fieldHTML = this.renderDateField(field);
565
- break;
566
- case "datetime":
567
- fieldHTML = this.renderDateTimeField(field);
568
- break;
569
- case "time":
570
- fieldHTML = this.renderTimeField(field);
571
- break;
572
- case "file":
573
- fieldHTML = this.renderFileField(field);
574
- break;
575
- case "image":
576
- fieldHTML = this.renderImageField(field);
577
- break;
578
- case "color":
579
- fieldHTML = this.renderColorField(field);
580
- break;
581
- case "range":
582
- fieldHTML = this.renderRangeField(field);
583
- break;
584
- case "hidden":
585
- fieldHTML = this.renderHiddenField(field);
586
- break;
587
- case "button":
588
- fieldHTML = this.renderButton(field);
589
- break;
590
- case "divider":
591
- fieldHTML = this.renderDivider(field);
592
- break;
593
- case "html":
594
- fieldHTML = this.renderHtmlField(field);
595
- break;
596
- case "heading":
597
- case "header":
598
- fieldHTML = this.renderHeaderField(field);
599
- break;
600
- case "tag":
601
- case "tags":
602
- fieldHTML = this.renderTagField(field);
603
- break;
604
- case "collection":
605
- fieldHTML = this.renderCollectionField(field);
606
- break;
607
- case "collectionmultiselect":
608
- case "collection-multiselect":
609
- fieldHTML = this.renderCollectionMultiSelectField(field);
610
- break;
611
- case "datepicker":
612
- fieldHTML = this.renderDatePickerField(field);
613
- break;
614
- case "daterange":
615
- fieldHTML = this.renderDateRangeField(field);
616
- break;
617
- case "checklistdropdown":
618
- fieldHTML = this.renderChecklistDropdownField(field);
619
- break;
620
- case "buttongroup":
621
- fieldHTML = this.renderButtonGroupField(field);
622
- break;
623
- case "combo":
624
- case "combobox":
625
- case "autocomplete":
626
- fieldHTML = this.renderComboField(field);
627
- break;
628
- case "tabset":
629
- fieldHTML = this.renderTabsetField(field);
630
- break;
631
- default:
632
- console.warn(`Unknown field type: ${type}`);
633
- fieldHTML = this.renderTextField(field);
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
- return `field_${name}_${Date.now()}`;
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-BClEkzmE.js.map
7752
+ //# sourceMappingURL=FormView-DGRmcKUG.js.map