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 @@
  • Sites
  • Générateur
  • Documents
  • +
  • Constructeurs
  • @@ -37,6 +38,7 @@
  • Sites
  • Générateur
  • Documents
  • +
  • Constructeurs
  • -
    - - -
    {{ component.constructeur || 'Non défini' }}
    -
    {{ component.prix ? `${component.prix}€` : 'Non défini' }}
    +
    + + +
    +
    + {{ component.constructeur?.name || 'Non défini' }} + + {{ [component.constructeur?.email, component.constructeur?.phone].filter(Boolean).join(' • ') }} + +
    +
    +
    @@ -251,7 +255,9 @@ import { ref, watch, computed } from 'vue' import PieceItem from './PieceItem.vue' import DocumentUpload from './DocumentUpload.vue' +import ConstructeurSelect from './ConstructeurSelect.vue' import { useDocuments } from '~/composables/useDocuments' +import { getFileIcon } from '~/utils/fileIcons' const props = defineProps({ component: { @@ -280,6 +286,7 @@ const uploadingDocuments = ref(false) const loadingDocuments = ref(false) const documentsLoaded = ref(!!(props.component.documents && props.component.documents.length)) const componentDocuments = computed(() => props.component.documents || []) +const documentIcon = (doc) => getFileIcon({ name: doc.filename || doc.name, mime: doc.mimeType }) const { uploadDocuments, deleteDocument, loadDocumentsByComponent } = useDocuments() @@ -294,6 +301,17 @@ watch( { immediate: true } ) +watch( + () => props.component.constructeurId, + (newVal, oldVal) => { + if (!props.isEditMode) return + if (oldVal === undefined) return + if (newVal !== oldVal) { + updateComponent() + } + } +) + watch( () => props.component.documents, (docs) => { diff --git a/app/components/ConstructeurSelect.vue b/app/components/ConstructeurSelect.vue new file mode 100644 index 0000000..749a592 --- /dev/null +++ b/app/components/ConstructeurSelect.vue @@ -0,0 +1,218 @@ + + + +watch( + constructeurs, + (list) => { + options.value = [...list] + }, + { immediate: true } +) diff --git a/app/components/DocumentUpload.vue b/app/components/DocumentUpload.vue index 9e1bff9..e14809e 100644 --- a/app/components/DocumentUpload.vue +++ b/app/components/DocumentUpload.vue @@ -78,7 +78,7 @@ const props = defineProps({ }, maxFileSizeMb: { type: Number, - default: 100, + default: 200, }, }) diff --git a/app/components/PieceItem.vue b/app/components/PieceItem.vue index 2f56a75..10f5ee6 100644 --- a/app/components/PieceItem.vue +++ b/app/components/PieceItem.vue @@ -34,15 +34,16 @@
    Constructeur: - + {{ piece.constructeur?.name || 'Non défini' }} + + {{ [piece.constructeur?.email, piece.constructeur?.phone].filter(Boolean).join(' • ') }} + + + - {{ pieceData.constructeur || 'Non défini' }}
    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 @@ + + + + + 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 @@ -
    - {{ machineConstructeur || 'Non défini' }} +
    + {{ machine.value?.constructeur?.name || 'Non défini' }} + + {{ [machine.value?.constructeur?.email, machine.value?.constructeur?.phone].filter(Boolean).join(' • ') }} + +
    @@ -350,7 +353,7 @@