From 5f43c4eaca0ee15ca653d2d514a0bd0e8ed005df Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 7 Apr 2025 15:04:26 +0200 Subject: [PATCH] perf: refs #8217 getDifferences fix --- src/components/CrudModel.vue | 1 + src/components/FormModel.vue | 2 +- src/filters/getDifferences.js | 60 ++++++++--------------------------- src/filters/onBeforeSave.js | 4 +-- 4 files changed, 18 insertions(+), 49 deletions(-) diff --git a/src/components/CrudModel.vue b/src/components/CrudModel.vue index 6303f48ae..fab1bea96 100644 --- a/src/components/CrudModel.vue +++ b/src/components/CrudModel.vue @@ -98,6 +98,7 @@ defineExpose({ reset, hasChanges, saveChanges, + getChanges, formData, originalData, diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue index 5b16f9a3e..d2f346382 100644 --- a/src/components/FormModel.vue +++ b/src/components/FormModel.vue @@ -221,7 +221,7 @@ async function save() { isLoading.value = true; try { formData.value = trimData(formData.value); - const body = $props.mapper(formData.value, originalData.value); + const body = $props.mapper(originalData.value, formData.value); const method = $props.urlCreate ? 'post' : 'patch'; const url = $props.urlCreate || $props.urlUpdate || $props.url || arrayData.store.url; diff --git a/src/filters/getDifferences.js b/src/filters/getDifferences.js index 5b123d727..54a82420b 100644 --- a/src/filters/getDifferences.js +++ b/src/filters/getDifferences.js @@ -1,54 +1,22 @@ -export default function getDifferences(obj1, obj2) { - const diff = {}; +export default function getDifferences(initialData, formData) { + const differences = {}; + delete initialData.$index; + delete formData.$index; - const copyObj1 = { ...obj1 }; - const copyObj2 = obj2 ? { ...obj2 } : {}; - - delete copyObj1.$index; - if (copyObj2) delete copyObj2.$index; - - for (const key in copyObj1) { - if (copyObj1.hasOwnProperty(key)) { + for (const key in formData) { + if (formData.hasOwnProperty(key)) { if ( - !copyObj2.hasOwnProperty(key) || - !deepCompare(copyObj1[key], copyObj2[key]) + !initialData || + !initialData.hasOwnProperty(key) || + formData[key] !== initialData[key] ) { - diff[key] = copyObj1[key]; + //AƱadir la diferencia solo si existe initialData + if (initialData) { + differences[key] = formData[key]; + } } } } - for (const key in copyObj2) { - if (copyObj2.hasOwnProperty(key) && !copyObj1.hasOwnProperty(key)) { - diff[key] = copyObj2[key]; - } - } - - return diff; -} - -function deepCompare(obj1, obj2) { - if ( - typeof obj1 !== 'object' || - obj1 === null || - typeof obj2 !== 'object' || - obj2 === null - ) { - return obj1 === obj2; - } - - const keys1 = Object.keys(obj1); - const keys2 = Object.keys(obj2); - - if (keys1.length !== keys2.length) { - return false; - } - - for (const key of keys1) { - if (!obj2.hasOwnProperty(key) || !deepCompare(obj1[key], obj2[key])) { - return false; - } - } - - return true; + return differences; } diff --git a/src/filters/onBeforeSave.js b/src/filters/onBeforeSave.js index 2ebf72185..73066ddf9 100644 --- a/src/filters/onBeforeSave.js +++ b/src/filters/onBeforeSave.js @@ -1,9 +1,9 @@ import getDifferences from './getDifferences'; import getUpdatedValues from './getUpdatedValues'; -export default function onBeforeSave(formData, originalData) { +export default function onBeforeSave(originalData, formData) { return getUpdatedValues( - Object.keys(getDifferences(formData, originalData)), + Object.keys(getDifferences(originalData, formData)), formData, ); }