feat(model-types): add related-items modal and guard category edits

This commit is contained in:
Matthieu
2026-01-25 20:29:28 +01:00
parent adccfa9b46
commit a7101c7e77
7 changed files with 414 additions and 2 deletions

View File

@@ -26,6 +26,8 @@
:initial-data="initialData"
:lock-category="true"
:saving="saving"
:disable-submit="isSubmitBlocked"
:disable-submit-message="submitBlockMessage"
@submit="handleSubmit"
@cancel="handleCancel"
/>
@@ -38,6 +40,7 @@ import { computed, onMounted, ref } from 'vue'
import { useHead, useRoute, useRouter } from '#imports'
import ModelTypeForm from '~/components/model-types/ModelTypeForm.vue'
import { getModelType, updateModelType, type ModelTypePayload } from '~/services/modelTypes'
import { useCategoryEditGuard } from '~/composables/useCategoryEditGuard'
import { useToast } from '~/composables/useToast'
const route = useRoute()
@@ -48,6 +51,21 @@ const loading = ref(true)
const saving = ref(false)
const initialData = ref<Partial<ModelTypePayload> | null>(null)
const {
isSubmitBlocked,
submitBlockMessage,
loadLinkedCount,
guardSubmitOrNotify,
} = useCategoryEditGuard({
endpoint: '/composants',
filterKey: 'typeComposant',
labels: {
singular: 'composant',
plural: 'composants',
verifying: 'Vérification des composants liés en cours…',
},
})
const title = computed(() =>
initialData.value?.name
? `Modifier « ${initialData.value.name} »`
@@ -88,6 +106,8 @@ const loadCategory = async () => {
notes: response.notes ?? response.description ?? '',
structure: response.structure ?? undefined,
}
await loadLinkedCount(id)
} catch (error) {
showError(normalizeError(error))
await navigateBackToList()
@@ -101,6 +121,9 @@ const handleCancel = () => {
}
const handleSubmit = async (payload: Parameters<typeof updateModelType>[1]) => {
if (guardSubmitOrNotify()) {
return
}
const id = String(route.params.id)
saving.value = true
try {

View File

@@ -26,6 +26,8 @@
:initial-data="initialData"
:lock-category="true"
:saving="saving"
:disable-submit="isSubmitBlocked"
:disable-submit-message="submitBlockMessage"
@submit="handleSubmit"
@cancel="handleCancel"
/>
@@ -38,6 +40,7 @@ import { computed, onMounted, ref } from 'vue'
import { useHead, useRoute, useRouter } from '#imports'
import ModelTypeForm from '~/components/model-types/ModelTypeForm.vue'
import { getModelType, updateModelType, type ModelTypePayload } from '~/services/modelTypes'
import { useCategoryEditGuard } from '~/composables/useCategoryEditGuard'
import { useToast } from '~/composables/useToast'
const route = useRoute()
@@ -48,6 +51,21 @@ const loading = ref(true)
const saving = ref(false)
const initialData = ref<Partial<ModelTypePayload> | null>(null)
const {
isSubmitBlocked,
submitBlockMessage,
loadLinkedCount,
guardSubmitOrNotify,
} = useCategoryEditGuard({
endpoint: '/pieces',
filterKey: 'typePiece',
labels: {
singular: 'pièce',
plural: 'pièces',
verifying: 'Vérification des pièces liées en cours…',
},
})
const title = computed(() =>
initialData.value?.name ? `Modifier « ${initialData.value.name} »` : 'Modifier une catégorie de pièce',
)
@@ -86,6 +104,8 @@ const loadCategory = async () => {
notes: response.notes ?? response.description ?? '',
structure: response.structure ?? undefined,
}
await loadLinkedCount(id)
} catch (error) {
showError(normalizeError(error))
await navigateBackToList()
@@ -99,6 +119,9 @@ const handleCancel = () => {
}
const handleSubmit = async (payload: Parameters<typeof updateModelType>[1]) => {
if (guardSubmitOrNotify()) {
return
}
const id = String(route.params.id)
saving.value = true
try {

View File

@@ -26,6 +26,8 @@
:initial-data="initialData"
:lock-category="true"
:saving="saving"
:disable-submit="isSubmitBlocked"
:disable-submit-message="submitBlockMessage"
@submit="handleSubmit"
@cancel="handleCancel"
/>
@@ -38,6 +40,7 @@ import { computed, onMounted, ref } from 'vue'
import { useHead, useRoute, useRouter } from '#imports'
import ModelTypeForm from '~/components/model-types/ModelTypeForm.vue'
import { getModelType, updateModelType, type ModelTypePayload } from '~/services/modelTypes'
import { useCategoryEditGuard } from '~/composables/useCategoryEditGuard'
import { useToast } from '~/composables/useToast'
const route = useRoute()
@@ -48,6 +51,21 @@ const loading = ref(true)
const saving = ref(false)
const initialData = ref<Partial<ModelTypePayload> | null>(null)
const {
isSubmitBlocked,
submitBlockMessage,
loadLinkedCount,
guardSubmitOrNotify,
} = useCategoryEditGuard({
endpoint: '/products',
filterKey: 'typeProduct',
labels: {
singular: 'produit',
plural: 'produits',
verifying: 'Vérification des produits liés en cours…',
},
})
const title = computed(() =>
initialData.value?.name ? `Modifier « ${initialData.value.name} »` : 'Modifier une catégorie de produit',
)
@@ -86,6 +104,8 @@ const loadCategory = async () => {
notes: response.notes ?? response.description ?? '',
structure: response.structure ?? undefined,
}
await loadLinkedCount(id)
} catch (error) {
showError(normalizeError(error))
await navigateBackToList()
@@ -99,6 +119,9 @@ const handleCancel = () => {
}
const handleSubmit = async (payload: Parameters<typeof updateModelType>[1]) => {
if (guardSubmitOrNotify()) {
return
}
const id = String(route.params.id)
saving.value = true
try {