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.
- package/dist/admin.cjs.js +1 -1
- package/dist/admin.es.js +10 -10
- package/dist/auth.cjs.js +1 -1
- package/dist/auth.cjs.js.map +1 -1
- package/dist/auth.es.js +3 -3
- package/dist/auth.es.js.map +1 -1
- package/dist/charts.cjs.js +1 -1
- package/dist/charts.es.js +2 -2
- package/dist/chunks/{ContextMenu-DLDSJEIk.js → ContextMenu-BhyvSOLE.js} +2 -2
- package/dist/chunks/{ContextMenu-DLDSJEIk.js.map → ContextMenu-BhyvSOLE.js.map} +1 -1
- package/dist/chunks/{ContextMenu-DR9qV_8Z.js → ContextMenu-DKKmjtgo.js} +2 -2
- package/dist/chunks/{ContextMenu-DR9qV_8Z.js.map → ContextMenu-DKKmjtgo.js.map} +1 -1
- package/dist/chunks/{DataView-CB3fkiWE.js → DataView-CX04UO6n.js} +2 -2
- package/dist/chunks/{DataView-CB3fkiWE.js.map → DataView-CX04UO6n.js.map} +1 -1
- package/dist/chunks/{DataView-DX2XDuNt.js → DataView-CjjREbqE.js} +2 -2
- package/dist/chunks/{DataView-DX2XDuNt.js.map → DataView-CjjREbqE.js.map} +1 -1
- package/dist/chunks/{Dialog-BUZEYiTL.js → Dialog-C7XcgLt8.js} +5 -5
- package/dist/chunks/{Dialog-BUZEYiTL.js.map → Dialog-C7XcgLt8.js.map} +1 -1
- package/dist/chunks/{Dialog-DCpfJ63g.js → Dialog-Dvb1SU1y.js} +2 -2
- package/dist/chunks/{Dialog-DCpfJ63g.js.map → Dialog-Dvb1SU1y.js.map} +1 -1
- package/dist/chunks/{FilePreviewView-A32KUENg.js → FilePreviewView-CB0yqQtV.js} +6 -6
- package/dist/chunks/{FilePreviewView-A32KUENg.js.map → FilePreviewView-CB0yqQtV.js.map} +1 -1
- package/dist/chunks/{FilePreviewView-DWLPUdX6.js → FilePreviewView-DgVmlBjn.js} +2 -2
- package/dist/chunks/{FilePreviewView-DWLPUdX6.js.map → FilePreviewView-DgVmlBjn.js.map} +1 -1
- package/dist/chunks/{FormView-CYJpCFJ2.js → FormView-CWFqrlKb.js} +2 -2
- package/dist/chunks/{FormView-CYJpCFJ2.js.map → FormView-CWFqrlKb.js.map} +1 -1
- package/dist/chunks/{FormView-GJqUOJqR.js → FormView-DJxUvj0p.js} +140 -3
- package/dist/chunks/{FormView-GJqUOJqR.js.map → FormView-DJxUvj0p.js.map} +1 -1
- package/dist/chunks/{MetricsChart-BMtSNVSC.js → MetricsChart-CpfACPrE.js} +3 -3
- package/dist/chunks/{MetricsChart-BMtSNVSC.js.map → MetricsChart-CpfACPrE.js.map} +1 -1
- package/dist/chunks/{MetricsChart-khF2NtDH.js → MetricsChart-DQUOkYQ9.js} +2 -2
- package/dist/chunks/{MetricsChart-khF2NtDH.js.map → MetricsChart-DQUOkYQ9.js.map} +1 -1
- package/dist/chunks/{PDFViewer-DG_JyAZU.js → PDFViewer-BUOnvSfV.js} +2 -2
- package/dist/chunks/{PDFViewer-DG_JyAZU.js.map → PDFViewer-BUOnvSfV.js.map} +1 -1
- package/dist/chunks/{PDFViewer-DoHxXjiP.js → PDFViewer-I1qlINnm.js} +3 -3
- package/dist/chunks/{PDFViewer-DoHxXjiP.js.map → PDFViewer-I1qlINnm.js.map} +1 -1
- package/dist/chunks/{Page-CkziZoUi.js → Page-ZtYiac8Q.js} +2 -2
- package/dist/chunks/{Page-CkziZoUi.js.map → Page-ZtYiac8Q.js.map} +1 -1
- package/dist/chunks/{Page-uLnlAlwn.js → Page-h5bbwzKf.js} +2 -2
- package/dist/chunks/{Page-uLnlAlwn.js.map → Page-h5bbwzKf.js.map} +1 -1
- package/dist/chunks/{TopNav-MEetwvBb.js → TopNav-DVX8V6fL.js} +2 -2
- package/dist/chunks/{TopNav-MEetwvBb.js.map → TopNav-DVX8V6fL.js.map} +1 -1
- package/dist/chunks/{TopNav-BuFxvfyc.js → TopNav-mtuzmduR.js} +2 -2
- package/dist/chunks/{TopNav-BuFxvfyc.js.map → TopNav-mtuzmduR.js.map} +1 -1
- package/dist/chunks/{WebApp-CKLwTH9q.js → WebApp-BgZwmmBY.js} +15 -12
- package/dist/chunks/WebApp-BgZwmmBY.js.map +1 -0
- package/dist/chunks/WebApp-C_DpNvNx.js +2 -0
- package/dist/chunks/WebApp-C_DpNvNx.js.map +1 -0
- package/dist/docit.cjs.js +1 -1
- package/dist/docit.es.js +5 -5
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +11 -11
- package/dist/lightbox.cjs.js +1 -1
- package/dist/lightbox.es.js +4 -4
- package/package.json +1 -1
- package/dist/chunks/WebApp-CKLwTH9q.js.map +0 -1
- package/dist/chunks/WebApp-D0A6nJtm.js +0 -2
- 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-
|
|
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.
|
|
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-
|
|
5550
|
+
//# sourceMappingURL=FormView-DJxUvj0p.js.map
|