8627-devToTest #1421

Merged
alexm merged 768 commits from 8627-devToTest into test 2025-02-18 12:37:37 +00:00
8 changed files with 53 additions and 65 deletions
Showing only changes of commit 02a1554b21 - Show all commits

View File

@ -131,7 +131,13 @@ onMounted(async () => {
if (!$props.formInitialData) { if (!$props.formInitialData) {
if ($props.autoLoad && $props.url) await fetch(); if ($props.autoLoad && $props.url) await fetch();
else if (arrayData.store.data) updateAndEmit('onFetch', arrayData.store.data); else if (arrayData.store.data)
updateAndEmit(
'onFetch',
Array.isArray(arrayData.store.data)
? arrayData.store.data[0]
: arrayData.store.data
);
} }
if ($props.observeFormChanges) { if ($props.observeFormChanges) {
watch( watch(
@ -151,7 +157,10 @@ onMounted(async () => {
if (!$props.url) if (!$props.url)
watch( watch(
() => arrayData.store.data, () => arrayData.store.data,
(val) => updateAndEmit('onFetch', val) (val) => {
if (Array.isArray(val)) val = val[0] ?? {};
updateAndEmit('onFetch', val);
}
); );
watch( watch(

View File

@ -47,17 +47,15 @@ onBeforeMount(async () => {
} }
}); });
if (!props.idInWhere) { onBeforeRouteUpdate(async (to, from) => {
onBeforeRouteUpdate(async (to, from) => { if (to.params.id !== from.params.id) {
if (to.params.id !== from.params.id) { arrayData.store.url = !regex.test(props.url)
arrayData.store.url = !regex.test(props.url) ? `${props.url}/${to.params.id}`
? `${props.url}/${to.params.id}` : props.url.replace(regex, `/${to.params.id}`);
: props.url.replace(regex, `/${to.params.id}`);
await arrayData.fetch({ append: false, updateRouter: false }); await arrayData.fetch({ append: false, updateRouter: false });
} }
}); });
}
</script> </script>
<template> <template>
<QDrawer <QDrawer

View File

@ -0,0 +1,16 @@
export default (param, value) => {
switch (param) {
case 'search':
return /^\d+$/.test(value)
? { id: value }
: {
or: [
{ name: { like: `%${value}%` } },
{ nickname: { like: `%${value}%` } },
],
};
case 'name':
case 'description':
return { [param]: { like: `%${value}%` } };
}
};

View File

@ -6,6 +6,7 @@ import { useRoute } from 'vue-router';
import VnSearchbar from 'components/ui/VnSearchbar.vue'; import VnSearchbar from 'components/ui/VnSearchbar.vue';
import { useSummaryDialog } from 'src/composables/useSummaryDialog'; import { useSummaryDialog } from 'src/composables/useSummaryDialog';
import RoleSummary from './Card/RoleSummary.vue'; import RoleSummary from './Card/RoleSummary.vue';
import exprBuilder from './AccountExprBuilder.js';
const route = useRoute(); const route = useRoute();
const { t } = useI18n(); const { t } = useI18n();
const $props = defineProps({ const $props = defineProps({
@ -62,24 +63,7 @@ const columns = computed(() => [
], ],
}, },
]); ]);
const exprBuilder = (param, value) => {
switch (param) {
case 'search':
return /^\d+$/.test(value)
? { id: value }
: {
or: [
{ name: { like: `%${value}%` } },
{ nickname: { like: `%${value}%` } },
],
};
case 'name':
case 'description':
return { [param]: { like: `%${value}%` } };
}
};
</script> </script>
<template> <template>
<VnSearchbar <VnSearchbar
data-key="Roles" data-key="Roles"

View File

@ -1,24 +1,16 @@
<script setup> <script setup>
import { useRoute } from 'vue-router';
import { useI18n } from 'vue-i18n';
import FormModel from 'components/FormModel.vue'; import FormModel from 'components/FormModel.vue';
import VnRow from 'components/ui/VnRow.vue'; import VnRow from 'components/ui/VnRow.vue';
import VnInput from 'src/components/common/VnInput.vue'; import VnInput from 'src/components/common/VnInput.vue';
const route = useRoute();
const { t } = useI18n();
</script> </script>
<template> <template>
<FormModel :url="`VnRoles/${route.params.id}`" model="VnRole" auto-load> <FormModel model="Role" auto-load>
<template #form="{ data }"> <template #form="{ data }">
<VnRow> <VnRow>
<div class="col"> <VnInput v-model="data.name" :label="$t('globals.name')" />
<VnInput v-model="data.name" :label="t('globals.name')" />
</div>
</VnRow> </VnRow>
<VnRow> <VnRow>
<div class="col"> <VnInput v-model="data.description" :label="$t('role.description')" />
<VnInput v-model="data.description" :label="t('role.description')" />
</div>
</VnRow> </VnRow>
</template> </template>
</FormModel> </FormModel>

View File

@ -1,20 +1,21 @@
<script setup> <script setup>
import { useI18n } from 'vue-i18n';
import VnCard from 'components/common/VnCard.vue'; import VnCard from 'components/common/VnCard.vue';
import RoleDescriptor from './RoleDescriptor.vue'; import RoleDescriptor from './RoleDescriptor.vue';
import exprBuilder from '../AccountExprBuilder.js';
const { t } = useI18n();
</script> </script>
<template> <template>
<VnCard <VnCard
url="VnRoles"
:id-in-where="true"
data-key="Role" data-key="Role"
:descriptor="RoleDescriptor" :descriptor="RoleDescriptor"
search-data-key="AccountRoles" search-data-key="Roles"
:searchbar-props="{ :searchbar-props="{
url: 'VnRoles', url: 'VnRoles',
label: t('role.searchRoles'), label: $t('role.searchRoles'),
info: t('role.searchInfo'), info: $t('role.searchInfo'),
searchUrl: 'table', searchUrl: 'table',
exprBuilder,
}" }"
/> />
</template> </template>

View File

@ -1,10 +1,9 @@
<script setup> <script setup>
import { ref, computed } from 'vue'; import { computed } from 'vue';
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import CardDescriptor from 'components/ui/CardDescriptor.vue'; import CardDescriptor from 'components/ui/CardDescriptor.vue';
import VnLv from 'src/components/ui/VnLv.vue'; import VnLv from 'src/components/ui/VnLv.vue';
import useCardDescription from 'src/composables/useCardDescription';
import axios from 'axios'; import axios from 'axios';
import useNotify from 'src/composables/useNotify.js'; import useNotify from 'src/composables/useNotify.js';
const $props = defineProps({ const $props = defineProps({
@ -26,11 +25,6 @@ const { t } = useI18n();
const entityId = computed(() => { const entityId = computed(() => {
return $props.id || route.params.id; return $props.id || route.params.id;
}); });
const data = ref(useCardDescription());
const setData = (entity) => (data.value = useCardDescription(entity.name, entity.id));
const filter = {
where: { id: entityId },
};
const removeRole = async () => { const removeRole = async () => {
try { try {
await axios.delete(`VnRoles/${entityId.value}`); await axios.delete(`VnRoles/${entityId.value}`);
@ -43,13 +37,10 @@ const removeRole = async () => {
<template> <template>
<CardDescriptor <CardDescriptor
:url="`VnRoles/${entityId}`" url="VnRoles"
:filter="filter" :filter="{ where: { id: entityId } }"
module="Role" module="Role"
@on-fetch="setData" data-key="Role"
data-key="accountData"
:title="data.title"
:subtitle="data.subtitle"
:summary="$props.summary" :summary="$props.summary"
> >
<template #menu> <template #menu>

View File

@ -19,18 +19,15 @@ const $props = defineProps({
const { store } = useArrayData('Role'); const { store } = useArrayData('Role');
const role = ref(store.data); const role = ref(store.data);
const entityId = computed(() => $props.id || route.params.id); const entityId = computed(() => $props.id || route.params.id);
const filter = {
where: { id: entityId },
};
</script> </script>
<template> <template>
<CardSummary <CardSummary
ref="summary" ref="summary"
:url="`VnRoles`" url="VnRoles"
:filter="filter" :filter="{ where: { id: entityId } }"
@on-fetch="(data) => (role = data)" @on-fetch="(data) => (role = data)"
data-key="RoleSummary" data-key="Role"
> >
<template #header> {{ role.id }} - {{ role.name }} </template> <template #header> {{ role.id }} - {{ role.name }} </template>
<template #body> <template #body>