feat(intrants): frontend API clients + Pinia stores
This commit is contained in:
28
frontend/src/api/achats.ts
Normal file
28
frontend/src/api/achats.ts
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
// frontend/src/api/achats.ts
|
||||||
|
import client from './client'
|
||||||
|
|
||||||
|
export interface AchatIntrant {
|
||||||
|
id?: number
|
||||||
|
categorie: string // terreau | engrais | traitement | autre
|
||||||
|
nom: string
|
||||||
|
marque?: string
|
||||||
|
boutique_nom?: string
|
||||||
|
boutique_url?: string
|
||||||
|
prix?: number
|
||||||
|
poids?: string
|
||||||
|
date_achat?: string
|
||||||
|
dluo?: string
|
||||||
|
notes?: string
|
||||||
|
jardin_id?: number
|
||||||
|
plantation_id?: number
|
||||||
|
tache_id?: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export const achatsApi = {
|
||||||
|
list: (params?: { categorie?: string; jardin_id?: number }) =>
|
||||||
|
client.get<AchatIntrant[]>('/api/achats', { params }).then(r => r.data),
|
||||||
|
get: (id: number) => client.get<AchatIntrant>(`/api/achats/${id}`).then(r => r.data),
|
||||||
|
create: (a: Partial<AchatIntrant>) => client.post<AchatIntrant>('/api/achats', a).then(r => r.data),
|
||||||
|
update: (id: number, a: Partial<AchatIntrant>) => client.put<AchatIntrant>(`/api/achats/${id}`, a).then(r => r.data),
|
||||||
|
delete: (id: number) => client.delete(`/api/achats/${id}`),
|
||||||
|
}
|
||||||
32
frontend/src/api/fabrications.ts
Normal file
32
frontend/src/api/fabrications.ts
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
// frontend/src/api/fabrications.ts
|
||||||
|
import client from './client'
|
||||||
|
|
||||||
|
export interface Ingredient {
|
||||||
|
nom: string
|
||||||
|
quantite: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Fabrication {
|
||||||
|
id?: number
|
||||||
|
type: string // compost | decoction | purin | autre
|
||||||
|
nom: string
|
||||||
|
ingredients?: Ingredient[]
|
||||||
|
date_debut?: string
|
||||||
|
date_fin_prevue?: string
|
||||||
|
statut?: string // en_cours | pret | utilise | echec
|
||||||
|
quantite_produite?: string
|
||||||
|
notes?: string
|
||||||
|
jardin_id?: number
|
||||||
|
plantation_id?: number
|
||||||
|
tache_id?: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export const fabricationsApi = {
|
||||||
|
list: (params?: { type?: string; statut?: string; jardin_id?: number }) =>
|
||||||
|
client.get<Fabrication[]>('/api/fabrications', { params }).then(r => r.data),
|
||||||
|
get: (id: number) => client.get<Fabrication>(`/api/fabrications/${id}`).then(r => r.data),
|
||||||
|
create: (f: Partial<Fabrication>) => client.post<Fabrication>('/api/fabrications', f).then(r => r.data),
|
||||||
|
update: (id: number, f: Partial<Fabrication>) => client.put<Fabrication>(`/api/fabrications/${id}`, f).then(r => r.data),
|
||||||
|
updateStatut: (id: number, statut: string) => client.patch<Fabrication>(`/api/fabrications/${id}/statut`, { statut }).then(r => r.data),
|
||||||
|
delete: (id: number) => client.delete(`/api/fabrications/${id}`),
|
||||||
|
}
|
||||||
28
frontend/src/stores/achats.ts
Normal file
28
frontend/src/stores/achats.ts
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
// frontend/src/stores/achats.ts
|
||||||
|
import { defineStore } from 'pinia'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
import { achatsApi, type AchatIntrant } from '@/api/achats'
|
||||||
|
|
||||||
|
export const useAchatsStore = defineStore('achats', () => {
|
||||||
|
const achats = ref<AchatIntrant[]>([])
|
||||||
|
const loading = ref(false)
|
||||||
|
|
||||||
|
async function fetchAll(params?: { categorie?: string }) {
|
||||||
|
loading.value = true
|
||||||
|
try { achats.value = await achatsApi.list(params) }
|
||||||
|
finally { loading.value = false }
|
||||||
|
}
|
||||||
|
|
||||||
|
async function create(a: Partial<AchatIntrant>) {
|
||||||
|
const created = await achatsApi.create(a)
|
||||||
|
achats.value.unshift(created)
|
||||||
|
return created
|
||||||
|
}
|
||||||
|
|
||||||
|
async function remove(id: number) {
|
||||||
|
await achatsApi.delete(id)
|
||||||
|
achats.value = achats.value.filter(a => a.id !== id)
|
||||||
|
}
|
||||||
|
|
||||||
|
return { achats, loading, fetchAll, create, remove }
|
||||||
|
})
|
||||||
35
frontend/src/stores/fabrications.ts
Normal file
35
frontend/src/stores/fabrications.ts
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
// frontend/src/stores/fabrications.ts
|
||||||
|
import { defineStore } from 'pinia'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
import { fabricationsApi, type Fabrication } from '@/api/fabrications'
|
||||||
|
|
||||||
|
export const useFabricationsStore = defineStore('fabrications', () => {
|
||||||
|
const fabrications = ref<Fabrication[]>([])
|
||||||
|
const loading = ref(false)
|
||||||
|
|
||||||
|
async function fetchAll(params?: { type?: string; statut?: string }) {
|
||||||
|
loading.value = true
|
||||||
|
try { fabrications.value = await fabricationsApi.list(params) }
|
||||||
|
finally { loading.value = false }
|
||||||
|
}
|
||||||
|
|
||||||
|
async function create(f: Partial<Fabrication>) {
|
||||||
|
const created = await fabricationsApi.create(f)
|
||||||
|
fabrications.value.unshift(created)
|
||||||
|
return created
|
||||||
|
}
|
||||||
|
|
||||||
|
async function updateStatut(id: number, statut: string) {
|
||||||
|
const updated = await fabricationsApi.updateStatut(id, statut)
|
||||||
|
const idx = fabrications.value.findIndex(f => f.id === id)
|
||||||
|
if (idx !== -1) fabrications.value[idx] = updated
|
||||||
|
return updated
|
||||||
|
}
|
||||||
|
|
||||||
|
async function remove(id: number) {
|
||||||
|
await fabricationsApi.delete(id)
|
||||||
|
fabrications.value = fabrications.value.filter(f => f.id !== id)
|
||||||
|
}
|
||||||
|
|
||||||
|
return { fabrications, loading, fetchAll, create, updateStatut, remove }
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user