diff --git a/app/app.vue b/app/app.vue
index 40d80c5..988b270 100644
--- a/app/app.vue
+++ b/app/app.vue
@@ -16,6 +16,7 @@
Emplacement:
@@ -229,6 +230,7 @@ import { useToast } from '~/composables/useToast'
import { useDocuments } from '~/composables/useDocuments'
import { getFileIcon } from '~/utils/fileIcons'
import DocumentUpload from '~/components/DocumentUpload.vue'
+import ConstructeurSelect from './ConstructeurSelect.vue'
const props = defineProps({
piece: {
@@ -247,7 +249,6 @@ const emit = defineEmits(['update', 'edit', 'custom-field-update'])
const pieceData = reactive({
name: props.piece.name || '',
reference: props.piece.reference || '',
- constructeur: props.piece.constructeur || '',
emplacement: props.piece.emplacement || '',
prix: props.piece.prix || ''
})
@@ -336,6 +337,17 @@ watch(
}
)
+watch(
+ () => props.piece.constructeurId,
+ (newVal, oldVal) => {
+ if (!props.isEditMode) return
+ if (oldVal === undefined) return
+ if (newVal !== oldVal) {
+ updatePiece()
+ }
+ }
+)
+
// Méthodes pour gérer les champs personnalisés
const setCustomFieldValue = (fieldValueId, value) => {
const fieldValue = props.piece.customFieldValues?.find(fv => fv.id === fieldValueId)
@@ -349,7 +361,8 @@ const updatePiece = () => {
emit('update', {
...props.piece,
...pieceData,
- prix: prixValue && prixValue !== '' ? parseFloat(prixValue) : null
+ prix: prixValue && prixValue !== '' ? parseFloat(prixValue) : null,
+ constructeurId: props.piece.constructeurId || null,
})
}
@@ -377,7 +390,6 @@ onMounted(() => {
// Initialiser les données avec les props
pieceData.name = props.piece.name || ''
pieceData.reference = props.piece.reference || ''
- pieceData.constructeur = props.piece.constructeur || ''
pieceData.emplacement = props.piece.emplacement || ''
pieceData.prix = props.piece.prix || ''
diff --git a/app/composables/useComposants.js b/app/composables/useComposants.js
index 54e3b26..88f7991 100644
--- a/app/composables/useComposants.js
+++ b/app/composables/useComposants.js
@@ -78,11 +78,12 @@ export function useComposants() {
try {
const result = await patch(`/composants/${id}`, composantData)
if (result.success) {
+ const updated = result.data
const index = composants.value.findIndex(comp => comp.id === id)
if (index !== -1) {
- composants.value[index] = result.data
+ composants.value[index] = updated
}
- showSuccess(`Composant "${composantData.name}" mis à jour avec succès`)
+ showSuccess(`Composant "${updated?.name || composantData.name || ''}" mis à jour avec succès`)
}
return result
} catch (error) {
@@ -131,4 +132,4 @@ export function useComposants() {
getComposants,
isLoading
}
-}
\ No newline at end of file
+}
diff --git a/app/composables/useConstructeurs.js b/app/composables/useConstructeurs.js
new file mode 100644
index 0000000..fb11f6a
--- /dev/null
+++ b/app/composables/useConstructeurs.js
@@ -0,0 +1,108 @@
+import { ref } from 'vue'
+import { useApi } from './useApi'
+import { useToast } from './useToast'
+
+const constructeurs = ref([])
+const loading = ref(false)
+
+export function useConstructeurs() {
+ const { get, post, patch, delete: del } = useApi()
+ const { showSuccess, showError } = useToast()
+
+ const loadConstructeurs = async (search = '') => {
+ loading.value = true
+ try {
+ const query = search ? `?search=${encodeURIComponent(search)}` : ''
+ const result = await get(`/constructeurs${query}`)
+ if (result.success) {
+ constructeurs.value = result.data
+ }
+ return result
+ } catch (error) {
+ console.error('Erreur lors du chargement des constructeurs:', error)
+ return { success: false, error: error.message }
+ } finally {
+ loading.value = false
+ }
+ }
+
+ const searchConstructeurs = async (search = '') => {
+ return loadConstructeurs(search)
+ }
+
+ const createConstructeur = async (data) => {
+ loading.value = true
+ try {
+ const result = await post('/constructeurs', data)
+ if (result.success) {
+ constructeurs.value = [result.data, ...constructeurs.value]
+ showSuccess(`Constructeur "${result.data.name}" créé`)
+ } else if (result.error) {
+ showError(result.error)
+ }
+ return result
+ } catch (error) {
+ console.error('Erreur lors de la création du constructeur:', error)
+ showError("Impossible de créer le constructeur")
+ return { success: false, error: error.message }
+ } finally {
+ loading.value = false
+ }
+ }
+
+ const updateConstructeur = async (id, data) => {
+ loading.value = true
+ try {
+ const result = await patch(`/constructeurs/${id}`, data)
+ if (result.success) {
+ const index = constructeurs.value.findIndex(item => item.id === id)
+ if (index !== -1) {
+ constructeurs.value[index] = result.data
+ }
+ showSuccess(`Constructeur "${result.data.name}" mis à jour`)
+ } else if (result.error) {
+ showError(result.error)
+ }
+ return result
+ } catch (error) {
+ console.error('Erreur lors de la mise à jour du constructeur:', error)
+ showError("Impossible de mettre à jour le constructeur")
+ return { success: false, error: error.message }
+ } finally {
+ loading.value = false
+ }
+ }
+
+ const deleteConstructeur = async (id) => {
+ loading.value = true
+ try {
+ const result = await del(`/constructeurs/${id}`)
+ if (result.success) {
+ constructeurs.value = constructeurs.value.filter(item => item.id !== id)
+ showSuccess('Constructeur supprimé')
+ } else if (result.error) {
+ showError(result.error)
+ }
+ return result
+ } catch (error) {
+ console.error('Erreur lors de la suppression du constructeur:', error)
+ showError("Impossible de supprimer le constructeur")
+ return { success: false, error: error.message }
+ } finally {
+ loading.value = false
+ }
+ }
+
+ const getConstructeurById = (id) => constructeurs.value.find(item => item.id === id)
+
+ return {
+ constructeurs,
+ loading,
+ loadConstructeurs,
+ searchConstructeurs,
+ createConstructeur,
+ updateConstructeur,
+ deleteConstructeur,
+ getConstructeurById,
+ }
+}
diff --git a/app/composables/useMachines.js b/app/composables/useMachines.js
index adfda1e..eb50e76 100644
--- a/app/composables/useMachines.js
+++ b/app/composables/useMachines.js
@@ -62,7 +62,7 @@ export function useMachines() {
if (index !== -1) {
machines.value[index] = result.data
}
- showSuccess(`Machine "${machineData.name}" mise à jour avec succès`)
+ showSuccess(`Machine "${result.data?.name || machineData.name || ''}" mise à jour avec succès`)
}
return result
} catch (error) {
@@ -120,4 +120,4 @@ export function useMachines() {
getMachines,
isLoading
}
-}
\ No newline at end of file
+}
diff --git a/app/composables/usePieces.js b/app/composables/usePieces.js
index 337ec21..581a795 100644
--- a/app/composables/usePieces.js
+++ b/app/composables/usePieces.js
@@ -78,11 +78,12 @@ export function usePieces() {
try {
const result = await patch(`/pieces/${id}`, pieceData)
if (result.success) {
+ const updated = result.data
const index = pieces.value.findIndex(piece => piece.id === id)
if (index !== -1) {
- pieces.value[index] = result.data
+ pieces.value[index] = updated
}
- showSuccess(`Pièce "${pieceData.name}" mise à jour avec succès`)
+ showSuccess(`Pièce "${updated?.name || pieceData.name || ''}" mise à jour avec succès`)
}
return result
} catch (error) {
@@ -131,4 +132,4 @@ export function usePieces() {
getPieces,
isLoading
}
-}
\ No newline at end of file
+}
diff --git a/app/pages/constructeurs.vue b/app/pages/constructeurs.vue
new file mode 100644
index 0000000..dc96978
--- /dev/null
+++ b/app/pages/constructeurs.vue
@@ -0,0 +1,201 @@
+
+
+
+
+
Constructeurs
+
Gérez les constructeurs et leurs coordonnées.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Chargement des constructeurs...
+
+
+
+ Aucun constructeur trouvé.
+
+
+
+
+
+
+ | Nom |
+ Email |
+ Téléphone |
+ Actions |
+
+
+
+
+ | {{ constructeur.name }} |
+ {{ constructeur.email || '—' }} |
+ {{ constructeur.phone || '—' }} |
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/pages/machine/[id].vue b/app/pages/machine/[id].vue
index 8cdd7d4..19f66ff 100644
--- a/app/pages/machine/[id].vue
+++ b/app/pages/machine/[id].vue
@@ -105,16 +105,19 @@
-
@@ -350,7 +353,7 @@