web-mojo 2.1.294 → 2.1.295

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-DLDSJEIk.js → ContextMenu-BhyvSOLE.js} +2 -2
  10. package/dist/chunks/{ContextMenu-DLDSJEIk.js.map → ContextMenu-BhyvSOLE.js.map} +1 -1
  11. package/dist/chunks/{ContextMenu-DR9qV_8Z.js → ContextMenu-DKKmjtgo.js} +2 -2
  12. package/dist/chunks/{ContextMenu-DR9qV_8Z.js.map → ContextMenu-DKKmjtgo.js.map} +1 -1
  13. package/dist/chunks/{DataView-CB3fkiWE.js → DataView-CX04UO6n.js} +2 -2
  14. package/dist/chunks/{DataView-CB3fkiWE.js.map → DataView-CX04UO6n.js.map} +1 -1
  15. package/dist/chunks/{DataView-DX2XDuNt.js → DataView-CjjREbqE.js} +2 -2
  16. package/dist/chunks/{DataView-DX2XDuNt.js.map → DataView-CjjREbqE.js.map} +1 -1
  17. package/dist/chunks/{Dialog-BUZEYiTL.js → Dialog-C7XcgLt8.js} +5 -5
  18. package/dist/chunks/{Dialog-BUZEYiTL.js.map → Dialog-C7XcgLt8.js.map} +1 -1
  19. package/dist/chunks/{Dialog-DCpfJ63g.js → Dialog-Dvb1SU1y.js} +2 -2
  20. package/dist/chunks/{Dialog-DCpfJ63g.js.map → Dialog-Dvb1SU1y.js.map} +1 -1
  21. package/dist/chunks/{FilePreviewView-A32KUENg.js → FilePreviewView-CB0yqQtV.js} +6 -6
  22. package/dist/chunks/{FilePreviewView-A32KUENg.js.map → FilePreviewView-CB0yqQtV.js.map} +1 -1
  23. package/dist/chunks/{FilePreviewView-DWLPUdX6.js → FilePreviewView-DgVmlBjn.js} +2 -2
  24. package/dist/chunks/{FilePreviewView-DWLPUdX6.js.map → FilePreviewView-DgVmlBjn.js.map} +1 -1
  25. package/dist/chunks/{FormView-CYJpCFJ2.js → FormView-CWFqrlKb.js} +2 -2
  26. package/dist/chunks/{FormView-CYJpCFJ2.js.map → FormView-CWFqrlKb.js.map} +1 -1
  27. package/dist/chunks/{FormView-GJqUOJqR.js → FormView-DJxUvj0p.js} +140 -3
  28. package/dist/chunks/{FormView-GJqUOJqR.js.map → FormView-DJxUvj0p.js.map} +1 -1
  29. package/dist/chunks/{MetricsChart-BMtSNVSC.js → MetricsChart-CpfACPrE.js} +3 -3
  30. package/dist/chunks/{MetricsChart-BMtSNVSC.js.map → MetricsChart-CpfACPrE.js.map} +1 -1
  31. package/dist/chunks/{MetricsChart-khF2NtDH.js → MetricsChart-DQUOkYQ9.js} +2 -2
  32. package/dist/chunks/{MetricsChart-khF2NtDH.js.map → MetricsChart-DQUOkYQ9.js.map} +1 -1
  33. package/dist/chunks/{PDFViewer-DG_JyAZU.js → PDFViewer-BUOnvSfV.js} +2 -2
  34. package/dist/chunks/{PDFViewer-DG_JyAZU.js.map → PDFViewer-BUOnvSfV.js.map} +1 -1
  35. package/dist/chunks/{PDFViewer-DoHxXjiP.js → PDFViewer-I1qlINnm.js} +3 -3
  36. package/dist/chunks/{PDFViewer-DoHxXjiP.js.map → PDFViewer-I1qlINnm.js.map} +1 -1
  37. package/dist/chunks/{Page-CkziZoUi.js → Page-ZtYiac8Q.js} +2 -2
  38. package/dist/chunks/{Page-CkziZoUi.js.map → Page-ZtYiac8Q.js.map} +1 -1
  39. package/dist/chunks/{Page-uLnlAlwn.js → Page-h5bbwzKf.js} +2 -2
  40. package/dist/chunks/{Page-uLnlAlwn.js.map → Page-h5bbwzKf.js.map} +1 -1
  41. package/dist/chunks/{TopNav-MEetwvBb.js → TopNav-DVX8V6fL.js} +2 -2
  42. package/dist/chunks/{TopNav-MEetwvBb.js.map → TopNav-DVX8V6fL.js.map} +1 -1
  43. package/dist/chunks/{TopNav-BuFxvfyc.js → TopNav-mtuzmduR.js} +2 -2
  44. package/dist/chunks/{TopNav-BuFxvfyc.js.map → TopNav-mtuzmduR.js.map} +1 -1
  45. package/dist/chunks/{WebApp-CKLwTH9q.js → WebApp-BgZwmmBY.js} +15 -12
  46. package/dist/chunks/WebApp-BgZwmmBY.js.map +1 -0
  47. package/dist/chunks/WebApp-C_DpNvNx.js +2 -0
  48. package/dist/chunks/WebApp-C_DpNvNx.js.map +1 -0
  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/WebApp-CKLwTH9q.js.map +0 -1
  57. package/dist/chunks/WebApp-D0A6nJtm.js +0 -2
  58. package/dist/chunks/WebApp-D0A6nJtm.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { M as Mustache, h as MOJOUtils, V as View } from "./WebApp-CKLwTH9q.js";
