web-mojo 2.1.374 → 2.1.378

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 (58) hide show
  1. package/dist/admin.cjs.js +1 -1
  2. package/dist/admin.es.js +10 -10
  3. package/dist/auth.cjs.js +1 -1
  4. package/dist/auth.cjs.js.map +1 -1
  5. package/dist/auth.es.js +3 -3
  6. package/dist/auth.es.js.map +1 -1
  7. package/dist/charts.cjs.js +1 -1
  8. package/dist/charts.es.js +2 -2
  9. package/dist/chunks/{ContextMenu-Bj0vnzNa.js → ContextMenu-BxE_1Qd8.js} +2 -2
  10. package/dist/chunks/{ContextMenu-Bj0vnzNa.js.map → ContextMenu-BxE_1Qd8.js.map} +1 -1
  11. package/dist/chunks/{ContextMenu-C7v0VIY_.js → ContextMenu-n23iaLzc.js} +2 -2
  12. package/dist/chunks/{ContextMenu-C7v0VIY_.js.map → ContextMenu-n23iaLzc.js.map} +1 -1
  13. package/dist/chunks/{DataView-B4G04Dmp.js → DataView-B6yHMLUg.js} +2 -2
  14. package/dist/chunks/{DataView-B4G04Dmp.js.map → DataView-B6yHMLUg.js.map} +1 -1
  15. package/dist/chunks/{DataView-DJmDpOGX.js → DataView-CzwNX--7.js} +2 -2
  16. package/dist/chunks/{DataView-DJmDpOGX.js.map → DataView-CzwNX--7.js.map} +1 -1
  17. package/dist/chunks/{Dialog-BCY5-1_K.js → Dialog-Ddgmt0gO.js} +2 -2
  18. package/dist/chunks/{Dialog-BCY5-1_K.js.map → Dialog-Ddgmt0gO.js.map} +1 -1
  19. package/dist/chunks/{Dialog-BVmpi0NI.js → Dialog-NZpWuQ43.js} +5 -5
  20. package/dist/chunks/{Dialog-BVmpi0NI.js.map → Dialog-NZpWuQ43.js.map} +1 -1
  21. package/dist/chunks/{FilePreviewView-D9bsPjLJ.js → FilePreviewView-BM219euF.js} +2 -2
  22. package/dist/chunks/{FilePreviewView-D9bsPjLJ.js.map → FilePreviewView-BM219euF.js.map} +1 -1
  23. package/dist/chunks/{FilePreviewView-BW4q9CWy.js → FilePreviewView-Cl3yIYXj.js} +6 -6
  24. package/dist/chunks/{FilePreviewView-BW4q9CWy.js.map → FilePreviewView-Cl3yIYXj.js.map} +1 -1
  25. package/dist/chunks/{FormView-DOVHdh_a.js → FormView-B1ldH_5V.js} +42 -29
  26. package/dist/chunks/FormView-B1ldH_5V.js.map +1 -0
  27. package/dist/chunks/FormView-CZVfn24F.js +2 -0
  28. package/dist/chunks/FormView-CZVfn24F.js.map +1 -0
  29. package/dist/chunks/{MetricsChart-B8ZVKD9S.js → MetricsChart-CONguG4G.js} +2 -2
  30. package/dist/chunks/{MetricsChart-B8ZVKD9S.js.map → MetricsChart-CONguG4G.js.map} +1 -1
  31. package/dist/chunks/{MetricsChart-Cs2FzC_Q.js → MetricsChart-DNEz5MOj.js} +3 -3
  32. package/dist/chunks/{MetricsChart-Cs2FzC_Q.js.map → MetricsChart-DNEz5MOj.js.map} +1 -1
  33. package/dist/chunks/{PDFViewer-Ke5LjPjK.js → PDFViewer-BPVjeOWK.js} +3 -3
  34. package/dist/chunks/{PDFViewer-Ke5LjPjK.js.map → PDFViewer-BPVjeOWK.js.map} +1 -1
  35. package/dist/chunks/{PDFViewer-BwjHxhaW.js → PDFViewer-BcGM_abb.js} +2 -2
  36. package/dist/chunks/{PDFViewer-BwjHxhaW.js.map → PDFViewer-BcGM_abb.js.map} +1 -1
  37. package/dist/chunks/{Page-Bel8oJt_.js → Page-CHOQIJni.js} +2 -2
  38. package/dist/chunks/{Page-Bel8oJt_.js.map → Page-CHOQIJni.js.map} +1 -1
  39. package/dist/chunks/{Page-BA2qmbk-.js → Page-DUi1d14L.js} +2 -2
  40. package/dist/chunks/{Page-BA2qmbk-.js.map → Page-DUi1d14L.js.map} +1 -1
  41. package/dist/chunks/{TopNav-D8bye4a-.js → TopNav-CWoyhg7a.js} +2 -2
  42. package/dist/chunks/{TopNav-D8bye4a-.js.map → TopNav-CWoyhg7a.js.map} +1 -1
  43. package/dist/chunks/{TopNav-B7LbpdYy.js → TopNav-Dbv_5N1P.js} +2 -2
  44. package/dist/chunks/{TopNav-B7LbpdYy.js.map → TopNav-Dbv_5N1P.js.map} +1 -1
  45. package/dist/chunks/{WebApp-DdnnC4q6.js → WebApp-CUL8EXgl.js} +12 -12
  46. package/dist/chunks/{WebApp-DdnnC4q6.js.map → WebApp-CUL8EXgl.js.map} +1 -1
  47. package/dist/chunks/{WebApp-BkXGQTaY.js → WebApp-DkvQsYEF.js} +2 -2
  48. package/dist/chunks/{WebApp-BkXGQTaY.js.map → WebApp-DkvQsYEF.js.map} +1 -1
  49. package/dist/docit.cjs.js +1 -1
  50. package/dist/docit.es.js +5 -5
  51. package/dist/index.cjs.js +1 -1
  52. package/dist/index.es.js +11 -11
  53. package/dist/lightbox.cjs.js +1 -1
  54. package/dist/lightbox.es.js +4 -4
  55. package/package.json +1 -1
  56. package/dist/chunks/FormView-CtNmBv4F.js +0 -2
  57. package/dist/chunks/FormView-CtNmBv4F.js.map +0 -1
  58. package/dist/chunks/FormView-DOVHdh_a.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { M as Mustache, h as MOJOUtils, V as View } from "./WebApp-DdnnC4q6.js";
