|
@@ -80,7 +80,7 @@
|
|
|
|
|
|
|
|
<ProfileEditDialog
|
|
<ProfileEditDialog
|
|
|
v-model="editDialog"
|
|
v-model="editDialog"
|
|
|
- :form="editForm"
|
|
|
|
|
|
|
+ v-model:form="editForm"
|
|
|
:input-rules="inputRules"
|
|
:input-rules="inputRules"
|
|
|
:server-errors="serverErrors"
|
|
:server-errors="serverErrors"
|
|
|
:submitting="submitting"
|
|
:submitting="submitting"
|
|
@@ -91,10 +91,13 @@
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup>
|
|
<script setup>
|
|
|
-import { computed, onMounted, reactive, ref } from "vue";
|
|
|
|
|
|
|
+import { computed, onMounted, ref, watch } from "vue";
|
|
|
|
|
+
|
|
|
import { updateUser } from "src/api/user";
|
|
import { updateUser } from "src/api/user";
|
|
|
import { useInputRules } from "src/composables/useInputRules";
|
|
import { useInputRules } from "src/composables/useInputRules";
|
|
|
import { useSubmitHandler } from "src/composables/useSubmitHandler";
|
|
import { useSubmitHandler } from "src/composables/useSubmitHandler";
|
|
|
|
|
+import { useFormUpdateTracker } from "src/composables/useFormUpdateTracker";
|
|
|
|
|
+
|
|
|
import { userStore } from "src/stores/user";
|
|
import { userStore } from "src/stores/user";
|
|
|
|
|
|
|
|
import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
|
|
import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
|
|
@@ -103,6 +106,7 @@ import ProfileEditDialog from "./components/ProfileEditDialog.vue";
|
|
|
defineOptions({ name: "ProfilePage" });
|
|
defineOptions({ name: "ProfilePage" });
|
|
|
|
|
|
|
|
const { inputRules } = useInputRules();
|
|
const { inputRules } = useInputRules();
|
|
|
|
|
+
|
|
|
const currentUserStore = userStore();
|
|
const currentUserStore = userStore();
|
|
|
|
|
|
|
|
const {
|
|
const {
|
|
@@ -111,10 +115,13 @@ const {
|
|
|
serverErrors,
|
|
serverErrors,
|
|
|
} = useSubmitHandler(() => closeEditDialog());
|
|
} = useSubmitHandler(() => closeEditDialog());
|
|
|
|
|
|
|
|
-const loading = ref(false);
|
|
|
|
|
-const editDialog = ref(false);
|
|
|
|
|
-
|
|
|
|
|
-const editForm = reactive({
|
|
|
|
|
|
|
+const {
|
|
|
|
|
+ form: editForm,
|
|
|
|
|
+ getUpdatedFields,
|
|
|
|
|
+ hasUpdatedFields,
|
|
|
|
|
+ resetUpdateForm,
|
|
|
|
|
+ setUpdateFormAsOriginal,
|
|
|
|
|
+} = useFormUpdateTracker({
|
|
|
name: "",
|
|
name: "",
|
|
|
document: "",
|
|
document: "",
|
|
|
email: "",
|
|
email: "",
|
|
@@ -122,8 +129,13 @@ const editForm = reactive({
|
|
|
confirmPassword: "",
|
|
confirmPassword: "",
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
|
|
+const loading = ref(false);
|
|
|
|
|
+
|
|
|
|
|
+const editDialog = ref(false);
|
|
|
|
|
+
|
|
|
const userData = computed(() => {
|
|
const userData = computed(() => {
|
|
|
const user = currentUserStore.user ?? {};
|
|
const user = currentUserStore.user ?? {};
|
|
|
|
|
+
|
|
|
return {
|
|
return {
|
|
|
id: user?.id ?? null,
|
|
id: user?.id ?? null,
|
|
|
name: user?.name ?? user?.full_name ?? "",
|
|
name: user?.name ?? user?.full_name ?? "",
|
|
@@ -134,6 +146,7 @@ const userData = computed(() => {
|
|
|
|
|
|
|
|
const loadUser = async () => {
|
|
const loadUser = async () => {
|
|
|
loading.value = true;
|
|
loading.value = true;
|
|
|
|
|
+
|
|
|
try {
|
|
try {
|
|
|
await currentUserStore.fetchUser();
|
|
await currentUserStore.fetchUser();
|
|
|
} finally {
|
|
} finally {
|
|
@@ -141,7 +154,7 @@ const loadUser = async () => {
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-const resetEditForm = () => {
|
|
|
|
|
|
|
+const syncFormWithUser = () => {
|
|
|
Object.assign(editForm, {
|
|
Object.assign(editForm, {
|
|
|
name: userData.value.name,
|
|
name: userData.value.name,
|
|
|
document: userData.value.document,
|
|
document: userData.value.document,
|
|
@@ -149,42 +162,59 @@ const resetEditForm = () => {
|
|
|
password: "",
|
|
password: "",
|
|
|
confirmPassword: "",
|
|
confirmPassword: "",
|
|
|
});
|
|
});
|
|
|
- serverErrors.value = {};
|
|
|
|
|
|
|
+
|
|
|
|
|
+ setUpdateFormAsOriginal();
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const openEditDialog = () => {
|
|
const openEditDialog = () => {
|
|
|
- resetEditForm();
|
|
|
|
|
|
|
+ syncFormWithUser();
|
|
|
|
|
+ serverErrors.value = {};
|
|
|
editDialog.value = true;
|
|
editDialog.value = true;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const closeEditDialog = () => {
|
|
const closeEditDialog = () => {
|
|
|
editDialog.value = false;
|
|
editDialog.value = false;
|
|
|
- resetEditForm();
|
|
|
|
|
|
|
+ resetUpdateForm();
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-const buildPayload = (formValues) => {
|
|
|
|
|
- const payload = {
|
|
|
|
|
- name: formValues.name,
|
|
|
|
|
- email: formValues.email,
|
|
|
|
|
- document_number: formValues.document,
|
|
|
|
|
- };
|
|
|
|
|
|
|
+const buildPayload = () => {
|
|
|
|
|
+ const updated = { ...getUpdatedFields.value };
|
|
|
|
|
|
|
|
- if (formValues.password) {
|
|
|
|
|
- payload.password = formValues.password;
|
|
|
|
|
|
|
+ if (updated.document) {
|
|
|
|
|
+ updated.document_number = updated.document;
|
|
|
|
|
+ delete updated.document;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return payload;
|
|
|
|
|
|
|
+ if (!updated.password) {
|
|
|
|
|
+ delete updated.password;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ delete updated.confirmPassword;
|
|
|
|
|
+
|
|
|
|
|
+ return updated;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-const submitProfileUpdate = async (formValues) => {
|
|
|
|
|
|
|
+const submitProfileUpdate = async () => {
|
|
|
if (!userData.value.id) return;
|
|
if (!userData.value.id) return;
|
|
|
|
|
|
|
|
|
|
+ if (!hasUpdatedFields.value) {
|
|
|
|
|
+ closeEditDialog();
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
await execute(async () => {
|
|
await execute(async () => {
|
|
|
- await updateUser(buildPayload(formValues), userData.value.id);
|
|
|
|
|
|
|
+ const payload = buildPayload();
|
|
|
|
|
+
|
|
|
|
|
+ await updateUser(payload, userData.value.id);
|
|
|
|
|
+
|
|
|
await loadUser();
|
|
await loadUser();
|
|
|
|
|
+
|
|
|
|
|
+ setUpdateFormAsOriginal();
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+watch(userData, syncFormWithUser, { immediate: true });
|
|
|
|
|
+
|
|
|
onMounted(loadUser);
|
|
onMounted(loadUser);
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|