feat: Add model feature for piece and component

This commit is contained in:
Matthieu
2025-09-23 15:06:19 +02:00
parent c1e170b088
commit 83b3e33b1e
15 changed files with 2018 additions and 851 deletions

View File

@@ -1,25 +1,43 @@
import { ref } from 'vue'
import { useApi } from './useApi'
import { listModelTypes, createModelType, updateModelType, deleteModelType } from '~/services/modelTypes'
import { useToast } from './useToast'
const componentTypes = ref([])
const loadingComponentTypes = ref(false)
export function useComponentTypes() {
const { get, post, patch, delete: del } = useApi()
const { showSuccess, showError } = useToast()
const generateCodeFromName = (name) => {
return (name || '')
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.toLowerCase()
.replace(/[^a-z0-9]+/g, '-')
.replace(/^-+|-+$/g, '')
.replace(/-+/g, '-') || 'type'
}
const loadComponentTypes = async () => {
loadingComponentTypes.value = true
try {
const result = await get('/types/composants')
if (result.success) {
componentTypes.value = result.data
}
return result
const data = await listModelTypes({
category: 'COMPONENT',
sort: 'name',
dir: 'asc',
limit: 200,
})
componentTypes.value = data.items.map((item) => ({
...item,
description: item.description ?? item.notes ?? null,
}))
return { success: true, data: componentTypes.value }
} catch (error) {
showError(`Impossible de charger les types de composant: ${error.message}`)
return { success: false, error: error.message }
const message = error?.message || 'Erreur inconnue'
showError(`Impossible de charger les types de composant: ${message}`)
return { success: false, error: message }
} finally {
loadingComponentTypes.value = false
}
@@ -28,15 +46,27 @@ export function useComponentTypes() {
const createComponentType = async (payload) => {
loadingComponentTypes.value = true
try {
const result = await post('/types/composants', payload)
if (result.success) {
componentTypes.value.push(result.data)
showSuccess(`Type de composant "${result.data.name}" créé`)
const data = await createModelType({
name: payload.name,
code: payload.code || generateCodeFromName(payload.name),
category: 'COMPONENT',
notes: payload.description ?? payload.notes,
description: payload.description ?? null,
})
const normalized = {
...data,
description: data.description ?? data.notes ?? null,
}
return result
componentTypes.value.push(normalized)
showSuccess(`Type de composant "${data.name}" créé`)
return { success: true, data: normalized }
} catch (error) {
showError(`Erreur lors de la création du type de composant: ${error.message}`)
return { success: false, error: error.message }
const message = error?.data?.message || error?.message || 'Erreur inconnue'
showError(`Erreur lors de la création du type de composant: ${message}`)
return { success: false, error: message }
} finally {
loadingComponentTypes.value = false
}
@@ -45,18 +75,32 @@ export function useComponentTypes() {
const updateComponentType = async (id, payload) => {
loadingComponentTypes.value = true
try {
const result = await patch(`/types/composants/${id}`, payload)
if (result.success) {
const index = componentTypes.value.findIndex((type) => type.id === id)
if (index !== -1) {
componentTypes.value[index] = result.data
}
showSuccess(`Type de composant "${result.data.name}" mis à jour`)
const data = await updateModelType(id, {
name: payload.name,
description: payload.description,
notes: payload.notes,
code: payload.code,
})
const normalized = {
...data,
description: data.description ?? data.notes ?? null,
}
const index = componentTypes.value.findIndex((type) => type.id === id)
if (index !== -1) {
componentTypes.value[index] = normalized
}
showSuccess(`Type de composant "${data.name}" mis à jour`)
return {
success: true,
data: normalized,
}
return result
} catch (error) {
showError(`Erreur lors de la mise à jour du type de composant: ${error.message}`)
return { success: false, error: error.message }
const message = error?.data?.message || error?.message || 'Erreur inconnue'
showError(`Erreur lors de la mise à jour du type de composant: ${message}`)
return { success: false, error: message }
} finally {
loadingComponentTypes.value = false
}
@@ -65,15 +109,14 @@ export function useComponentTypes() {
const deleteComponentType = async (id) => {
loadingComponentTypes.value = true
try {
const result = await del(`/types/composants/${id}`)
if (result.success) {
componentTypes.value = componentTypes.value.filter((type) => type.id !== id)
showSuccess('Type de composant supprimé')
}
return result
await deleteModelType(id)
componentTypes.value = componentTypes.value.filter((type) => type.id !== id)
showSuccess('Type de composant supprimé')
return { success: true }
} catch (error) {
showError(`Erreur lors de la suppression du type de composant: ${error.message}`)
return { success: false, error: error.message }
const message = error?.data?.message || error?.message || 'Erreur inconnue'
showError(`Erreur lors de la suppression du type de composant: ${message}`)
return { success: false, error: message }
} finally {
loadingComponentTypes.value = false
}

View File

@@ -1,25 +1,43 @@
import { ref } from 'vue'
import { useApi } from './useApi'
import { listModelTypes, createModelType, updateModelType, deleteModelType } from '~/services/modelTypes'
import { useToast } from './useToast'
const pieceTypes = ref([])
const loadingPieceTypes = ref(false)
export function usePieceTypes() {
const { get, post, patch, delete: del } = useApi()
const { showSuccess, showError } = useToast()
const generateCodeFromName = (name) => {
return (name || '')
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.toLowerCase()
.replace(/[^a-z0-9]+/g, '-')
.replace(/^-+|-+$/g, '')
.replace(/-+/g, '-') || 'type'
}
const loadPieceTypes = async () => {
loadingPieceTypes.value = true
try {
const result = await get('/types/pieces')
if (result.success) {
pieceTypes.value = result.data
}
return result
const data = await listModelTypes({
category: 'PIECE',
sort: 'name',
dir: 'asc',
limit: 200,
})
pieceTypes.value = data.items.map((item) => ({
...item,
description: item.description ?? item.notes ?? null,
}))
return { success: true, data: pieceTypes.value }
} catch (error) {
showError(`Impossible de charger les types de pièce: ${error.message}`)
return { success: false, error: error.message }
const message = error?.message || 'Erreur inconnue'
showError(`Impossible de charger les types de pièce: ${message}`)
return { success: false, error: message }
} finally {
loadingPieceTypes.value = false
}
@@ -28,15 +46,27 @@ export function usePieceTypes() {
const createPieceType = async (payload) => {
loadingPieceTypes.value = true
try {
const result = await post('/types/pieces', payload)
if (result.success) {
pieceTypes.value.push(result.data)
showSuccess(`Type de pièce "${result.data.name}" créé`)
const data = await createModelType({
name: payload.name,
code: payload.code || generateCodeFromName(payload.name),
category: 'PIECE',
notes: payload.description ?? payload.notes,
description: payload.description ?? null,
})
const normalized = {
...data,
description: data.description ?? data.notes ?? null,
}
return result
pieceTypes.value.push(normalized)
showSuccess(`Type de pièce "${data.name}" créé`)
return { success: true, data: normalized }
} catch (error) {
showError(`Erreur lors de la création du type de pièce: ${error.message}`)
return { success: false, error: error.message }
const message = error?.data?.message || error?.message || 'Erreur inconnue'
showError(`Erreur lors de la création du type de pièce: ${message}`)
return { success: false, error: message }
} finally {
loadingPieceTypes.value = false
}
@@ -45,18 +75,32 @@ export function usePieceTypes() {
const updatePieceType = async (id, payload) => {
loadingPieceTypes.value = true
try {
const result = await patch(`/types/pieces/${id}`, payload)
if (result.success) {
const index = pieceTypes.value.findIndex((type) => type.id === id)
if (index !== -1) {
pieceTypes.value[index] = result.data
}
showSuccess(`Type de pièce "${result.data.name}" mis à jour`)
const data = await updateModelType(id, {
name: payload.name,
description: payload.description,
notes: payload.notes,
code: payload.code,
})
const normalized = {
...data,
description: data.description ?? data.notes ?? null,
}
const index = pieceTypes.value.findIndex((type) => type.id === id)
if (index !== -1) {
pieceTypes.value[index] = normalized
}
showSuccess(`Type de pièce "${data.name}" mis à jour`)
return {
success: true,
data: normalized,
}
return result
} catch (error) {
showError(`Erreur lors de la mise à jour du type de pièce: ${error.message}`)
return { success: false, error: error.message }
const message = error?.data?.message || error?.message || 'Erreur inconnue'
showError(`Erreur lors de la mise à jour du type de pièce: ${message}`)
return { success: false, error: message }
} finally {
loadingPieceTypes.value = false
}
@@ -65,15 +109,14 @@ export function usePieceTypes() {
const deletePieceType = async (id) => {
loadingPieceTypes.value = true
try {
const result = await del(`/types/pieces/${id}`)
if (result.success) {
pieceTypes.value = pieceTypes.value.filter((type) => type.id !== id)
showSuccess('Type de pièce supprimé')
}
return result
await deleteModelType(id)
pieceTypes.value = pieceTypes.value.filter((type) => type.id !== id)
showSuccess('Type de pièce supprimé')
return { success: true }
} catch (error) {
showError(`Erreur lors de la suppression du type de pièce: ${error.message}`)
return { success: false, error: error.message }
const message = error?.data?.message || error?.message || 'Erreur inconnue'
showError(`Erreur lors de la suppression du type de pièce: ${message}`)
return { success: false, error: message }
} finally {
loadingPieceTypes.value = false
}