1
+ import { M as Mustache, h as MOJOUtils, V as View } from "./WebApp-CUL8EXgl.js";
2
2
  class FormBuilder {
3
3
  constructor(config = {}) {
4
4
  this.fields = config.fields || [];
@@ -54,7 +54,7 @@ class FormBuilder {
54
54
  class="{{inputClass}}{{#error}} is-invalid{{/error}}"
55
55
  value="{{fieldValue}}" {{#placeholder}}placeholder="{{placeholder}}"{{/placeholder}}
56
56
  {{#required}}required{{/required}} {{#disabled}}disabled{{/disabled}}
57
- {{#readonly}}readonly{{/readonly}} data-change-action="validate-field" {{{attrs}}}>
57
+ {{#readonly}}readonly{{/readonly}} {{{attrs}}}>
58
58
  {{#help}}<div class="{{helpClass}}">{{help}}</div>{{/help}}
59
59
  {{#error}}<div class="{{errorClass}}">{{error}}</div>{{/error}}
60
60
  </div>
@@ -71,7 +71,7 @@ class FormBuilder {
71
71
  class="{{inputClass}}{{#error}} is-invalid{{/error}}"
72
72
  value="{{fieldValue}}" {{#placeholder}}placeholder="{{placeholder}}"{{/placeholder}}
73
73
  {{#required}}required{{/required}} {{#disabled}}disabled{{/disabled}}
74
- {{#readonly}}readonly{{/readonly}} data-change-action="validate-field"
74
+ {{#readonly}}readonly{{/readonly}}
75
75
  data-field-type="password" {{{attrs}}}>
76
76
  {{#showToggle}}
77
77
  <button type="button" class="btn btn-outline-secondary"
@@ -111,7 +111,7 @@ class FormBuilder {
111
111
  <textarea id="{{fieldId}}" name="{{name}}" class="{{inputClass}}{{#error}} is-invalid{{/error}}"
112
112
  rows="{{rows}}" {{#placeholder}}placeholder="{{placeholder}}"{{/placeholder}}
113
113
  {{#required}}required{{/required}} {{#disabled}}disabled{{/disabled}}
114
- {{#readonly}}readonly{{/readonly}} data-change-action="validate-field" {{{attrs}}}>{{fieldValue}}</textarea>
114
+ {{#readonly}}readonly{{/readonly}} {{{attrs}}}>{{fieldValue}}</textarea>
115
115
  {{#help}}<div class="{{helpClass}}">{{help}}</div>{{/help}}
116
116
  {{#error}}<div class="{{errorClass}}">{{error}}</div>{{/error}}
117
117
  </div>
@@ -126,7 +126,7 @@ class FormBuilder {
126
126
  {{#searchInput}}{{{searchInput}}}{{/searchInput}}
127
127
  <select id="{{fieldId}}" name="{{name}}" class="{{inputClass}}{{#error}} is-invalid{{/error}}"
128
128
  {{#required}}required{{/required}} {{#disabled}}disabled{{/disabled}}
129
- {{#multiple}}multiple{{/multiple}} data-change-action="validate-field" {{{attrs}}}>
129
+ {{#multiple}}multiple{{/multiple}} {{{attrs}}}>
130
130
  {{{optionsHTML}}}
131
131
  </select>
132
132
  {{#help}}<div class="{{helpClass}}">{{help}}</div>{{/help}}
@@ -139,7 +139,7 @@ class FormBuilder {
139
139
  <input type="checkbox" id="{{fieldId}}" name="{{name}}"
140
140
  class="form-check-input{{#error}} is-invalid{{/error}}" value="{{value}}"
141
141
  {{#checked}}checked{{/checked}} {{#required}}required{{/required}}
142
- {{#disabled}}disabled{{/disabled}} data-change-action="validate-field" {{{attrs}}}>
142
+ {{#disabled}}disabled{{/disabled}} {{{attrs}}}>
143
143
  <label class="form-check-label" for="{{fieldId}}">{{label}}</label>
144
144
  </div>
145
145
  {{#help}}<div class="{{helpClass}}">{{help}}</div>{{/help}}
@@ -231,7 +231,7 @@ class FormBuilder {
231
231
  <input type="radio" id="{{fieldId}}_{{value}}" name="{{name}}" value="{{value}}"
232
232
  class="form-check-input{{#error}} is-invalid{{/error}}" {{#checked}}checked{{/checked}}
233
233
  {{#required}}required{{/required}} {{#disabled}}disabled{{/disabled}}
234
- data-change-action="validate-field" {{{attrs}}}>
234
+ {{{attrs}}}>
235
235
  <label class="form-check-label" for="{{fieldId}}_{{value}}">{{text}}</label>
236
236
  </div>
237
237
  {{/options}}
@@ -324,7 +324,7 @@ class FormBuilder {
324
324
  class="{{inputClass}}{{#error}} is-invalid{{/error}}"
325
325
  value="{{fieldValue}}"
326
326
  {{#required}}required{{/required}} {{#disabled}}disabled{{/disabled}}
327
- {{#readonly}}readonly{{/readonly}} data-change-action="validate-field" {{{attrs}}}>
327
+ {{#readonly}}readonly{{/readonly}} {{{attrs}}}>
328
328
  <button type="button" class="btn-sm text-muted border-0 bg-transparent p-1"
329
329
  data-action="clear-color" data-field="{{name}}"
330
330
  title="Clear color">
@@ -1141,7 +1141,7 @@ class FormBuilder {
1141
1141
  value="${this.escapeHtml(radioValue)}"
1142
1142
  ${checked}
1143
1143
  ${disabled ? "disabled" : ""}
1144
- data-change-action="validate-field"
1144
+
1145
1145
  ${attrs}
1146
1146
  >
1147
1147
  <label class="form-check-label" for="${radioId}">
@@ -1588,7 +1588,7 @@ class FormBuilder {
1588
1588
  placeholder="${this.escapeHtml(placeholder)}"
1589
1589
  ${disabled ? "disabled" : ""}
1590
1590
  ${readonly ? "readonly" : ""}
1591
- data-change-action="validate-field">
1591
+
1592
1592
  <input type="hidden" name="${name}" value="${this.escapeHtml(fieldValue)}">
1593
1593
  <small class="form-text text-muted">This will be enhanced with TagInput component</small>
1594
1594
  </div>
@@ -1648,7 +1648,7 @@ class FormBuilder {
1648
1648
  placeholder="${this.escapeHtml(placeholder)}"
1649
1649
  ${disabled ? "disabled" : ""}
1650
1650
  ${readonly ? "readonly" : ""}
1651
- data-change-action="validate-field">
1651
+
1652
1652
  <input type="hidden" name="${name}" value="${this.escapeHtml(fieldValue)}">
1653
1653
  <small class="form-text text-muted">This will be enhanced with CollectionSelect component</small>
1654
1654
  </div>
@@ -1709,7 +1709,7 @@ class FormBuilder {
1709
1709
  ${disabled ? "disabled" : ""}
1710
1710
  ${readonly ? "readonly" : ""}
1711
1711
  ${required ? "required" : ""}
1712
- data-change-action="validate-field">
1712
+
1713
1713
  <small class="form-text text-muted">This will be enhanced with Easepick DatePicker</small>
1714
1714
  </div>
1715
1715
  ${help ? `<div class="${this.options.helpClass}">${this.escapeHtml(help)}</div>` : ""}
@@ -1786,7 +1786,7 @@ class FormBuilder {
1786
1786
  ${disabled ? "disabled" : ""}
1787
1787
  ${readonly ? "readonly" : ""}
1788
1788
  ${required ? "required" : ""}
1789
- data-change-action="validate-field">
1789
+
1790
1790
  </div>
1791
1791
  <div class="col-auto d-flex align-items-center">
1792
1792
  <span class="text-muted">${this.escapeHtml(separator.trim())}</span>
@@ -1803,7 +1803,7 @@ class FormBuilder {
1803
1803
  ${disabled ? "disabled" : ""}
1804
1804
  ${readonly ? "readonly" : ""}
1805
1805
  ${required ? "required" : ""}
1806
- data-change-action="validate-field">
1806
+
1807
1807
  </div>
1808
1808
  </div>
1809
1809
  <small class="form-text text-muted">This will be enhanced with Easepick DateRangePicker</small>
@@ -4194,6 +4194,8 @@ class FormView extends View {
4194
4194
  this.autosaveModelField = autosaveModelField;
4195
4195
  this.customComponents = /* @__PURE__ */ new Map();
4196
4196
  this.fieldStatusManagers = /* @__PURE__ */ new Map();
4197
+ this.saveTimeouts = /* @__PURE__ */ new Map();
4198
+ this.isSaving = false;
4197
4199
  this.data = this.prepareFormData();
4198
4200
  this.formConfig = formConfig || { fields: fields || [] };
4199
4201
  this.formBuilder = new FormBuilder({
@@ -4436,26 +4438,36 @@ class FormView extends View {
4436
4438
  this.emit("field:change", { field: fieldName, value });
4437
4439
  }
4438
4440
  /**
4439
- * Handle saving individual field changes to the model
4441
+ * Handle saving individual field changes to the model with debouncing
4440
4442
  * @param {string} fieldName - Name of the field being saved
4441
4443
  * @param {*} value - New value to save
4442
4444
  */
4443
4445
  async handleFieldSave(fieldName, value) {
4444
- if (!this.model) return;
4446
+ if (!this.model || this.isSaving) return;
4447
+ if (this.saveTimeouts.has(fieldName)) {
4448
+ clearTimeout(this.saveTimeouts.get(fieldName));
4449
+ }
4445
4450
  const statusManager = this.getFieldStatusManager(fieldName);
4446
- try {
4447
- statusManager.showStatus("saving");
4448
- this._isFormDrivenChange = true;
4449
- if (typeof this.model.save === "function") {
4450
- await this.model.save({ [fieldName]: value });
4451
- } else {
4452
- this.model.set(fieldName, value);
4451
+ statusManager.showStatus("saving");
4452
+ const timeoutId = setTimeout(async () => {
4453
+ try {
4454
+ this.isSaving = true;
4455
+ this.saveTimeouts.delete(fieldName);
4456
+ this._isFormDrivenChange = true;
4457
+ if (typeof this.model.save === "function") {
4458
+ await this.model.save({ [fieldName]: value });
4459
+ } else {
4460
+ this.model.set(fieldName, value);
4461
+ }
4462
+ statusManager.showStatus("saved");
4463
+ } catch (error) {
4464
+ console.error("Field save error:", error);
4465
+ statusManager.showStatus("error", { message: error.message });
4466
+ } finally {
4467
+ this.isSaving = false;
4453
4468
  }
4454
- statusManager.showStatus("saved");
4455
- } catch (error) {
4456
- console.error("Field save error:", error);
4457
- statusManager.showStatus("error", { message: error.message });
4458
- }
4469
+ }, 300);
4470
+ this.saveTimeouts.set(fieldName, timeoutId);
4459
4471
  }
4460
4472
  /**
4461
4473
  * Get or create a field status manager for a specific field
@@ -4966,6 +4978,7 @@ class FormView extends View {
4966
4978
  }
4967
4979
  }
4968
4980
  _onModelChange() {
4981
+ if (this.isSaving) return;
4969
4982
  this.data = this.prepareFormData();
4970
4983
  if (this.isMounted()) {
4971
4984
  if (!this._isFormDrivenChange) {
@@ -5918,4 +5931,4 @@ export {
5918
5931
  applyFileDropMixin as a,
5919
5932
  FormView$1 as b
5920
5933
  };
5921
- //# sourceMappingURL=FormView-DOVHdh_a.js.map
5934
+ //# sourceMappingURL=FormView-B1ldH_5V.js.map