0
1
Fork 0

News view refactor

This commit is contained in:
William Buezas 2025-03-25 10:53:52 +01:00
parent f8cf865e04
commit 6cb8267a0b
4 changed files with 48 additions and 47 deletions

View File

@ -69,6 +69,10 @@ const props = defineProps({
filter: {
type: Object,
default: null
},
dataRequired: {
type: Object,
default: () => {}
}
});
@ -122,9 +126,10 @@ onMounted(async () => {
async function fetch() {
try {
let { data } = await api.get(props.url, {
params: { filter: JSON.stringify(props.filter) }
});
const params = props.filter
? { filter: JSON.stringify(props.filter) }
: {};
let { data } = await api.get(props.url, { params });
if (Array.isArray(data)) data = data[0] ?? {};
formData.value = { ...data };
emit('onDataFetched', formData.value);
@ -144,9 +149,10 @@ async function save() {
isLoading.value = true;
try {
const body = props.mapper
let body = props.mapper
? props.mapper(formData.value, originalData.value)
: formData.value;
body = { ...body, ...props.dataRequired };
const method = props.urlCreate ? 'post' : 'patch';
const url = props.urlCreate || props.urlUpdate || props.url;

View File

@ -7,19 +7,21 @@ import VnImg from 'src/components/ui/VnImg.vue';
import VnForm from 'src/components/common/VnForm.vue';
import VnSelect from 'src/components/common/VnSelect.vue';
import VnInput from 'src/components/common/VnInput.vue';
import FormModel from 'src/components/common/FormModel.vue';
import { useAppStore } from 'stores/app';
import { useUserStore } from 'stores/user';
import { storeToRefs } from 'pinia';
const jApi = inject('jApi');
const api = inject('api');
const { t } = useI18n();
const route = useRoute();
const router = useRouter();
const appStore = useAppStore();
const userStore = useUserStore();
const { isHeaderMounted } = storeToRefs(appStore);
const newsTags = ref([]);
const pks = computed(() => ({ id: route.params.id }));
const isEditMode = !!route.params.id;
const formData = ref(
!route.params.id
@ -32,22 +34,25 @@ const formData = ref(
: undefined
);
const fetchNewDataSql = computed(() => {
const initialFetchUrl = computed(() => {
if (!route.params.id) return undefined;
return {
query: `
SELECT id, title, text, tag, priority, image
FROM news WHERE id = #id`,
params: { id: route.params.id }
};
return `news/${route.params.id}`;
});
const urlUpdate = computed(() => {
if (!route.params.id) return undefined;
return `news/${route.params.id}`;
});
const urlCreate = computed(() => {
if (route.params.id) return undefined;
return 'news';
});
const getNewsTag = async () => {
try {
newsTags.value = await jApi.query(
`SELECT name, description FROM newsTag
ORDER BY description`
);
const { data } = await api.get('newsTags');
newsTags.value = data;
} catch (error) {
console.error('Error getting newsTag:', error);
}
@ -73,19 +78,14 @@ onMounted(async () => {
<QTooltip>{{ t('back') }}</QTooltip>
</QBtn>
</Teleport>
<VnForm
ref="vnFormRef"
:fetch-form-data-sql="fetchNewDataSql"
<FormModel
:form-initial-data="formData"
:create-model-default="{
field: 'userFk',
value: 'account.myUser_getId()'
}"
:pks="pks"
:is-edit-mode="isEditMode"
table="news"
schema="hedera"
separation-between-inputs="lg"
:url="initialFetchUrl"
:auto-load="isEditMode"
:url-create="urlCreate"
:url-update="urlUpdate"
:data-required="{ userFk: userStore.userId }"
:show-bottom-actions="false"
@on-data-saved="goBack()"
>
<template #form="{ data }">
@ -215,7 +215,7 @@ onMounted(async () => {
}"
/>
</template>
</VnForm>
</FormModel>
</QPage>
</template>

View File

@ -5,13 +5,14 @@ import { useI18n } from 'vue-i18n';
import CardList from 'src/components/ui/CardList.vue';
import VnImg from 'src/components/ui/VnImg.vue';
import VnList from 'src/components/ui/VnList.vue';
import FormModel from 'src/components/common/FormModel.vue';
import { useAppStore } from 'stores/app';
import { storeToRefs } from 'pinia';
import { useVnConfirm } from 'src/composables/useVnConfirm.js';
import useNotify from 'src/composables/useNotify.js';
const jApi = inject('jApi');
const api = inject('api');
const { t } = useI18n();
const appStore = useAppStore();
const { openConfirmationModal } = useVnConfirm();
@ -24,28 +25,19 @@ const news = ref([]);
const getNews = async () => {
try {
loading.value = true;
news.value = await jApi.query(
`SELECT n.id, u.nickname, n.priority, n.image, n.title
FROM news n
JOIN account.user u ON u.id = n.userFk
ORDER BY priority, n.created DESC`
);
loading.value = false;
const { data } = await api.get('news');
news.value = data;
} catch (error) {
console.error('Error getting news:', error);
} finally {
loading.value = false;
}
};
const deleteNew = async (id, index) => {
try {
await jApi.execQuery(
`START TRANSACTION;
DELETE FROM hedera.news WHERE ((id = #id));
COMMIT`,
{
id
}
);
await api.delete(`news/${id}`);
news.value.splice(index, 1);
notify(t('dataSaved'), 'positive');
} catch (error) {

View File

@ -296,6 +296,8 @@ export const useUserStore = defineStore('user', () => {
tokenConfig.value = null;
};
const userId = computed(() => user.value?.id);
watch(
[mainUser, supplantedUser],
() => (user.value = supplantedUser.value || mainUser.value),
@ -336,6 +338,7 @@ export const useUserStore = defineStore('user', () => {
updateUserLang,
init,
$reset,
onLogin
onLogin,
userId
};
});