Files
Inventory/app/composables/usePieceModels.js
2025-09-26 11:29:47 +02:00

132 lines
4.1 KiB
JavaScript

import { ref, computed } from 'vue'
import { useApi } from './useApi'
import { useToast } from './useToast'
const pieceModelsBuckets = ref({})
const loadingPieceModels = ref(false)
export function usePieceModels () {
const { get, post, patch, delete: del } = useApi()
const { showSuccess, showError } = useToast()
const loadPieceModels = async (typePieceId) => {
loadingPieceModels.value = true
try {
const query = typePieceId ? `?typePieceId=${encodeURIComponent(typePieceId)}` : ''
const result = await get(`/types/pieces/models${query}`)
if (result.success) {
const key = typePieceId || '__all__'
pieceModelsBuckets.value = {
...pieceModelsBuckets.value,
[key]: result.data
}
}
return result
} catch (error) {
showError(`Impossible de charger les modèles de pièce: ${error.message}`)
return { success: false, error: error.message }
} finally {
loadingPieceModels.value = false
}
}
const createPieceModel = async (payload) => {
loadingPieceModels.value = true
try {
const result = await post('/types/pieces/models', payload)
if (result.success) {
const key = result.data?.typePieceId || '__all__'
const bucket = pieceModelsBuckets.value[key] || []
pieceModelsBuckets.value = {
...pieceModelsBuckets.value,
[key]: [...bucket, result.data]
}
showSuccess(`Modèle de pièce "${result.data.name}" créé`)
}
return result
} catch (error) {
showError(`Erreur lors de la création du modèle de pièce: ${error.message}`)
return { success: false, error: error.message }
} finally {
loadingPieceModels.value = false
}
}
const updatePieceModel = async (id, payload) => {
loadingPieceModels.value = true
try {
const result = await patch(`/types/pieces/models/${id}`, payload)
if (result.success) {
const key = result.data?.typePieceId || '__all__'
const bucket = pieceModelsBuckets.value[key] || []
const updatedBucket = bucket.map(model =>
model.id === id ? result.data : model
)
pieceModelsBuckets.value = {
...pieceModelsBuckets.value,
[key]: updatedBucket
}
showSuccess(`Modèle de pièce "${result.data.name}" mis à jour`)
}
return result
} catch (error) {
showError(`Erreur lors de la mise à jour du modèle de pièce: ${error.message}`)
return { success: false, error: error.message }
} finally {
loadingPieceModels.value = false
}
}
const deletePieceModel = async (id) => {
loadingPieceModels.value = true
try {
const result = await del(`/types/pieces/models/${id}`)
if (result.success) {
const updatedBuckets = {}
for (const [key, bucket] of Object.entries(pieceModelsBuckets.value)) {
updatedBuckets[key] = bucket.filter(model => model.id !== id)
}
pieceModelsBuckets.value = updatedBuckets
showSuccess('Modèle de pièce supprimé')
}
return result
} catch (error) {
showError(`Erreur lors de la suppression du modèle de pièce: ${error.message}`)
return { success: false, error: error.message }
} finally {
loadingPieceModels.value = false
}
}
const allPieceModels = computed(() => {
return Object.values(pieceModelsBuckets.value).reduce((acc, bucket) => {
bucket.forEach((model) => {
if (!acc.find(existing => existing.id === model.id)) {
acc.push(model)
}
})
return acc
}, [])
})
const getPieceModelsForType = (typePieceId) => {
return pieceModelsBuckets.value[typePieceId] || []
}
const getPieceModels = () => allPieceModels.value
const isPieceModelLoading = () => loadingPieceModels.value
return {
pieceModels: allPieceModels,
pieceModelsBuckets,
loadingPieceModels,
loadPieceModels,
createPieceModel,
updatePieceModel,
deletePieceModel,
getPieceModels,
getPieceModelsForType,
isPieceModelLoading
}
}