Merge pull request 'feature/Account-view-refactor' (!125) from wbuezas/hedera-web-mindshore:feature/Account-view-refactor into beta
gitea/hedera-web/pipeline/head There was a failure building this commit Details

Reviewed-on: #125
Reviewed-by: Javier Segarra <jsegarra@verdnatura.es>
This commit is contained in:
Javier Segarra 2025-03-21 14:44:52 +00:00
commit 0b6890987a
2 changed files with 95 additions and 58 deletions

View File

@ -3,8 +3,9 @@ import { ref, inject, onMounted, computed } from 'vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import VnInput from 'src/components/common/VnInput.vue'; import VnInput from 'src/components/common/VnInput.vue';
import VnSelect from 'src/components/common/VnSelect.vue'; import VnSelect from 'src/components/common/VnSelect.vue';
import VnForm from 'src/components/common/VnForm.vue';
import ChangePasswordForm from 'src/components/ui/ChangePasswordForm.vue'; import ChangePasswordForm from 'src/components/ui/ChangePasswordForm.vue';
import FormModel from 'src/components/common/FormModel.vue';
import useNotify from 'src/composables/useNotify.js';
import { useUserStore } from 'stores/user'; import { useUserStore } from 'stores/user';
import { useAppStore } from 'stores/app'; import { useAppStore } from 'stores/app';
@ -12,54 +13,76 @@ import { storeToRefs } from 'pinia';
const userStore = useUserStore(); const userStore = useUserStore();
const { t } = useI18n(); const { t } = useI18n();
const jApi = inject('jApi'); const api = inject('api');
const appStore = useAppStore(); const appStore = useAppStore();
const { isHeaderMounted } = storeToRefs(appStore); const { isHeaderMounted } = storeToRefs(appStore);
const { user } = storeToRefs(userStore); const { user } = storeToRefs(userStore);
const { notify } = useNotify();
const vnFormRef = ref(null); const vnFormRef = ref(null);
const vnFormRef2 = ref(null);
const changePasswordFormDialog = ref(null); const changePasswordFormDialog = ref(null);
const showChangePasswordForm = ref(false); const showChangePasswordForm = ref(false);
const langOptions = ref([]); const langOptions = ref([]);
const pks = computed(() => ({ id: userStore?.user?.id })); const formInitialData = ref({});
const fetchConfigDataSql = { const showForm = ref(false);
query: `
SELECT u.id, u.name, u.email, u.nickname,
u.lang, c.isToBeMailed, c.id clientFk
FROM account.myUser u
LEFT JOIN myClient c
ON u.id = c.id`,
params: {}
};
const fetchLanguagesSql = async () => { const fetchLanguages = async () => {
try { try {
const data = await jApi.query( const filter = { fields: ['code', 'name'], where: { isActive: true } };
'SELECT code, name FROM language WHERE isActive' const { data } = await api.get('/languages', {
); params: { filter: JSON.stringify(filter) }
});
langOptions.value = data; langOptions.value = data;
} catch (error) { } catch (error) {
console.error(error); console.error(error);
} }
}; };
const fetchFormInitialData = async () => {
try {
const filter = {
where: { id: user?.value?.id },
fields: ['id', 'name', 'isToBeMailed'],
include: {
relation: 'user',
scope: {
fields: ['nickname', 'lang', 'email']
}
}
};
const { data } = await api.get('/Clients', {
params: { filter: JSON.stringify(filter) }
});
const { user: userData, ...restOfData } = data[0];
formInitialData.value = {
...restOfData,
nickname: userData?.nickname,
lang: userData?.lang,
email: userData?.email
};
} catch (error) {
console.error(error);
} finally {
showForm.value = true;
}
};
const updateUserNickname = async nickname => { const updateUserNickname = async nickname => {
try { try {
await vnFormRef.value.submit(); await submitAccountData(nickname);
await submitNickname(nickname);
user.value.nickname = nickname; user.value.nickname = nickname;
} catch (error) { } catch (error) {
console.error(error); console.error(error);
} }
}; };
const formatMailData = data => {
data.isToBeMailed = Boolean(data.isToBeMailed);
};
const updateConfigLang = async lang => { const updateConfigLang = async lang => {
try { try {
await vnFormRef.value.submit(); if (!lang) return;
await submitAccountData({ lang });
userStore.updateUserLang(lang); userStore.updateUserLang(lang);
const siteLocaleLang = appStore.localeOptions.find( const siteLocaleLang = appStore.localeOptions.find(
locale => locale.value === lang locale => locale.value === lang
@ -70,7 +93,32 @@ const updateConfigLang = async lang => {
} }
}; };
onMounted(() => fetchLanguagesSql()); const submitAccountData = async data => {
try {
const params = {
...data
};
await api.patch(`/VnUsers/${user?.value?.id}`, params);
notify(t('dataSaved'), 'positive');
} catch (error) {
console.error(error);
}
};
const submitIsToBeMailed = async isToBeMailed => {
try {
const payload = { isToBeMailed };
await api.patch(`/Clients/${user.value.id}`, payload);
notify(t('dataSaved'), 'positive');
} catch (error) {
console.error(error);
}
};
onMounted(async () => {
fetchLanguages();
fetchFormInitialData();
});
</script> </script>
<template> <template>
@ -92,14 +140,14 @@ onMounted(() => fetchLanguagesSql());
@click="showChangePasswordForm = true" @click="showChangePasswordForm = true"
/> />
</Teleport> </Teleport>
<VnForm <FormModel
v-if="showForm"
ref="vnFormRef" ref="vnFormRef"
:save-fn="submitFormFn"
:form-initial-data="formInitialData"
:title="t('personalInformation')" :title="t('personalInformation')"
:fetch-form-data-sql="fetchConfigDataSql" :show-bottom-actions="false"
:pks="pks" :defaultActions="false"
table="myUser"
schema="account"
:default-actions="false"
> >
<template #form="{ data }"> <template #form="{ data }">
<VnInput <VnInput
@ -111,14 +159,16 @@ onMounted(() => fetchLanguagesSql());
<VnInput <VnInput
v-model="data.email" v-model="data.email"
:label="t('email')" :label="t('email')"
@keyup.enter="vnFormRef.submit()" @keyup.enter="submitAccountData({ email: data.email })"
@blur="vnFormRef.submit()" @blur="submitAccountData({ email: data.email })"
/> />
<VnInput <VnInput
v-model="data.nickname" v-model="data.nickname"
:label="t('nickname')" :label="t('nickname')"
@keyup.enter="updateUserNickname(data.nickname)" @keyup.enter="
@blur="updateUserNickname(data.nickname)" updateUserNickname({ nickname: data.nickname })
"
@blur="updateUserNickname({ nickname: data.nickname })"
data-cy="configViewNickname" data-cy="configViewNickname"
/> />
<VnSelect <VnSelect
@ -130,30 +180,17 @@ onMounted(() => fetchLanguagesSql());
@update:model-value="updateConfigLang(data.lang)" @update:model-value="updateConfigLang(data.lang)"
data-cy="configViewLang" data-cy="configViewLang"
/> />
<QCheckbox
v-model="data.isToBeMailed"
:label="t('isToBeMailed')"
:toggle-indeterminate="false"
@update:model-value="
submitIsToBeMailed(data.isToBeMailed)
"
dense
/>
</template> </template>
<template #extraForm> </FormModel>
<VnForm
class="no-form-container q-mt-md"
ref="vnFormRef2"
:pks="pks"
table="myClient"
schema="hedera"
:fetch-form-data-sql="fetchConfigDataSql"
:default-actions="false"
@on-data-fetched="$event => formatMailData($event)"
>
<template #form="{ data }">
<QCheckbox
v-model="data.isToBeMailed"
:label="t('isToBeMailed')"
:toggle-indeterminate="false"
@update:model-value="vnFormRef2.submit()"
dense
/>
</template>
</VnForm>
</template>
</VnForm>
</QPage> </QPage>
<QDialog <QDialog
ref="changePasswordFormDialog" ref="changePasswordFormDialog"

View File

@ -38,8 +38,8 @@ export const useUserStore = defineStore('user', () => {
router.push({ name: 'login' }); router.push({ name: 'login' });
} }
} else { } else {
await fetchTokenConfig();
await fetchUser(); await fetchUser();
await fetchTokenConfig();
await supplantInit(); await supplantInit();
startInterval(); startInterval();
} }