Restore catalogs and type-aware machine selection

This commit is contained in:
MatthieuTD
2025-10-06 17:19:30 +02:00
parent 082b1ccc05
commit f9641dbd62
4 changed files with 683 additions and 26 deletions

View File

@@ -159,6 +159,27 @@
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-3">
<div class="form-control md:col-span-2">
<label class="label">
<span class="label-text text-xs">Catégorie de composant</span>
</label>
<select
class="select select-bordered select-xs md:select-sm"
:value="entry.typeComposantId || requirement.typeComposantId || ''"
@change="setComponentRequirementType(requirement.id, entryIndex, ($event.target && $event.target.value) || '')"
>
<option value="">
{{ requirement.typeComposant?.name ? `Type du requirement (${requirement.typeComposant.name})` : 'Suivre le requirement' }}
</option>
<option
v-for="type in componentTypeOptions"
:key="type.id"
:value="type.id"
>
{{ type.name }}
</option>
</select>
</div>
<div class="form-control">
<label class="label">
<span class="label-text text-xs">Nom du composant</span>
@@ -266,6 +287,27 @@
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-3">
<div class="form-control md:col-span-2">
<label class="label">
<span class="label-text text-xs">Catégorie de pièce</span>
</label>
<select
class="select select-bordered select-xs md:select-sm"
:value="entry.typePieceId || requirement.typePieceId || ''"
@change="setPieceRequirementType(requirement.id, entryIndex, ($event.target && $event.target.value) || '')"
>
<option value="">
{{ requirement.typePiece?.name ? `Type du requirement (${requirement.typePiece.name})` : 'Suivre le requirement' }}
</option>
<option
v-for="type in pieceTypeOptions"
:key="type.id"
:value="type.id"
>
{{ type.name }}
</option>
</select>
</div>
<div class="form-control">
<label class="label">
<span class="label-text text-xs">Nom de la pièce</span>
@@ -559,6 +601,8 @@ import ConstructeurSelect from '~/components/ConstructeurSelect.vue'
import { useMachines } from '~/composables/useMachines'
import { useSites } from '~/composables/useSites'
import { useMachineTypesApi } from '~/composables/useMachineTypesApi'
import { useComponentTypes } from '~/composables/useComponentTypes'
import { usePieceTypes } from '~/composables/usePieceTypes'
import { useToast } from '~/composables/useToast'
import { sanitizeDefinitionOverrides } from '~/shared/modelUtils'
import IconLucidePlus from '~icons/lucide/plus'
@@ -571,6 +615,8 @@ import IconLucideCircle from '~icons/lucide/circle'
const { createMachine, createMachineFromType } = useMachines()
const { sites, loadSites } = useSites()
const { machineTypes, loadMachineTypes } = useMachineTypesApi()
const { componentTypes, loadComponentTypes } = useComponentTypes()
const { pieceTypes, loadPieceTypes } = usePieceTypes()
const toast = useToast()
const submitting = ref(false)
@@ -592,6 +638,9 @@ const selectedMachineType = computed(() => {
return machineTypes.value.find(type => type.id === newMachine.typeMachineId) || null
})
const componentTypeOptions = computed(() => componentTypes.value || [])
const pieceTypeOptions = computed(() => pieceTypes.value || [])
const getStatusBadgeClass = (status) => {
if (status === 'ready') {
return 'badge-success'
@@ -602,12 +651,46 @@ const getStatusBadgeClass = (status) => {
return 'badge-error'
}
const componentTypeLabelMap = computed(() => {
const map = new Map()
componentTypeOptions.value.forEach((type) => {
if (type?.id) {
map.set(type.id, type.name || '')
}
})
const requirementTypes = selectedMachineType.value?.componentRequirements || []
requirementTypes.forEach((requirement) => {
const type = requirement?.typeComposant
if (type?.id && type?.name) {
map.set(type.id, type.name)
}
})
return map
})
const pieceTypeLabelMap = computed(() => {
const map = new Map()
pieceTypeOptions.value.forEach((type) => {
if (type?.id) {
map.set(type.id, type.name || '')
}
})
const requirementTypes = selectedMachineType.value?.pieceRequirements || []
requirementTypes.forEach((requirement) => {
const type = requirement?.typePiece
if (type?.id && type?.name) {
map.set(type.id, type.name)
}
})
return map
})
const resolveComponentRequirementTypeLabel = (requirement, entry) => {
const typeId = entry?.typeComposantId || requirement?.typeComposantId || null
if (!typeId) {
return requirement?.typeComposant?.name || 'Type non défini'
}
return requirement?.typeComposant?.name || 'Type non défini'
return componentTypeLabelMap.value.get(typeId) || requirement?.typeComposant?.name || 'Type non défini'
}
const resolvePieceRequirementTypeLabel = (requirement, entry) => {
@@ -615,7 +698,7 @@ const resolvePieceRequirementTypeLabel = (requirement, entry) => {
if (!typeId) {
return requirement?.typePiece?.name || 'Type non défini'
}
return requirement?.typePiece?.name || 'Type non défini'
return pieceTypeLabelMap.value.get(typeId) || requirement?.typePiece?.name || 'Type non défini'
}
const getComponentRequirementEntries = requirementId => componentRequirementSelections[requirementId] || []
@@ -680,6 +763,13 @@ const removeComponentSelectionEntry = (requirementId, index) => {
componentRequirementSelections[requirementId] = entries.filter((_, i) => i !== index)
}
const setComponentRequirementType = (requirementId, index, value) => {
const entries = getComponentRequirementEntries(requirementId)
const entry = entries[index]
if (!entry) return
entry.typeComposantId = value || null
}
const setComponentRequirementConstructeur = (requirementId, index, value) => {
const entries = getComponentRequirementEntries(requirementId)
const entry = entries[index]
@@ -705,6 +795,13 @@ const removePieceSelectionEntry = (requirementId, index) => {
pieceRequirementSelections[requirementId] = entries.filter((_, i) => i !== index)
}
const setPieceRequirementType = (requirementId, index, value) => {
const entries = getPieceRequirementEntries(requirementId)
const entry = entries[index]
if (!entry) return
entry.typePieceId = value || null
}
const setPieceRequirementConstructeur = (requirementId, index, value) => {
const entries = getPieceRequirementEntries(requirementId)
const entry = entries[index]
@@ -1153,7 +1250,9 @@ watch(
onMounted(async () => {
await Promise.all([
loadSites(),
loadMachineTypes()
loadMachineTypes(),
loadComponentTypes(),
loadPieceTypes()
])
})
</script>