1
+ import { M as Mustache, h as MOJOUtils, V as View } from "./WebApp-BgZwmmBY.js";
2
2
  class FormBuilder {
3
3
  constructor(config = {}) {
4
4
  this.fields = config.fields || [];
@@ -4318,6 +4318,7 @@ class FormView extends View {
4318
4318
  handleFieldChange(fieldName, value) {
4319
4319
  this.data[fieldName] = value;
4320
4320
  if (this.model && this.options.allowModelChange) {
4321
+ this._isFormDrivenChange = true;
4321
4322
  this.model.set(fieldName, value);
4322
4323
  }
4323
4324
  this.emit("field:change", { field: fieldName, value });
@@ -4816,8 +4817,143 @@ class FormView extends View {
4816
4817
  }
4817
4818
  _onModelChange() {
4818
4819
  if (this.isMounted()) {
4819
- this.refreshForm();
4820
+ if (!this._isFormDrivenChange) {
4821
+ this.syncFormWithModel();
4822
+ }
4823
+ this._isFormDrivenChange = false;
4824
+ }
4825
+ }
4826
+ /**
4827
+ * Sync form field values with current model data without full rebuild
4828
+ */
4829
+ syncFormWithModel() {
4830
+ if (!this.model || !this.element) return;
4831
+ const newData = this.prepareFormData();
4832
+ if (this.formDataMatchesModelData(newData)) {
4833
+ return;
4834
+ }
4835
+ this.data = newData;
4836
+ if (this.formBuilder) {
4837
+ this.formBuilder.data = this.data;
4838
+ }
4839
+ this.syncFormFieldValues();
4840
+ }
4841
+ /**
4842
+ * Compare current form values with new model data
4843
+ * @param {Object} newModelData - New data from model
4844
+ * @returns {boolean} True if form and model data match
4845
+ */
4846
+ formDataMatchesModelData(newModelData) {
4847
+ if (!this.formConfig?.fields || !this.element) return true;
4848
+ for (const field of this.formConfig.fields) {
4849
+ if (field.type === "group" && field.fields) {
4850
+ for (const groupField of field.fields) {
4851
+ if (!this.fieldValueMatchesModel(groupField, newModelData)) {
4852
+ return false;
4853
+ }
4854
+ }
4855
+ } else {
4856
+ if (!this.fieldValueMatchesModel(field, newModelData)) {
4857
+ return false;
4858
+ }
4859
+ }
4860
+ }
4861
+ return true;
4862
+ }
4863
+ /**
4864
+ * Check if a single field's current value matches the model data
4865
+ * @param {Object} fieldConfig - Field configuration
4866
+ * @param {Object} modelData - Model data to compare against
4867
+ * @returns {boolean} True if field value matches model
4868
+ */
4869
+ fieldValueMatchesModel(fieldConfig, modelData) {
4870
+ if (!fieldConfig.name) return true;
4871
+ const fieldElement = this.element.querySelector(`[name="${fieldConfig.name}"]`);
4872
+ if (!fieldElement) return true;
4873
+ const currentValue = this.getFieldCurrentValue(fieldElement, fieldConfig);
4874
+ const modelValue = modelData[fieldConfig.name];
4875
+ return this.valuesAreDifferent(currentValue, modelValue) === false;
4876
+ }
4877
+ /**
4878
+ * Update form field values to match current model data
4879
+ */
4880
+ syncFormFieldValues() {
4881
+ if (!this.formConfig?.fields || !this.element) return;
4882
+ this.formConfig.fields.forEach((field) => {
4883
+ if (field.type === "group" && field.fields) {
4884
+ field.fields.forEach((groupField) => {
4885
+ this.updateFormFieldValue(groupField);
4886
+ });
4887
+ } else {
4888
+ this.updateFormFieldValue(field);
4889
+ }
4890
+ });
4891
+ }
4892
+ /**
4893
+ * Update a single form field value from model data
4894
+ */
4895
+ updateFormFieldValue(fieldConfig) {
4896
+ if (!fieldConfig.name) return;
4897
+ const fieldElement = this.element.querySelector(`[name="${fieldConfig.name}"]`);
4898
+ if (!fieldElement) return;
4899
+ const newValue = this.data[fieldConfig.name];
4900
+ if (this.getFieldCurrentValue(fieldElement, fieldConfig) === newValue) return;
4901
+ this.setFieldValue(fieldElement, fieldConfig, newValue);
4902
+ }
4903
+ /**
4904
+ * Get current value from a form field element
4905
+ */
4906
+ getFieldCurrentValue(fieldElement, fieldConfig) {
4907
+ switch (fieldConfig.type) {
4908
+ case "checkbox":
4909
+ return fieldElement.checked;
4910
+ case "switch":
4911
+ return fieldElement.checked;
4912
+ case "radio":
4913
+ const checkedRadio = this.element.querySelector(`[name="${fieldConfig.name}"]:checked`);
4914
+ return checkedRadio ? checkedRadio.value : "";
4915
+ case "select":
4916
+ return fieldElement.multiple ? Array.from(fieldElement.selectedOptions).map((opt) => opt.value) : fieldElement.value;
4917
+ case "file":
4918
+ case "image":
4919
+ return null;
4920
+ // Don't sync file fields
4921
+ default:
4922
+ return fieldElement.value;
4923
+ }
4924
+ }
4925
+ /**
4926
+ * Set value on a form field element
4927
+ */
4928
+ setFieldValue(fieldElement, fieldConfig, newValue) {
4929
+ switch (fieldConfig.type) {
4930
+ case "checkbox":
4931
+ case "switch":
4932
+ fieldElement.checked = Boolean(newValue);
4933
+ break;
4934
+ case "radio":
4935
+ const radioOption = this.element.querySelector(`[name="${fieldConfig.name}"][value="${newValue}"]`);
4936
+ if (radioOption) {
4937
+ radioOption.checked = true;
4938
+ }
4939
+ break;
4940
+ case "select":
4941
+ if (fieldElement.multiple && Array.isArray(newValue)) {
4942
+ Array.from(fieldElement.options).forEach((option) => {
4943
+ option.selected = newValue.includes(option.value);
4944
+ });
4945
+ } else {
4946
+ fieldElement.value = newValue || "";
4947
+ }
4948
+ break;
4949
+ case "file":
4950
+ case "image":
4951
+ break;
4952
+ default:
4953
+ fieldElement.value = newValue || "";
4954
+ break;
4820
4955
  }
4956
+ fieldElement.dispatchEvent(new Event("change", { bubbles: true }));
4821
4957
  }
4822
4958
  /**
4823
4959
  * Set defaults (updates defaults and rebuilds form)
@@ -4896,6 +5032,7 @@ class FormView extends View {
4896
5032
  console.log("Saving changed data via model:", changes);
4897
5033
  console.log("Data type:", changes instanceof FormData ? "FormData (multipart)" : "Object (JSON/base64)");
4898
5034
  try {
5035
+ this._isFormDrivenChange = true;
4899
5036
  const result = await this.model.save(changes);
4900
5037
  console.log("Model save result:", result);
4901
5038
  return result;
@@ -5410,4 +5547,4 @@ export {
5410
5547
  applyFileDropMixin as a,
5411
5548
  FormView$1 as b
5412
5549
  };
5413
- //# sourceMappingURL=FormView-GJqUOJqR.js.map
5550
+ //# sourceMappingURL=FormView-DJxUvj0p.js.map