feat: Add model feature for piece and component
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user